-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrun_two_contracts.py
More file actions
110 lines (92 loc) · 5.26 KB
/
run_two_contracts.py
File metadata and controls
110 lines (92 loc) · 5.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# // SPDX-License-Identifier: MIT
# pragma solidity ^0.8.0;
# contract DataContract {
# mapping (address => uint256) public balanceOf;
# uint public a;
# function setBlance(address _address, uint256 v) public {
# balanceOf[_address] = v;
# }
# }
# contract ControlContract {
# mapping (address => uint256) public tmp;
# DataContract dataContract;
# DataContract dataContract1;
# constructor(address _dataContractAddr, address _dataContractAddr1) public {
# dataContract = DataContract(_dataContractAddr);
# dataContract1 = DataContract(_dataContractAddr1);
# }
# function set(uint256 value) public {
# dataContract.setBlance(msg.sender, value);
# tmp[msg.sender] = value + 10;
# }
# }
# >>> DataContract[0].selectors
# {
# '0x0dbe671f': "a",
# '0x1e10f2fe': "setBlance",
# '0x70a08231': "balanceOf"
# }
# >>> DataContract[0]
# <DataContract Contract '0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87'>
# >>> ControlContract[0].selectors
# {
# '0x23e46965': "tmp",
# '0x60fe47b1': "set"
# }
# >>> ControlContract[0]
# <ControlContract Contract '0x602C71e4DAC47a042Ee7f46E0aee17F94A3bA0B6'>
import binascii
from eth_utils import keccak
from simple_evm import VM
# ADDRESS = b'\x85\x82\xa2\x89\x02\xb9\xae\x93\xfc\x03\xdd\xb4\xae\xae\xe1\x8e\x85\x93\x12\xc1'
SENDER = b'\xae\x03\x02\x18\x87\xc2\x22\x37\x6f\x12\xca\xf0\x21\x44\xa1\x2f\x19\x19\x92\xcf'
# code_hex = '60806040526004361061006c5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166312065fe08114610071578063455259cb14610098578063858af522146100ad57806395dd7a55146100c2578063afc874d2146100d9575b600080fd5b34801561007d57600080fd5b506100866100ee565b60408051918252519081900360200190f35b3480156100a457600080fd5b506100866100f3565b3480156100b957600080fd5b506100866100f7565b3480156100ce57600080fd5b506100d76100fc565b005b3480156100e557600080fd5b506100d7610139565b333190565b3a90565b602a90565b6000805b7f80000000000000000000000000000000000000000000000000000000000000008110156101355760003b9150600101610100565b5050565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c776179732072657665727473000000000000000000000000000000000000604482015290519081900360640190fd00a165627a7a72305820645df686b4a16d5a69fc6d841fc9ad700528c14b35ca5629e11b154a9d3dff890029'
# code_bytes = binascii.unhexlify(code_hex)
# msg = {
# 'data': b'\x12\x06\x5f\xe0',
# 'value': 0,
# 'origin': SENDER,
# 'sender': SENDER,
# 'address': ADDRESS
# }
DataContract_address = binascii.unhexlify('0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87'[2:])
DataContract_bytecode = binascii.unhexlify('608060405234801561001057600080fd5b50600436106100415760003560e01c80630dbe671f146100465780631e10f2fe1461006157806370a082311461008d575b600080fd5b61004f60015481565b60405190815260200160405180910390f35b61008b61006f3660046100c9565b6001600160a01b03909116600090815260208190526040902055565b005b61004f61009b3660046100f3565b60006020819052908152604090205481565b80356001600160a01b03811681146100c457600080fd5b919050565b600080604083850312156100dc57600080fd5b6100e5836100ad565b946020939093013593505050565b60006020828403121561010557600080fd5b61010e826100ad565b939250505056fea2646970667358221220127768432cefecef3619dddf057861162bbc9450dfe22c7fc1b9d1a4ebe3e69d64736f6c634300080c0033')
ControlContract_address = binascii.unhexlify('0x602C71e4DAC47a042Ee7f46E0aee17F94A3bA0B6'[2:])
ControlContract_bytecode = binascii.unhexlify('608060405234801561001057600080fd5b50600436106100365760003560e01c806323e469651461003b57806360fe47b11461006d575b600080fd5b61005b610049366004610106565b60006020819052908152604090205481565b60405190815260200160405180910390f35b61008061007b366004610136565b610082565b005b600154604051630f08797f60e11b8152336004820152602481018390526001600160a01b0390911690631e10f2fe90604401600060405180830381600087803b1580156100ce57600080fd5b505af11580156100e2573d6000803e3d6000fd5b5050505080600a6100f3919061014f565b3360009081526020819052604090205550565b60006020828403121561011857600080fd5b81356001600160a01b038116811461012f57600080fd5b9392505050565b60006020828403121561014857600080fd5b5035919050565b6000821982111561017057634e487b7160e01b600052601160045260246000fd5b50019056fea26469706673582212208b013b41f8166b47dbc08f30f25223028150b461310c2aa963e934a1d8fbf66d64736f6c634300080c0033')
state = {
DataContract_address: {
"balance": 0,
"nonce": 0,
'code': DataContract_bytecode,
"storage": {
keccak(b'\x00'*12+SENDER+b'\x00'*32): binascii.unhexlify(b'0000000000000000000000000000000000000000000000000000000000000010')
}
},
ControlContract_address: {
"balance": 0,
"nonce": 0,
'code': ControlContract_bytecode,
"storage": {}
},
SENDER: {
"balance": 100000000000000000,
"nonce": 0,
"storage": {}
}
}
msg = {
# 'data': binascii.unhexlify('0x70a08231'[2:])+b'\x00'*12+SENDER, # 'balanceOf'
'data': binascii.unhexlify('0x1e10f2fe'[2:])+b'\x00'*12+SENDER + b'\x00'*31+b'\x01', # 'setBlance'
# 'value': int.from_bytes(SENDER, 'big'),
'value': 0,
'origin': SENDER,
'sender': SENDER,
'address': DataContract_address
}
m = VM(state, msg)
pc = None
while pc != m.pc:
pc = m.pc
r = m.step()
if r:
print("return value", r)