이 더 리 움 거래 (tx) 분석
실례 분석
계약 코드
pragma solidity ^0.4.11;
contract Test{
uint public c;
function add(uint _a, uint _b) public{
c = _a+_b;
}
function sub1() public{
c = c - 1;
}
}
컴 파일 후 바이트 코드
{
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50610115806100206000396000f3006080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806372a099b7146058578063771602f714606c578063c3da42b81460a0575b600080fd5b348015606357600080fd5b50606a60c8565b005b348015607757600080fd5b50609e600480360381019080803590602001909291908035906020019092919050505060d6565b005b34801560ab57600080fd5b5060b260e3565b6040518082815260200191505060405180910390f35b600160005403600081905550565b8082016000819055505050565b600054815600a165627a7a72305820d174b95459e0d9e0d7ea005561d1bcdbc285ed0058890c75f69862ba7c428df90029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x115 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x53 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x72A099B7 EQ PUSH1 0x58 JUMPI DUP1 PUSH4 0x771602F7 EQ PUSH1 0x6C JUMPI DUP1 PUSH4 0xC3DA42B8 EQ PUSH1 0xA0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x6A PUSH1 0xC8 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x9E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0xD6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0xB2 PUSH1 0xE3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x1 PUSH1 0x0 SLOAD SUB PUSH1 0x0 DUP2 SWAP1 SSTORE POP JUMP JUMPDEST DUP1 DUP3 ADD PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd1 PUSH21 0xB95459E0D9E0D7EA005561D1BCDBC285ED0058890C PUSH22 0xF69862BA7C428DF90029000000000000000000000000 ",
"sourceMap": "26:161:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26:161:0;;;;;;;"
}
그 중에서 object 와 opcodes 는 대응 하 는 것 이다. 예 를 들 어 60 대응 은 operation PUSH 1 이 고 계약 컴 파일 된 바이트 코드 는 한 그룹의 operation 이다.
계약 배치
var testContract = web3.eth.contract([{"constant":false,"inputs":[],"name":"sub1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_a","type":"uint256"},{"name":"_b","type":"uint256"}],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"c","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
var test = testContract.new(
{
from: web3.eth.accounts[0],
data: '0x608060405234801561001057600080fd5b50610115806100206000396000f3006080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806372a099b7146058578063771602f714606c578063c3da42b81460a0575b600080fd5b348015606357600080fd5b50606a60c8565b005b348015607757600080fd5b50609e600480360381019080803590602001909291908035906020019092919050505060d6565b005b34801560ab57600080fd5b5060b260e3565b6040518082815260200191505060405180910390f35b600160005403600081905550565b8082016000819055505050565b600054815600a165627a7a72305820d174b95459e0d9e0d7ea005561d1bcdbc285ed0058890c75f69862ba7c428df90029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
계약 배 치 는 사실 하나의 contract 대상 을 예화 하고 data 의 값 을 Code 속성 에 설정 하 는 것 이다.
contraAddress: 0x5e72914535f202659083db3a02c984188fa26e9f
from: 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
to: Test.(constructor)
gas: 3000000
transaction cost: 126381
execution cost: 55505
hash : 0xc2abcb19d477b2fa475b981c08d5389139e9a584ad06e1c89c49d294c2c15e78
input :0x608060405234801561001057600080fd5b50610115806100206000396000f3006080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806372a099b7146058578063771602f714606c578063c3da42b81460a0575b600080fd5b348015606357600080fd5b50606a60c8565b005b348015607757600080fd5b50609e600480360381019080803590602001909291908035906020019092919050505060d6565b005b34801560ab57600080fd5b5060b260e3565b6040518082815260200191505060405180910390f35b600160005403600081905550565b8082016000819055505050565b600054815600a165627a7a72305820d174b95459e0d9e0d7ea005561d1bcdbc285ed0058890c75f69862ba7c428df90029
계약 을 만 든 tx 에서 input 필드 는 계약 의 바이트 코드, 즉 명령 배열 에 대응 합 니 다.
함수 호출
from:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
to:0x5e72914535f202659083db3a02c984188fa26e9f
gas:3000000
transaction cost: 41918
execution cost: 41918
hash: 0xc7f4f67e2101b716f299e639580a85d3fae2b2412a61d57337251334e4b38510
input: 0x771602f700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002
decoded input :{
"uint256 _a": "1",
"uint256 _b": "2"
}
logs:[][]
value:0 wei
그 중에서 input 필드 는 호출 할 함수 서명 의 네 개의 바이트 (771602 f7) 와 대응 하 는 매개 변수 (1, 2) 에 대응 합 니 다.
from:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
to:0x5e72914535f202659083db3a02c984188fa26e9f
gas:3000000
transaction cost: 26625
execution cost: 5353
hash: 0x4aeb198977b1658e46a099d8ca181d96912a86aff510f0d1ba496e7821e067a7
input: 0x72a099b7
decoded input :{
"uint256 _a": "1",
"uint256 _b": "2"
}
logs:[][]
value:0 wei
그 중에서 input 필드 는 호출 할 계약 함수 에 서명 하 는 네 개의 바이트 (72a 099 b7) 입 니 다.
함수 호출 에 대해 Call 은 해당 하 는 Code 를 읽 고 순서대로 해석 합 니 다. Code 에 서 는 모든 Public 서명 함수 표지 (4 바이트) push 를 스 택 에 넣 습 니 다.그 다음 에 input 에서 함수 의 서명 표지 (앞의 4 바이트) 를 호출 하여 Code 와 일치 하고 일치 한 후에 해당 하 는 opcode 로 이동 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.