|
26 | 26 |
|
27 | 27 | MAX_CODE_SIZE = 24 * 1024
|
28 | 28 | KECCAK_RATE = 136
|
29 |
| -ECRECOVER_GAS_COST = 3_000 |
30 | 29 |
|
31 | 30 |
|
32 | 31 | @pytest.mark.valid_from("Cancun")
|
@@ -264,24 +263,114 @@ def test_worst_modexp(
|
264 | 263 | Environment().gas_limit,
|
265 | 264 | ],
|
266 | 265 | )
|
267 |
| -def test_worst_ecrecover( |
| 266 | +@pytest.mark.parametrize( |
| 267 | + "precompile_address,precompile_gas_cost,input,length", |
| 268 | + [ |
| 269 | + pytest.param( |
| 270 | + 0x01, |
| 271 | + 3_000, |
| 272 | + [ |
| 273 | + 0x38D18ACB67D25C8BB9942764B62F18E17054F66A817BD4295423ADF9ED98873E, |
| 274 | + 27, |
| 275 | + 0x38D18ACB67D25C8BB9942764B62F18E17054F66A817BD4295423ADF9ED98873E, |
| 276 | + 0x789D1DD423D25F0772D2748D60F7E4B81BB14D086EBA8E8E8EFB6DCFF8A4AE02, |
| 277 | + ], |
| 278 | + 32 * 4, |
| 279 | + id="ecrecover", |
| 280 | + ), |
| 281 | + pytest.param( |
| 282 | + 0x06, |
| 283 | + 150, |
| 284 | + [ |
| 285 | + 0x18B18ACFB4C2C30276DB5411368E7185B311DD124691610C5D3B74034E093DC9, |
| 286 | + 0x063C909C4720840CB5134CB9F59FA749755796819658D32EFC0D288198F37266, |
| 287 | + 0x07C2B7F58A84BD6145F00C9C2BC0BB1A187F20FF2C92963A88019E7C6A014EED, |
| 288 | + 0x06614E20C147E940F2D70DA3F74C9A17DF361706A4485C742BD6788478FA17D7, |
| 289 | + ], |
| 290 | + 32 * 4, |
| 291 | + id="bn128add", |
| 292 | + ), |
| 293 | + pytest.param( |
| 294 | + 0x07, |
| 295 | + 6_000, |
| 296 | + [ |
| 297 | + 0x1A87B0584CE92F4593D161480614F2989035225609F08058CCFA3D0F940FEBE3, |
| 298 | + 0x1A2F3C951F6DADCC7EE9007DFF81504B0FCD6D7CF59996EFDC33D92BF7F9F8F6, |
| 299 | + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, |
| 300 | + ], |
| 301 | + 32 * 4, |
| 302 | + id="bn128mul", |
| 303 | + ), |
| 304 | + pytest.param( |
| 305 | + 0x08, |
| 306 | + 45_000 + 2 * 34_000, |
| 307 | + [ |
| 308 | + 0x1C76476F4DEF4BB94541D57EBBA1193381FFA7AA76ADA664DD31C16024C43F59, |
| 309 | + 0x3034DD2920F673E204FEE2811C678745FC819B55D3E9D294E45C9B03A76AEF41, |
| 310 | + 0x209DD15EBFF5D46C4BD888E51A93CF99A7329636C63514396B4A452003A35BF7, |
| 311 | + 0x04BF11CA01483BFA8B34B43561848D28905960114C8AC04049AF4B6315A41678, |
| 312 | + 0x2BB8324AF6CFC93537A2AD1A445CFD0CA2A71ACD7AC41FADBF933C2A51BE344D, |
| 313 | + 0x120A2A4CF30C1BF9845F20C6FE39E07EA2CCE61F0C9BB048165FE5E4DE877550, |
| 314 | + 0x111E129F1CF1097710D41C4AC70FCDFA5BA2023C6FF1CBEAC322DE49D1B6DF7C, |
| 315 | + 0x103188585E2364128FE25C70558F1560F4F9350BAF3959E603CC91486E110936, |
| 316 | + 0x198E9393920D483A7260BFB731FB5D25F1AA493335A9E71297E485B7AEF312C2, |
| 317 | + 0x1800DEEF121F1E76426A00665E5C4479674322D4F75EDADD46DEBD5CD992F6ED, |
| 318 | + 0x090689D0585FF075EC9E99AD690C3395BC4B313370B38EF355ACDADCD122975B, |
| 319 | + 0x12C85EA5DB8C6DEB4AAB71808DCB408FE3D1E7690C43D37B4CE6CC0166FA7DAA, |
| 320 | + ], |
| 321 | + 32 * 12, |
| 322 | + id="bn128pairing", |
| 323 | + ), |
| 324 | + pytest.param( |
| 325 | + 0x09, |
| 326 | + 0xFFFF, |
| 327 | + [ |
| 328 | + 0x0000FFFF48C9BDF267E6096A3BA7CA8485AE67BB2BF894FE72F36E3CF1361D5F, |
| 329 | + 0x3AF54FA5D182E6AD7F520E511F6C3E2B8C68059B6BBD41FBABD9831F79217E13, |
| 330 | + 0x19CDE05B61626300000000000000000000000000000000000000000000000000, |
| 331 | + 0x0000000000000000000000000000000000000000000000000000000000000000, |
| 332 | + 0x0000000000000000000000000000000000000000000000000000000000000000, |
| 333 | + 0x0000000000000000000000000000000000000000000000000000000000000000, |
| 334 | + 0x0000000000000000000000000000000000000000000000000000000000000000, |
| 335 | + 0x0000000000000000000000000000000000000000000000000000000000000000, |
| 336 | + 0x0000000003000000000000000000000000000001000000000000000000000000, |
| 337 | + ], |
| 338 | + 213, |
| 339 | + id="blake2f", |
| 340 | + ), |
| 341 | + pytest.param( |
| 342 | + 0x0A, |
| 343 | + 50_000, |
| 344 | + [ |
| 345 | + 0x01E798154708FE7789429634053CBF9F99B619F9F084048927333FCE637F549B, |
| 346 | + 0x564C0A11A0F704F4FC3E8ACFE0F8245F0AD1347B378FBF96E206DA11A5D36306, |
| 347 | + 0x24D25032E67A7E6A4910DF5834B8FE70E6BCFEEAC0352434196BDF4B2485D5A1, |
| 348 | + 0x8F59A8D2A1A625A17F3FEA0FE5EB8C896DB3764F3185481BC22F91B4AAFFCCA2, |
| 349 | + 0x5F26936857BC3A7C2539EA8EC3A952B7873033E038326E87ED3E1276FD140253, |
| 350 | + 0xFA08E9FC25FB2D9A98527FC22A2C9612FBEAFDAD446CBC7BCDBDCD780AF2C16A, |
| 351 | + ], |
| 352 | + 192, |
| 353 | + id="point_evaluation", |
| 354 | + ), |
| 355 | + ], |
| 356 | +) |
| 357 | +def test_worst_precompile_fixed_cost( |
268 | 358 | blockchain_test: BlockchainTestFiller,
|
269 | 359 | pre: Alloc,
|
270 | 360 | fork: Fork,
|
271 | 361 | gas_limit: int,
|
| 362 | + precompile_address: Address, |
| 363 | + precompile_gas_cost: Address, |
| 364 | + input: list[int], |
| 365 | + length: int, |
272 | 366 | ):
|
273 |
| - """Test running a block with as many ECRECOVER calls as possible.""" |
| 367 | + """Test running a block filled with a precompile with fixed cost.""" |
274 | 368 | env = Environment(gas_limit=gas_limit)
|
275 | 369 |
|
276 | 370 | # Calldata
|
277 |
| - calldata = ( |
278 |
| - Op.MSTORE(0 * 32, 0x38D18ACB67D25C8BB9942764B62F18E17054F66A817BD4295423ADF9ED98873E) |
279 |
| - + Op.MSTORE(1 * 32, 27) |
280 |
| - + Op.MSTORE(2 * 32, 0x38D18ACB67D25C8BB9942764B62F18E17054F66A817BD4295423ADF9ED98873E) |
281 |
| - + Op.MSTORE(3 * 32, 0x789D1DD423D25F0772D2748D60F7E4B81BB14D086EBA8E8E8EFB6DCFF8A4AE02) |
282 |
| - ) |
| 371 | + calldata = sum([Op.MSTORE(i * 32, input) for i, input in enumerate(input)]) |
283 | 372 |
|
284 |
| - attack_block = Op.POP(Op.STATICCALL(ECRECOVER_GAS_COST, 0x1, 0, 32 * 4, 0, 0)) |
| 373 | + attack_block = Op.POP(Op.STATICCALL(precompile_gas_cost, precompile_address, 0, length, 0, 0)) |
285 | 374 | code = code_loop_precompile_call(calldata, attack_block)
|
286 | 375 | code_address = pre.deploy_contract(code=bytes(code))
|
287 | 376 |
|
|
0 commit comments