Tranfer to a contract address
Solidity code is like this: tranfer to itself
function testA(uint a) public payable {
//s1.set(3);
address payable aaa = address( uint160(address(this)) );
aaa.transfer(a);
}
DoEstimateGas
This is to find out the minimal gas required to execute the transaction:
SendTransaction would evaluate the gas cost by DoEstimateGas() if args.Gas == nil:
github.com/ethereum/go-ethereum/core/vm.(*EVMInterpreter).Run at interpreter.go:134
github.com/ethereum/go-ethereum/core/vm.run at evm.go:67
github.com/ethereum/go-ethereum/core/vm.(*EVM).Call at evm.go:242
github.com/ethereum/go-ethereum/core.(*StateTransition).TransitionDb at state_transition.go:218
github.com/ethereum/go-ethereum/core.ApplyMessage at state_transition.go:136
github.com/ethereum/go-ethereum/internal/ethapi.DoCall at api.go:856
github.com/ethereum/go-ethereum/internal/ethapi.DoEstimateGas.func1 at api.go:913
github.com/ethereum/go-ethereum/internal/ethapi.DoEstimateGas at api.go:922
github.com/ethereum/go-ethereum/internal/ethapi.(*SendTxArgs).setDefaults at api.go:1412
github.com/ethereum/go-ethereum/internal/ethapi.(*PublicTransactionPoolAPI).SendTransaction at api.go:1473
runtime.call256 at asm_amd64.s:542
reflect.Value.call at value.go:460
reflect.Value.Call at value.go:321
github.com/ethereum/go-ethereum/rpc.(*callback).call at service.go:206
github.com/ethereum/go-ethereum/rpc.(*handler).runMethod at handler.go:369
github.com/ethereum/go-ethereum/rpc.(*handler).handleCall at handler.go:331
github.com/ethereum/go-ethereum/rpc.(*handler).handleCallMsg at handler.go:298
github.com/ethereum/go-ethereum/rpc.(*handler).handleMsg.func1 at handler.go:139
github.com/ethereum/go-ethereum/rpc.(*handler).startCallProc.func1 at handler.go:226
runtime.goexit at asm_amd64.s:1357
- Async stack trace
github.com/ethereum/go-ethereum/rpc.(*handler).startCallProc at handler.go:222
EVM execution
In the end, the miner’s EVM would execute the transaction:
1 Code 0 PUSH1 10015 3 <nil>
1 Code 2 PUSH1 10012 3 <nil>
1 Code 4 MSTORE 10009 12 <nil>
1 Code 5 PUSH1 9997 3 <nil>
1 Code 7 CALLDATASIZE 9994 2 <nil>
1 Code 8 LT 9992 3 <nil>
1 Code 9 PUSH2 9989 3 <nil>
1 Code 12 JUMPI 9986 10 <nil>
1 Code 13 PUSH1 9976 3 <nil>
1 Code 15 CALLDATALOAD 9973 3 <nil>
1 Code 16 PUSH1 9970 3 <nil>
1 Code 18 SHR 9967 3 <nil>
1 Code 19 DUP1 9964 3 <nil>
1 Code 20 PUSH4 9961 3 <nil>
1 Code 25 EQ 9958 3 <nil>
1 Code 26 PUSH2 9955 3 <nil>
1 Code 29 JUMPI 9952 10 <nil>
1 Code 30 DUP1 9942 3 <nil>
1 Code 31 PUSH4 9939 3 <nil>
1 Code 36 EQ 9936 3 <nil>
1 Code 37 PUSH2 9933 3 <nil>
1 Code 40 JUMPI 9930 10 <nil>
1 Code 41 DUP1 9920 3 <nil>
1 Code 42 PUSH4 9917 3 <nil>
1 Code 47 EQ 9914 3 <nil>
1 Code 48 PUSH2 9911 3 <nil>
1 Code 51 JUMPI 9908 10 <nil>
1 Code 52 DUP1 9898 3 <nil>
1 Code 53 PUSH4 9895 3 <nil>
1 Code 58 EQ 9892 3 <nil>
1 Code 59 PUSH2 9889 3 <nil>
1 Code 62 JUMPI 9886 10 <nil>
1 Code 168 JUMPDEST 9876 1 <nil>
1 Code 169 PUSH2 9875 3 <nil>
1 Code 172 PUSH1 9872 3 <nil>
1 Code 174 DUP1 9869 3 <nil>
1 Code 175 CALLDATASIZE 9866 2 <nil>
1 Code 176 SUB 9864 3 <nil>
1 Code 177 PUSH1 9861 3 <nil>
1 Code 179 DUP2 9858 3 <nil>
1 Code 180 LT 9855 3 <nil>
1 Code 181 ISZERO 9852 3 <nil>
1 Code 182 PUSH2 9849 3 <nil>
1 Code 185 JUMPI 9846 10 <nil>
1 Code 190 JUMPDEST 9836 1 <nil>
1 Code 191 DUP2 9835 3 <nil>
1 Code 192 ADD 9832 3 <nil>
1 Code 193 SWAP1 9829 3 <nil>
1 Code 194 DUP1 9826 3 <nil>
1 Code 195 DUP1 9823 3 <nil>
1 Code 196 CALLDATALOAD 9820 3 <nil>
1 Code 197 SWAP1 9817 3 <nil>
1 Code 198 PUSH1 9814 3 <nil>
1 Code 200 ADD 9811 3 <nil>
1 Code 201 SWAP1 9808 3 <nil>
1 Code 202 SWAP3 9805 3 <nil>
1 Code 203 SWAP2 9802 3 <nil>
1 Code 204 SWAP1 9799 3 <nil>
1 Code 205 POP 9796 2 <nil>
1 Code 206 POP 9794 2 <nil>
1 Code 207 POP 9792 2 <nil>
1 Code 208 PUSH2 9790 3 <nil>
1 Code 211 JUMP 9787 8 <nil>
1 Code 769 JUMPDEST 9779 1 <nil>
1 Code 770 PUSH1 9778 3 <nil>
1 Code 772 ADDRESS 9775 2 <nil>
1 Code 773 SWAP1 9773 3 <nil>
1 Code 774 POP 9770 2 <nil>
1 Code 775 DUP1 9768 3 <nil>
1 Code 776 PUSH20 9765 3 <nil>
1 Code 797 AND 9762 3 <nil>
1 Code 798 PUSH2 9759 3 <nil>
1 Code 801 DUP4 9756 3 <nil>
1 Code 802 SWAP1 9753 3 <nil>
1 Code 803 DUP2 9750 3 <nil>
1 Code 804 ISZERO 9747 3 <nil>
1 Code 805 MUL 9744 5 <nil>
1 Code 806 SWAP1 9739 3 <nil>
1 Code 807 PUSH1 9736 3 <nil>
1 Code 809 MLOAD 9733 3 <nil>
1 Code 810 PUSH1 9730 3 <nil>
1 Code 812 PUSH1 9727 3 <nil>
1 Code 814 MLOAD 9724 3 <nil>
1 Code 815 DUP1 9721 3 <nil>
1 Code 816 DUP4 9718 3 <nil>
1 Code 817 SUB 9715 3 <nil>
1 Code 818 DUP2 9712 3 <nil>
1 Code 819 DUP6 9709 3 <nil>
1 Code 820 DUP9 9706 3 <nil>
1 Code 821 DUP9 9703 3 <nil>
1 Code 822 CALL 9700 9700 <nil> // Call costs 9700, after this, we have 0
2 Code 0 PUSH1 2300 3 <nil> // Got 2300 allowence from opCall
2 Code 2 PUSH1 2297 3 <nil>
2 Code 4 MSTORE 2294 12 <nil>
2 Code 5 PUSH1 2282 3 <nil>
2 Code 7 CALLDATASIZE 2279 2 <nil>
2 Code 8 LT 2277 3 <nil>
2 Code 9 PUSH2 2274 3 <nil>
2 Code 12 JUMPI 2271 10 <nil>
2 Code 74 JUMPDEST 2261 1 <nil>
2 Code 75 STOP 2260 0 <nil> // still hace 2260 left
1 Code 823 SWAP4 2260 3 <nil> // 2260 added back to caller contract
1 Code 824 POP 2257 2 <nil>
1 Code 825 POP 2255 2 <nil>
1 Code 826 POP 2253 2 <nil>
1 Code 827 POP 2251 2 <nil>
1 Code 828 ISZERO 2249 3 <nil>
1 Code 829 DUP1 2246 3 <nil>
1 Code 830 ISZERO 2243 3 <nil>
1 Code 831 PUSH2 2240 3 <nil>
1 Code 834 JUMPI 2237 10 <nil>
1 Code 844 JUMPDEST 2227 1 <nil>
1 Code 845 POP 2226 2 <nil>
1 Code 846 POP 2224 2 <nil>
1 Code 847 POP 2222 2 <nil>
1 Code 848 JUMP 2220 8 <nil>
1 Code 212 JUMPDEST 2212 1 <nil>
1 Code 213 STOP 2211 0 <nil>
0x