Skip to content

Commit e8f1a98

Browse files
committed
convert calldataload and calldatasize tests
1 parent 286c026 commit e8f1a98

File tree

5 files changed

+280
-1
lines changed

5 files changed

+280
-1
lines changed

converted-ethereum-tests.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
([#1236](https://github.com/ethereum/execution-spec-tests/pull/1236))
2+
GeneralStateTests/VMTests/vmTests/calldataload.json
3+
GeneralStateTests/VMTests/vmTests/calldatasize.json
4+
15
([#1056](https://github.com/ethereum/execution-spec-tests/pull/1056))
26
GeneralStateTests/VMTests/vmTests/calldatacopy.json
37

docs/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ consume cache --help
4747

4848
### 🧪 Test Cases
4949

50+
- ✨ Port [calldataload](https://github.com/ethereum/tests/blob/ae4791077e8fcf716136e70fe8392f1a1f1495fb/src/GeneralStateTestsFiller/VMTests/vmTests/calldatacopyFiller.yml) and [calldatasize](https://github.com/ethereum/tests/blob/81862e4848585a438d64f911a19b3825f0f4cd95/src/GeneralStateTestsFiller/VMTests/vmTests/calldatasizeFiller.yml) tests ([#1236](https://github.com/ethereum/execution-spec-tests/pull/1236)).
51+
5052
## [v4.1.0](https://github.com/ethereum/execution-spec-tests/releases/tag/v4.1.0) - 2025-03-11
5153

5254
### 💥 Breaking Changes

tests/frontier/opcodes/test_calldatacopy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def test_calldatacopy(
142142
"""
143143
Test `CALLDATACOPY` opcode.
144144
145-
Based on https://github.com/ethereum/tests/blob/ae4791077e8fcf716136e70fe8392f1a1f1495fb/src/GeneralStateTestsFiller/VMTests/vmTests/calldatacopyFiller.ym
145+
Based on https://github.com/ethereum/tests/blob/ae4791077e8fcf716136e70fe8392f1a1f1495fb/src/GeneralStateTestsFiller/VMTests/vmTests/calldatacopyFiller.yml
146146
"""
147147
code_address = pre.deploy_contract(code)
148148
to = pre.deploy_contract(
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
"""test `CALLDATALOAD` opcode."""
2+
3+
import pytest
4+
5+
from ethereum_test_forks import Byzantium, Fork
6+
from ethereum_test_tools import Account, Alloc, Bytecode, StateTestFiller, Transaction
7+
from ethereum_test_tools.vm.opcode import Opcodes as Op
8+
9+
10+
@pytest.mark.parametrize(
11+
"mstore,args_size,code_for_address_a,tx_data,address_a_storage",
12+
[
13+
(
14+
(Op.MSTORE8(offset=0x0, value=0x25) + Op.MSTORE8(offset=0x1, value=0x60)),
15+
0x2,
16+
(Op.PUSH1[0x0] + Op.CALLDATALOAD + Op.PUSH1[0x0] + Op.SSTORE),
17+
b"\x00",
18+
Account(
19+
storage={0x00: 0x2560000000000000000000000000000000000000000000000000000000000000}
20+
),
21+
),
22+
(
23+
(
24+
Op.MSTORE(
25+
offset=0x0,
26+
value=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
27+
)
28+
+ Op.MSTORE8(offset=0x20, value=0x23)
29+
),
30+
0x21,
31+
(Op.PUSH1[0x1] + Op.CALLDATALOAD + Op.PUSH1[0x0] + Op.SSTORE + Op.STOP),
32+
b"\x01",
33+
Account(
34+
storage={0x00: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23}
35+
),
36+
),
37+
(
38+
(
39+
Op.MSTORE(
40+
offset=0x0,
41+
value=0x123456789ABCDEF0000000000000000000000000000000000000000000000000,
42+
)
43+
+ Op.MSTORE8(offset=0x20, value=0x0)
44+
+ Op.MSTORE8(offset=0x21, value=0x24)
45+
),
46+
0x22,
47+
(Op.PUSH1[0x5] + Op.CALLDATALOAD + Op.PUSH1[0x0] + Op.SSTORE + Op.STOP),
48+
b"\x02",
49+
Account(
50+
storage={0x00: 0xBCDEF00000000000000000000000000000000000000000000000000024000000}
51+
),
52+
),
53+
],
54+
ids=[
55+
"two_bytes",
56+
"word_n_byte",
57+
"34_bytes",
58+
],
59+
)
60+
def test_calldataload(
61+
state_test: StateTestFiller,
62+
mstore: Bytecode,
63+
args_size: int,
64+
code_for_address_a: Bytecode,
65+
fork: Fork,
66+
tx_data: bytes,
67+
pre: Alloc,
68+
address_a_storage: Account,
69+
):
70+
"""
71+
Test `CALLDATALOAD` opcode.
72+
73+
Based on https://github.com/ethereum/tests/blob/ae4791077e8fcf716136e70fe8392f1a1f1495fb/src/GeneralStateTestsFiller/VMTests/vmTests/calldatacopyFiller.yml
74+
"""
75+
address_a = pre.deploy_contract(code_for_address_a)
76+
77+
address_b = pre.deploy_contract(
78+
mstore
79+
+ Op.CALL(
80+
gas=Op.SUB(Op.GAS(), 0x100),
81+
address=address_a,
82+
value=0x0,
83+
args_offset=0x0,
84+
args_size=args_size,
85+
ret_offset=0x0,
86+
ret_size=0x0,
87+
)
88+
)
89+
90+
to = pre.deploy_contract(
91+
code=(
92+
Op.ADD(0x1000, Op.CALLDATALOAD(offset=0x4))
93+
+ Op.CALL(
94+
gas=Op.SUB(Op.GAS(), 0x100),
95+
# address=Op.ADD(0x1000, Op.CALLDATALOAD(offset=0x4)),
96+
address=address_b,
97+
value=0x0,
98+
args_offset=0x0,
99+
args_size=0x0,
100+
ret_offset=0x0,
101+
ret_size=0x0,
102+
)
103+
+ Op.STOP
104+
),
105+
)
106+
107+
tx = Transaction(
108+
data=tx_data,
109+
gas_limit=100_000,
110+
gas_price=0x0A,
111+
protected=fork >= Byzantium,
112+
sender=pre.fund_eoa(),
113+
to=to,
114+
value=0x01,
115+
)
116+
post = {address_a: address_a_storage}
117+
state_test(pre=pre, post=post, tx=tx)
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
"""test `CALLDATASIZE` opcode."""
2+
3+
import pytest
4+
5+
from ethereum_test_forks import Byzantium, Fork
6+
from ethereum_test_tools import Account, Alloc, StateTestFiller, Transaction
7+
from ethereum_test_tools.vm.opcode import Opcodes as Op
8+
9+
10+
@pytest.mark.parametrize(
11+
"tx_data,storage",
12+
[
13+
(
14+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
15+
Account(storage={0x00: 0x02}),
16+
),
17+
(
18+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
19+
Account(storage={0x00: 0x11}),
20+
),
21+
(
22+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
23+
Account(storage={0x00: 0x21}),
24+
),
25+
(
26+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
27+
Account(storage={0x00: 0x31}),
28+
),
29+
(
30+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
31+
Account(storage={0x00: 0x101}),
32+
),
33+
(
34+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02",
35+
Account(storage={0x00: 0x02}),
36+
),
37+
(
38+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02",
39+
Account(storage={0x00: 0x11}),
40+
),
41+
(
42+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02",
43+
Account(storage={0x00: 0x21}),
44+
),
45+
(
46+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02",
47+
Account(storage={0x00: 0x31}),
48+
),
49+
(
50+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02",
51+
Account(storage={0x00: 0x101}),
52+
),
53+
(
54+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",
55+
Account(storage={0x00: 0x02}),
56+
),
57+
(
58+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",
59+
Account(storage={0x00: 0x11}),
60+
),
61+
(
62+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",
63+
Account(storage={0x00: 0x21}),
64+
),
65+
(
66+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",
67+
Account(storage={0x00: 0x31}),
68+
),
69+
(
70+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",
71+
Account(storage={0x00: 0x101}),
72+
),
73+
(
74+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04",
75+
Account(storage={0x00: 0x02}),
76+
),
77+
(
78+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04",
79+
Account(storage={0x00: 0x11}),
80+
),
81+
(
82+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04",
83+
Account(storage={0x00: 0x21}),
84+
),
85+
(
86+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04",
87+
Account(storage={0x00: 0x31}),
88+
),
89+
(
90+
b"\x1a\x84Q\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04",
91+
Account(storage={0x00: 0x101}),
92+
),
93+
],
94+
ids=[
95+
"data1_2",
96+
"data1_11",
97+
"data1_21",
98+
"data1_31",
99+
"data1_101",
100+
"data2_2",
101+
"data2_11",
102+
"data2_21",
103+
"data2_31",
104+
"data2_101",
105+
"data3_2",
106+
"data3_11",
107+
"data3_21",
108+
"data3_31",
109+
"data3_101",
110+
"data4_2",
111+
"data4_11",
112+
"data4_21",
113+
"data4_31",
114+
"data4_101",
115+
],
116+
)
117+
def test_calldataload(
118+
state_test: StateTestFiller,
119+
fork: Fork,
120+
tx_data: bytes,
121+
pre: Alloc,
122+
storage: Account,
123+
):
124+
"""
125+
Test `CALLDATASIZE` opcode.
126+
127+
https://github.com/ethereum/tests/blob/81862e4848585a438d64f911a19b3825f0f4cd95/src/GeneralStateTestsFiller/VMTests/vmTests/calldatasizeFiller.yml
128+
"""
129+
address = pre.deploy_contract(Op.SSTORE(key=0x0, value=Op.CALLDATASIZE))
130+
131+
to = pre.deploy_contract(
132+
code=(
133+
Op.MSTORE(offset=0x0, value=Op.SHA3(offset=0x0, size=Op.CALLDATALOAD(offset=0x24)))
134+
+ Op.CALL(
135+
gas=Op.SUB(Op.GAS(), 0x100),
136+
address=address,
137+
value=0x0,
138+
args_offset=0x0,
139+
args_size=Op.CALLDATALOAD(offset=0x4),
140+
ret_offset=0x0,
141+
ret_size=0x0,
142+
)
143+
)
144+
)
145+
146+
tx = Transaction(
147+
data=tx_data,
148+
gas_limit=100_000,
149+
gas_price=0x0A,
150+
protected=fork >= Byzantium,
151+
sender=pre.fund_eoa(),
152+
to=to,
153+
value=0x01,
154+
)
155+
post = {address: storage}
156+
state_test(pre=pre, post=post, tx=tx)

0 commit comments

Comments
 (0)