diff --git a/src/Nethermind/Directory.Packages.props b/src/Nethermind/Directory.Packages.props index 6b405f92b29..7bf34ecfeb5 100644 --- a/src/Nethermind/Directory.Packages.props +++ b/src/Nethermind/Directory.Packages.props @@ -44,6 +44,7 @@ + diff --git a/src/Nethermind/Nethermind.Evm.Test/BlsAddG1PrecompileTests.cs b/src/Nethermind/Nethermind.Evm.Test/BlsAddG1PrecompileTests.cs index 476f5aaf356..0eec6c75280 100644 --- a/src/Nethermind/Nethermind.Evm.Test/BlsAddG1PrecompileTests.cs +++ b/src/Nethermind/Nethermind.Evm.Test/BlsAddG1PrecompileTests.cs @@ -17,13 +17,21 @@ public class BlsG1AddPrecompileTests [Test] public void Test() { + IPrecompile precompile = G1AddPrecompile.Instance; + foreach ((byte[] input, ReadOnlyMemory expectedResult) in Inputs) { - IPrecompile precompile = G1AddPrecompile.Instance; (ReadOnlyMemory output, bool success) = precompile.Run(input, MuirGlacier.Instance); output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); success.Should().BeTrue(); } + + foreach ((byte[] input, ReadOnlyMemory expectedResult) in BadInputs) + { + (ReadOnlyMemory output, bool success) = precompile.Run(input, MuirGlacier.Instance); + output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); + success.Should().BeFalse(); + } } /// @@ -131,5 +139,13 @@ public void Test() { Bytes.FromHexString("00000000000000000000000000000000150b75e9e9c03ada40b607f3d648bd6c40269aba3a1a992986dc005c9fde80bb1605266add0819641a0ca702d67bceed00000000000000000000000000000000083b43df032654f2dce90c8049ae4872a39f9cd860f08512930f43898e0f1e5625a5620818788797f3ca68134bc27d220000000000000000000000000000000012dae9aee13ed6ad52fe664bf7d2d0a1f134f0951d0d7ce5184e223bde164f6860967f9aaaa44fa6654d77d026c52d2a000000000000000000000000000000000f71889d64ec2f7da7319994883eb8bd1c753e6cdd3495036b630c35f07118a1bc10568c411ecbdf468a9cdaa9b4811b"), Bytes.FromHexString("000000000000000000000000000000000275b8efb3a3e43e2a24d0cda238154520f0a2b265f168bfc502b9cd4a07b930756961ae7e4fe3f01a5473d36ce3356200000000000000000000000000000000113403d5a968f01ba127dd8ef6c8d7b783a10d039a6b69c617032eba7122e9297f3ce2360c829ae64fdc9794695bf173") }, { Bytes.FromHexString("000000000000000000000000000000000cba419694214e95a3605a9b748854d16c8e6e1ee151c907487d8189acfac1361b790a5e78f43593152027295adf8df400000000000000000000000000000000110813ff6e0ddf3427e2a514d3f0bfbadcaf9dbf039e0f93fb9643d1e62bc2469fe84cd9ff0d585bdd1037255bbe54850000000000000000000000000000000004e9dd69012ab596b5d3f1f8e4593b448685fcec4ab3394008178b137b762ddf9150cbb8dbb74c8af45bd8baab9a6c4f000000000000000000000000000000001132b66a2127885774062732127951f051c9c3c9b5aba02406e3f3cd4ecfe2dbf6614ebaca3bfe9efbe4f6e5b15ba0f5"), Bytes.FromHexString("000000000000000000000000000000000594c808954bb930bd038806500c9e3fd6460a83554e945baeeec2354a3805f046c76aea62c249080f16ae8e70f8fa6b00000000000000000000000000000000046924a32fb3f2df9a52615e45eeea2fa3ac0e2ccd38458194ada6b4d993ecdc0f441e41d0ea37599254a06aef68b9ae") }, { Bytes.FromHexString("000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b50000000000000000000000000000000017a81b957a12adf474a2913e8636f169ea9cd10be62c16b88f95f5caf661f158a032a9f7d249fdf2765caa1564bed0570000000000000000000000000000000017fbf2abc62dc2678b65d509e19c9c9c5d961c72565649a078da8dff98be6236ef314e9ff8022f639ff565353345c230"), Bytes.FromHexString("00000000000000000000000000000000002c8bc5f39b2c9fea01372429e92a9c945fad152da67174f4e478fdead734d50f6e2da867c235f1f2f11bdfee67d2a7000000000000000000000000000000000c1dd27aad9f5d48c4824da3071daedf0c7a0e2a0b0ed39c50c9d25e61334a9c96765e049542ccaa00e0eccb316eec08") }, + // additional + { Bytes.FromHexString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"), Bytes.FromHexString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAA9") }, + }; + + private static readonly Dictionary> BadInputs = new() + { + { Bytes.FromHexString("00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), Array.Empty() }, + { Bytes.FromHexString("0000000000000000000000000000000031f2e5916b17be2e71b10b4292f558e727dfd7d48af9cbc5087f0ce00dcca27c8b01e83eaace1aefb539f00adb2271660000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21"), Array.Empty() }, }; } diff --git a/src/Nethermind/Nethermind.Evm.Test/BlsMulG1PrecompileTests.cs b/src/Nethermind/Nethermind.Evm.Test/BlsMulG1PrecompileTests.cs index c69db929061..26efd4d3724 100644 --- a/src/Nethermind/Nethermind.Evm.Test/BlsMulG1PrecompileTests.cs +++ b/src/Nethermind/Nethermind.Evm.Test/BlsMulG1PrecompileTests.cs @@ -17,13 +17,21 @@ public class BlsG1MulPrecompileTests [Test] public void Test() { + IPrecompile precompile = G1MulPrecompile.Instance; + foreach ((byte[] input, ReadOnlyMemory expectedResult) in Inputs) { - IPrecompile precompile = G1MulPrecompile.Instance; (ReadOnlyMemory output, bool success) = precompile.Run(input, MuirGlacier.Instance); output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); success.Should().BeTrue(); } + + foreach ((byte[] input, ReadOnlyMemory expectedResult) in BadInputs) + { + (ReadOnlyMemory output, bool success) = precompile.Run(input, MuirGlacier.Instance); + output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); + success.Should().BeFalse(); + } } /// @@ -131,5 +139,13 @@ public void Test() { Bytes.FromHexString("00000000000000000000000000000000150b75e9e9c03ada40b607f3d648bd6c40269aba3a1a992986dc005c9fde80bb1605266add0819641a0ca702d67bceed00000000000000000000000000000000083b43df032654f2dce90c8049ae4872a39f9cd860f08512930f43898e0f1e5625a5620818788797f3ca68134bc27d22d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e125"), Bytes.FromHexString("0000000000000000000000000000000012cf2bcb79668067b7a265672ca614405868cf189ee9789b9e1e3186d231176dab5fea86cc5865392db8c75fc5d124c900000000000000000000000000000000121bf40feea00e151b718157b8c024f126762d84cff20aac08e7f2a027ab88b33e134a410c2af279a39618f7d21482a0") }, { Bytes.FromHexString("000000000000000000000000000000000cba419694214e95a3605a9b748854d16c8e6e1ee151c907487d8189acfac1361b790a5e78f43593152027295adf8df400000000000000000000000000000000110813ff6e0ddf3427e2a514d3f0bfbadcaf9dbf039e0f93fb9643d1e62bc2469fe84cd9ff0d585bdd1037255bbe5485041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b"), Bytes.FromHexString("0000000000000000000000000000000013a530f94e7600820dbd8aabefde2acb8b3c74e833457102fbd297317eb532c0622636ef9e9376fac1637dc745fe895000000000000000000000000000000000139eb14d3b69be977413c832bfda234348186d46fe177154e34fe204f62ac79f4b0f59bbef39b0676d81ea42a0946fb3") }, { Bytes.FromHexString("000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b57cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf"), Bytes.FromHexString("000000000000000000000000000000000bf700422a382546a74376b0292f3a49ceff5597f0d2b726b1ff099bcda7ba92238a21db12eff5c314a29dd2387bec850000000000000000000000000000000005e22e3c772f3634b1ccf4e311241977eb20e7269540ef22d379de26ab80c58461dfa3b67848e0d584fb11de1917949a") }, + // additional + { Bytes.FromHexString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") }, + { Bytes.FromHexString("000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b50000000000000000000000000000000000000000000000000000000000000000"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") } + }; + + private static readonly Dictionary> BadInputs = new() + { + { Bytes.FromHexString("1000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000002"), Array.Empty() }, }; } diff --git a/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG1PrecompileTests.cs b/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG1PrecompileTests.cs index 367ed602bdb..627ebd8c53c 100644 --- a/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG1PrecompileTests.cs +++ b/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG1PrecompileTests.cs @@ -19,7 +19,7 @@ public void Test() { foreach ((byte[] input, ReadOnlyMemory expectedResult) in Inputs) { - IPrecompile precompile = G1MultiExpPrecompile.Instance; + IPrecompile precompile = G1MultiMulPrecompile.Instance; (ReadOnlyMemory output, bool success) = precompile.Run(input, MuirGlacier.Instance); output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); success.Should().BeTrue(); @@ -131,5 +131,7 @@ public void Test() { Bytes.FromHexString("0000000000000000000000000000000008d9cb39df5b28781d33d996039da8c94cd810bb85aa5868008b4267ad2a8670924d4b3ad7898b33689aab2211bb9bdc00000000000000000000000000000000007a8a6f888722e4717acbfc42ef1907206db31603c403e0a8c1ac0af9b37e63124d4645a506265487e5f9eda09c8baf85431a1df7678e49ee049b75ea968ca255ef456dd58cce57b64edffac1ac223c000000000000000000000000000000000db6af04eccb3ceedc11378406a26613aebbbc2201a9ea2089848c7af3b34e46a3421d5704242c4b333f72180f6baa0200000000000000000000000000000000105f40c8b702f0989a9e20f72ff6a4f7310d81787e87638c33a61985f02116e106218d64976d50bcc61cf5bcbbff7c9eb6ccbc0b600f11f1b89061d94c6fbdc9b1d389244fb29a5d140dab8842d44eaa000000000000000000000000000000000a77e39abdc9d64d72ea4b321e3310a145feaa5d342bc1a5b16c0143dd01caeda4f18909acccb3cb5b43ad999a94f91b0000000000000000000000000000000016fc4a4f6b488fd1f45a158d941d7aeb5d431821589ee845c64eb198ff10931d586f8a0678237be2a394f5976d895bc854dfe31190469897c30ac3736ab166220dd3702df5bc897835347713d03a8d04000000000000000000000000000000000d0ddfc05bc9f89eed488752d64698bf00633c83cc37931d95a599d6be6e4c5d611a4151839133e86f74bb91aed1703b000000000000000000000000000000000be3dbea501c822730ab0176f64903931aa46b0179c59556ee7e1ba54605ed8da2eafed7eb2254a7ddc34e553a9b6d59eff1ceff9e5184dd9fea44da4f07529823dc9b100f776cef6f6881120f7de11a0000000000000000000000000000000004d6f288744016f15b21da736283af2ed1f45df12067a3a70391f66fff3ce3953a51169eba6288cabd84ffe7f597c9fc000000000000000000000000000000000f6556a63def531a940269b073ea98be79558d832123dd681bb4446d4c11e2fed59a2f97904797abb07ba53e0d48e923b273e4c6266c1f5cf022902fe1310d2191af91c47995486342bc61cd361eab850000000000000000000000000000000013e692a13e79c734f3758780fbdabff86fe5936bf6c60f2f155ec4d1c49cdefb97dc02c1f1e4280c5ebb055914d93f9d00000000000000000000000000000000060898a9365ae49697e5ac23e320261eda04d818c5f1153f647844b1910bb3430d3c06df9a64af8ff9dd25c18cbfa79d1342b5cd4ad3179f406941ef6ea15d0aecdf9f6d96dc334c39b7dca89d256d4f000000000000000000000000000000000a2a4d92ad63dade4d666ea949dd64d5886eaa3c7ce466677356ce9f65520591c1aab590b48e9fe1eaa0f0f3e306cefc0000000000000000000000000000000002a2bfc836409b33bbe078a5f89c5142411bde621e9117ddf9f81f37bd546c3e2ba94975ab4652fa0858d5a2361592715b36620f65ed84fc0bb344b4b73f4eba4b1680a47b28b47f6d10f9ee8239812500000000000000000000000000000000075d3ebb18437feb21f94ad5e2ce96cbaea2f6d68885483ed54ee67f2dbcf8cfa39f405afb46e45d08cb804a7aee3b8e000000000000000000000000000000000d42851366ed4694730b7c58450c3f9ebd365f15fa4dfa3fd226d180aaa921a0d897278506ede76b85decddc9580a365249ca9bcf879a770b0a054422a6ea97ae795118ae45532c1523c842696de6d17000000000000000000000000000000001722e05d33728260ebf5e4b48104cb2c89b4bc3073767e56fda373bc0e29261c9a5c53e5768b453b116494c1109cba2000000000000000000000000000000000030e4da8620007236b89103b215e54751ba2f2dce19b0304997f450791880ad34f3e43cc4e6852aa599fd65ef72dd9a5c014a0aa616e809b674390b4553bf2d9bf325e73d3a935eba94488dddee4e895000000000000000000000000000000000c4e7e44e8e0387bd99311343d2ff3a080ddad557c8639aad64c4f6e47d64f48b91f9de2e33b4b9c182a87efce5d4e0e000000000000000000000000000000000e7cb49fd7aca3daef3c0329c950c832e1d007f21a4f950f367eb37b5d7433f5d6f1ab1c206232b2ee32137b56b53967ab722a1c20f068b6955a44073914c418a082345796912ca634e79983a24ec4bb0000000000000000000000000000000014026b8dae20a1913ecb45359e9ceb317137244e16a036ac760b47363f2d389ef6cb12cd5f5fb9e8e31ccd39bf114f8b000000000000000000000000000000000f07f9e76789dd937b85e02a9c346f81e87637bd03bd5f98a9b18ad6d109100b540aaadf1fec048530bcfa35dbb5b8ae8b314f83cc3ad501caa44b4c3ca8cf68c70ff6920f445d3a7ada212b6a19ba3e000000000000000000000000000000000a0249c354052094cae5a3d77313360a8956839af614184696b5b7fbd2af6555c6ae14a150220f01d624484b9096eaa700000000000000000000000000000000043098df38ab37f42175cc9f9fa9ecbde75bb344776ed078632b3d8bbfbf04103adde27ef0d361177bb3814cbb8bc54994ffab83099c69845cc87727d459ae300a5725ec53176424ab0ec8bd3f80eaff0000000000000000000000000000000011e90effb7ae193b47afffe6fcaa0a28c358222cbb087ce479b7fe88d25386c5a9c9527899d7633eaaed9d982d3ed4e100000000000000000000000000000000174877f80e5e9daf2cc219545ce67b904319f75c0284e41552662512727c1e05b364364c4c8835c1c9c6fe028ae45895b1d80be637e2abd98d0433150e14b629d98fc0918c7dfc179204669ab465e90300000000000000000000000000000000170e754e54f64090c4c7520bfed82665b44728904092fe3a4fb2fd2d3667ccd4ecb796e5ed9fc4dafd315c0b6dc22b86000000000000000000000000000000001081e62ee7c502159f7a8e28c5ee45fb7fc5b301f3a081899bce10096c74d1bf7834d12cb7fb1301b986e9c6f7501d53e670a57ce4dcfa680e60ef33ba99c437e4fdb160ea1012de36f4b59613a6af85000000000000000000000000000000001434584d8d1cb34eb29fd1c95871f218f4dc46f8b2ddabafdc7049e88f54fa4b80c88960a76411e365aa65cbf77f01ce000000000000000000000000000000000e4e2e1318c5907a07a7ff154b07e959d681a69c066585ba046b8889d417d01c503b32a924500944d43e68d7da8da35d54a999fdf391d3944318c54680e69b58ce3778683b6f2c607d64450ed32c6d89000000000000000000000000000000000945a9d0603a3bd0278fce30f0cf97274319a760291fea5aee143c364cc0bc60e59dcd1093aca1a3ef64696ec47845e1000000000000000000000000000000000a77cc690d55763a94aa48c210610833427ed3176b6dca184598755f539359bc7302f8dc2cc941d447d9b5b68fa716b70563ae7b444cca7ebaba36b8d59aaa5c0e6c1454a4a2907866247e752e640a7d"), Bytes.FromHexString("000000000000000000000000000000000ac708f97c9e9fef4482af7b95c59c2ce6b8826f6b046b5a29ee2224ad66648a8d1f9959ff434c77394199fbe75780db000000000000000000000000000000000983fb55837062305d7fbcfe8c76cce1c431067a97392923720a6c4f963839d7d2661e2a8dacad1f151f505748239798") }, { Bytes.FromHexString("000000000000000000000000000000000ae003001e3173dbd17f4d6598fcdaba9966f1e22a06ce747f7d2a06b2bd37579d093242a4940bd816ced07ec1917365000000000000000000000000000000000b27db470845f285c792da64e870b818a7598fb820313e075ec72e78f59f3903cb0860b749bfc67540a8bc80e844a8de5b59d128b5ac47106b4114cf225dceb621d177141ef5783943f40a54ad94e9900000000000000000000000000000000018a33b2c2f1ea187672612b51c8dfdd9e86674df58ff4f77ff3f71628e7aafbb80ad22f34ab4203c42bd39a4f73c3d6d0000000000000000000000000000000017c3a68d8782a479ba9aa829e3f261a3e1b832595fe3922d800349bdc2bf58e0c1b523eb0924bf0996e38aa83267f570a057c0405e24b7373f67197b2109b633a02589711b6a92ff49ca024f893d7ecc0000000000000000000000000000000015347adf6539116167ee71557b78d8fe13373512ca7d8d365179e25ae8ed2c6a65e1f643cb0ed677a2f44eab809d5b640000000000000000000000000000000002360dbbe0b7f8e97f6aec4b20a7e6525d83056975a4228901b4f19259c9ff2d2ee00da9bb9085232fdf843e5d305561677b05905180182427efeb848b2ba2eafbabc7519ab33db14de0746afb6071910000000000000000000000000000000005b62380515d49aa1427800077a11a8f01ff00fe7df53a13a9266910e4038167ab747bbd0705fc25ae2cb0e2451c893c0000000000000000000000000000000008de7bcad1c67d7f1fb5cfb9d20ac2134006618ce0d22f4120f5396bf8164c0effb0e3ebba7959e9dde757973080a9cc53e7f69582f4c106ee5bfccba1d5f557736c1b75b6e3777cfde47d552e6bdcac00000000000000000000000000000000185bee837e3212323dc40fd471ed9a1a58f2aebfcf7f07ab761d40bc1ed77b385a134c99385d07e75c5f8c51d6496482000000000000000000000000000000000d7d42e4e18040da671799f981d404085fed490182d397685498e80967cb9c080a766d5c8822152d78920fb388b979f534c87bfb629b817e7ab97def7400b0a83e47af8d628787ff814733fdf34ba8d50000000000000000000000000000000012961da3be1ecc774fc9df2dcd87c337ee50a99df7c4821fe08da7327276a24d754be95b6e916d5c63926b6e44b74310000000000000000000000000000000000e44d11949fe33bc3a0ddfcc74c5b0fa79cebfc0d4a00a574ad7659c7a5e72c728ae4ee031af57e9135a3eabd93686edbebb60069acf431e1671e3d00e4da0d70fa11ed4099b21d45a2b811f99dd9cca000000000000000000000000000000000f03c013d5554584c2030ea02cb451ae508fe6dcba72bf7c49cb47a25d3d65eabb2fe043b9ea90e03571aa7b64be8b11000000000000000000000000000000001479789662864eabf677d2a541e48e5ce70f35a2cd6c0a476d4179d02955a51123e75c650888e514aecc85d67781c8c18b1ee2765e762f1b8c2451270cd5a755758fd733d7922a537aa9f1fd7d0c959600000000000000000000000000000000139bf8fb623dd156a3fcc46eca51e61155cf58e2dfe8edfe717effdd4418c833db7fde2031ef27edb4a70f9d60d67440000000000000000000000000000000000c352a16159eeca4dc9a86601973c02e39f2a11c8a0955ad52236d7e46dbc405147258ea8558505bef0f09ba92527c76d5009fd559714d5692de5500ec8cae9c04ae1ab1c7c6e08c8738ef22da19ceca0000000000000000000000000000000005b8c4c2782a2a2a3abe4f99e60db6ff4179399aef4b9e305fe037e1a14a4c03ff59be1e91f55e5bf316356bbaf876af000000000000000000000000000000000eae605cef3beee4a176a0589f2676b3e212edcd7ac5834ece3066bbbb587bdb6bbe46663acfd9d8aba2251a238004106330c755ef708d8eb129475785f24be9e7836385ac918c60ad36e80e2f3281b8000000000000000000000000000000001038258f67b0097ec51adee244cc15d63c4d3bf1b3b3e64ef8ae6ac15a7c4195fe97bfe8c5a42981a2463ed1b39032de000000000000000000000000000000000a6f27fc1f2dca48f6e26456de5d9fb840e4ed3fd9ff12372e51130d7c439f4ceb4fa929da2dfa3ca271d34e9aa0985ec2431888d05cae840dde4c26911db1893659fdc345d5433556d9bf75e51fe374000000000000000000000000000000000373fbfebce5c599172ab017e8f4f9813b0e6aef3031faf61c336aa7d6b64c8986827a27605b476bfc1057a0388f864d00000000000000000000000000000000079ec2c41547d98277c60dc46a61ddda51c9df65a8ad2d0a64d483eb245986de36eea2509cf7949c5fb05a77f9cf3bacc9a72369cda74e5c86c6559cbc4f4db1b3ab24c5150c7decea862ede3c02c505000000000000000000000000000000000d50821953bbbdb494e48c59c940c5f2ac2b902f4c2ba2b2ad50960a51ed7eb1a9d592bb903a03b0b90d8817d10848ba000000000000000000000000000000000bf0898bd20e08205aa218e529db578d5118ae411159ed372eb8968cd773ebb1619f92107d2948020bb3c721ea63159dc2f50989b04fc29c4c4a0090fb11e860c15f89a66f3bb8281e4678ba63ff3f9a0000000000000000000000000000000006bab55b7648be3eaec947694311289f17258876d74a7d92f22b7807d007fe142a71210684593b1aabf74579eb1b1c17000000000000000000000000000000001016b28dadfe9b65d86a1f843f7ff4b774eab74431b68b079527c2387ee6cac69e95ca564346fc54237edd3d2d31f6ed9fc9abf1c76ff11ab538f46ce768ba597eb5f2f63073ec67e8de10aa1d666720000000000000000000000000000000000c0d5ae44a0863ef3d6d32f1d8f32f2c5b89112652e2e3d6ce620479882fafd73cd3627f9f11315020c8fc9341c7fb4800000000000000000000000000000000197067de9d61733dc0367d91f55a57ae268d5e7babe7882c1fbcf03cc38de7a2dc41acfa16bac0ae63418fc349b9471cd4167723682bc0e7476797b3be5e14b8de3e4e23b4ca33c50a2096cda8766dd7000000000000000000000000000000000c3964c79741fe8093ccf2f3d118b33897a18d920ca242ae153118bc17bf0102fd19a9e4000698b256930a2f415305180000000000000000000000000000000003ce4a6877879ee56299ed27f634571126d9f8ca8ccb1e67100064e7efb435cacb1ada74d7c7529b495957ce7a5dfe709644c3727f78dd12811092190d5d10adcd5b9fc581dd783c97d4e7b5130f309a0000000000000000000000000000000018e6260c0cd6cf806ee82a047c51a85e0d7023883cfb05993ee81220e0871b122c12e65bb99b20787322d93b82089e98000000000000000000000000000000000d5b66fc46b7fb60fe8efb6659bbe948c6776d7780633f007123c5c49f5fbe7e3defc0f3d896333d0ca01244f2b6effe0df9846c84354ab7f947caca7800e12e38d8e6651527e6831f4d8b1bd66c4f3d"), Bytes.FromHexString("000000000000000000000000000000000c7aa8aaa848c068104b88d0757551612285327ba5fbe35ccb4eacb1bc96a341786e4548f5f86f6ded789b712a4be74b0000000000000000000000000000000015c9aefc358834f21ec85092cd69df37e0036ea6ddf23a3ca052a669446b183e5340ec7ce894ff6575f5e6531947c84a") }, { Bytes.FromHexString("0000000000000000000000000000000004acd4cb6bcfed3219c3aee9368feeb58d77a7ec81d19bea11402015f4bd0ee2d7afd86fa7ae9dd320910ca28eb6d98f0000000000000000000000000000000009fe1b0094c0c2ae80a3c5accfed5d212ce39f867aa2150b781c193a0053aecb04d06e005fbfa0a24595e5968d024be18a71abe11a893fce872f6b8a020b6d84241df03eb934b50cbf3571df4800a8330000000000000000000000000000000018cf9bf39549c35e94211b4e2d0a0157d73e1ce8a17cd724eb33c38281dac07e12eec61b27b440b220c4f21915a73a52000000000000000000000000000000000fca6d956989db84dcfe58b0310fc21b5bdc82a32838c8d9cae912d683dd9c67f68e15b3fbf9d7b430ba239c8904fdd2bbf28e5bca314391550d3a0fce50b1220965860e72c8c3865a2d4c599d31d3f1000000000000000000000000000000001897956bc232fd5a9b0ed1b533bebef8ddd9e97002513eec71d67ce1086ba8473f2c013af7d8ac548290453d9f71bd5a000000000000000000000000000000000796da5c8ac165d416c8fa36d84e11bcaa80c1bbfe18efde4b4b2c71d6d00fa24f3d51eac312cad9e854f094dcb6ec7458b208a6845aeb2bf31999042c59b7b130a7ce5297e88023953b1aef63616fe4000000000000000000000000000000000302240769257e92899da03fcc4abe1ad3944b74c3046e790e4e950f2958426b5fdc691401a1c8a531f42185d382fe5b000000000000000000000000000000000053750b58b6d2fbacae94e22b397261e541eb4abf4715b3f528dbfc3388122918b1b4b506f2fef89ea936efdef0105b3b53b6cf9e0ce1661c4960283be790abf956c2d6433529b8f3a32b92b227aebe000000000000000000000000000000000168a635a14f61734372f4bdd2fd564d77afa8588e1828d88c4c90bb50f57473b2c20585dc0e93726b84e73c61f29ef1000000000000000000000000000000000e6e92355e59304ad35b1dbfbb98db803d5fadabdef4fb1b2a54080ec9a33a7147ebb4d5219acabd949337bebbffa793b049228435ade4c4c565e65f39f13a84c747c312afcdaff352560b9fb3cfebcc000000000000000000000000000000001797bf2ac9b490cd43a346fdc64bfb22301a0a0e371bb4df8ec02342b4fcc99af43b4735665c6b1386fa04a3dc5406e3000000000000000000000000000000000fcc20f4aec04b7896ddfd86f58c2e1e9dc6f863ec3b477572c073c0f4fb07ee8dc0d5a843321446445b6e7846fbc5d556197f5ad17062d2ecbdc8887bcdd32e5ed4c48cefd9e14d622a0b800d9703300000000000000000000000000000000013ddb8ff149222a5a0a997c0b89aeee36a6ff2540de3cba8bfe6a2a64fb505f13ad956a3882082ab85bfbe72f3a3a6b600000000000000000000000000000000102c1a1085f60cd5326966a2dda0872290e1658002ff3ed95c47cc0345565076bdecdeab7082bcfb439cf7f3e445faaf721d9d7fe10104cafcad71307e785321ab87b2b69593535caecbf0e166cfda5b00000000000000000000000000000000189515e637d404ce6db58d24774609cf946074aa22066d808dc022824a26b381bf09148005c61156a976154b025d71c90000000000000000000000000000000009102e313c4517cdd3d07a66e0013eeafc996c21fbf5f0f3e7d232ad5adb781cce1657bd5750193cfc0357ff55bd012a461531ecb61365908019c1e8074a4c322df2b356eea3f3eea9aa1e0e1fc5525e0000000000000000000000000000000002e166e475ff083faad64667b683e546b2358f945b8656f9c2f3f6e87a40dc3fc087dd94874bec1c4bd5929b7c96024a00000000000000000000000000000000022bb4ba4be638d8c14a16c94522c41cd3b3ad917daa454f820b8fa35e5a48c676266feece6986e8fe920b2a5e43e4b3569c1c1ae2d18bbe36ed50db1bf30957802b09a982fbed49d4968815552e010d0000000000000000000000000000000004947bd8ea8cc3b116fb7320c573fff0f107913c18cfdba2e7e9a4c8715e334a431156f384548508df8950d681163aee0000000000000000000000000000000001e9e7494c295248184503344b8ac7bfcff41a4561de03d78691ac47980f14aa47c1eaa3cca80103f0f2ba14a2842aea2061d33b2f7e786effbd2e93101a56ba1bb62c1a773a08b72ca82f5183bea35b0000000000000000000000000000000004789b01538cfc54cad0e99538e874d13eaa7f07199af29d460927c3e622c74e0bb4185afa12c53446f56033348c332f00000000000000000000000000000000154291a8bdefbc91445ef1fe123f326b8aad652c8c54502920d4dfa912c2f42d784fbc5a16d08468d2d6ee56e7e8eaa24129b150752d2d5551a622231ab067931678454aaeb23f76168219406f0d50ee00000000000000000000000000000000029048f227fe8d1b7247a82cfd3e1b4b60cdce6b52de42c4b96641bf8fc5ba9b077e33bd4c4fce9a51b63a6a2451b427000000000000000000000000000000000c83518e1b7700d68966d592cb2e3295a2db5226eb6fef972c8a84721d1e49a30e4a8ee3494ed4bbcd2a6877e1ba597d366c32d5d3c132f32a6ac3cfe1dabb649c59ae224338f747ad98b193e83467290000000000000000000000000000000003e96431aae4330d3d204093b7af21343ace4f1960de951eeaebea51e778b1fee43ecddc46667d096edbc5ff4735586400000000000000000000000000000000183a282f4b0513be661b1b38eb5f02b51aadc591745e0bd5d2d4e5545739e26470a9ec20d78ec284268d9c54c8e4f7b6d997516cac28a3968ac6946b5bffaace0856a52e38fdcca11ddfa16cf5a568f5000000000000000000000000000000000904c85edd36dfa18ddb4e1809607708142f3c0861570f2bc8fff14c462675661f2111c10a01557fb21f7f38957bdd840000000000000000000000000000000012a3a37f34ebb23d4c9268ec9e1d53aed4747aaace497695e6ea8fdbdedd58031cb479003e8bec0d14aa1d062fa30f2ce881ec65fdc2f58e46d3ee45a06d0c5ac844ee5b62872c7ba21f6b48621a337100000000000000000000000000000000148532bffbbf8bb1688f6448854214b4273b9d5adf132aa9142c1605d1882879678b6cc70638713b9438532d427f447c0000000000000000000000000000000010971ee30d83719e10e91aad3f1f201fe35ba1a057531b1905bca3a8391a3786cd077ee0f104305eafb3c94f4546da9edcd9b95e49473277a665ca0f9a8309df9ed6ee4f25d803aa967fb8f688273e65000000000000000000000000000000000f73574aa5a06ea569de88e48fcb96e822039af296684933c1b417dde95e08d2ac9c6ad4d525b0734e24807ee99ba88a000000000000000000000000000000000523deae09e75121a6d89b45161f69f0733a9e43d88d8527a03cca8cc126aeb7a680cfaf291554403723e20440b79437334582482a9038ab906880e43a4a9d39e73b6c63604eba0c8f6399eb5c288638"), Bytes.FromHexString("000000000000000000000000000000000db91871e4cd84b3b58216b6c2e77a9521f3080182e78d3f66fe33f313013f06aec2dc5a6d483f35fadebde873bff9490000000000000000000000000000000003b9685de062b09b9e277ad5cd664d28af59064448af2b1b2b2357df6fc88e3ee7e0ac837100e0b7593944e8db43ab0f") }, + // additional + { Bytes.FromHexString("0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") }, }; } diff --git a/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG2PrecompileTests.cs b/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG2PrecompileTests.cs index 135695b884a..3914ae8e860 100644 --- a/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG2PrecompileTests.cs +++ b/src/Nethermind/Nethermind.Evm.Test/BlsMultiMulG2PrecompileTests.cs @@ -19,7 +19,7 @@ public void Test() { foreach ((byte[] input, ReadOnlyMemory expectedResult) in Inputs) { - IPrecompile precompile = G2MultiExpPrecompile.Instance; + IPrecompile precompile = G2MultiMulPrecompile.Instance; (ReadOnlyMemory output, bool success) = precompile.Run(input, Instance); output.ToArray().Should().BeEquivalentTo(expectedResult.ToArray()); success.Should().BeTrue(); diff --git a/src/Nethermind/Nethermind.Evm.Test/BlsParingPrecompileTests.cs b/src/Nethermind/Nethermind.Evm.Test/BlsPairingPrecompileTests.cs similarity index 99% rename from src/Nethermind/Nethermind.Evm.Test/BlsParingPrecompileTests.cs rename to src/Nethermind/Nethermind.Evm.Test/BlsPairingPrecompileTests.cs index 18869c3536a..f717785b44f 100644 --- a/src/Nethermind/Nethermind.Evm.Test/BlsParingPrecompileTests.cs +++ b/src/Nethermind/Nethermind.Evm.Test/BlsPairingPrecompileTests.cs @@ -128,5 +128,7 @@ public void Test() { Bytes.FromHexString("0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000001") }, { Bytes.FromHexString("0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a7"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000001") }, { Bytes.FromHexString("000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000001") }, + // additional + { Bytes.FromHexString("0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be"), Bytes.FromHexString("0000000000000000000000000000000000000000000000000000000000000001") }, }; } diff --git a/src/Nethermind/Nethermind.Evm/CodeInfoRepository.cs b/src/Nethermind/Nethermind.Evm/CodeInfoRepository.cs index 3d9c4e04af1..1dd64dabe4d 100644 --- a/src/Nethermind/Nethermind.Evm/CodeInfoRepository.cs +++ b/src/Nethermind/Nethermind.Evm/CodeInfoRepository.cs @@ -81,10 +81,10 @@ private static FrozenDictionary InitializePrecompiledCon [G1AddPrecompile.Address] = new(G1AddPrecompile.Instance), [G1MulPrecompile.Address] = new(G1MulPrecompile.Instance), - [G1MultiExpPrecompile.Address] = new(G1MultiExpPrecompile.Instance), + [G1MultiMulPrecompile.Address] = new(G1MultiMulPrecompile.Instance), [G2AddPrecompile.Address] = new(G2AddPrecompile.Instance), [G2MulPrecompile.Address] = new(G2MulPrecompile.Instance), - [G2MultiExpPrecompile.Address] = new(G2MultiExpPrecompile.Instance), + [G2MultiMulPrecompile.Address] = new(G2MultiMulPrecompile.Instance), [PairingPrecompile.Address] = new(PairingPrecompile.Instance), [MapToG1Precompile.Address] = new(MapToG1Precompile.Instance), [MapToG2Precompile.Address] = new(MapToG2Precompile.Instance), @@ -183,9 +183,9 @@ private class CachedPrecompile( public long BaseGasCost(IReleaseSpec releaseSpec) => precompile.BaseGasCost(releaseSpec); - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => precompile.DataGasCost(inputData, releaseSpec); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => precompile.DataGasCost(inputData, releaseSpec); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { PreBlockCaches.PrecompileCacheKey key = new(address, inputData); if (!cache.TryGetValue(key, out (ReadOnlyMemory, bool) result)) diff --git a/src/Nethermind/Nethermind.Evm/Nethermind.Evm.csproj b/src/Nethermind/Nethermind.Evm/Nethermind.Evm.csproj index 8f6c31d198f..8e7b1a629a8 100644 --- a/src/Nethermind/Nethermind.Evm/Nethermind.Evm.csproj +++ b/src/Nethermind/Nethermind.Evm/Nethermind.Evm.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Blake2FPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Blake2FPrecompile.cs index c3bdb41bc1a..f8b096da06d 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Blake2FPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Blake2FPrecompile.cs @@ -21,7 +21,7 @@ public class Blake2FPrecompile : IPrecompile public long BaseGasCost(IReleaseSpec releaseSpec) => 0; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { if (inputData.Length != RequiredInputLength) { @@ -39,7 +39,7 @@ public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseS return rounds; } - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { if (inputData.Length != RequiredInputLength) { diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsConst.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsConst.cs new file mode 100644 index 00000000000..6587e354ee4 --- /dev/null +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsConst.cs @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using System.Linq; + +namespace Nethermind.Evm.Precompiles.Bls; + +public static class BlsConst +{ + public const int LenFr = 32; + public const int LenFp = 64; + public const int LenFpTrimmed = 48; + public const int LenFpPad = LenFp - LenFpTrimmed; + public const int LenG1 = 2 * LenFp; + public const int LenG1Trimmed = 2 * LenFpTrimmed; + public const int LenG2 = 4 * LenFp; + public const int LenG2Trimmed = 4 * LenFpTrimmed; + public static readonly byte[] BaseFieldOrder = [0x1a, 0x01, 0x11, 0xea, 0x39, 0x7f, 0xe6, 0x9a, 0x4b, 0x1b, 0xa7, 0xb6, 0x43, 0x4b, 0xac, 0xd7, 0x64, 0x77, 0x4b, 0x84, 0xf3, 0x85, 0x12, 0xbf, 0x67, 0x30, 0xd2, 0xa0, 0xf6, 0xb0, 0xf6, 0x24, 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab]; + public static readonly ReadOnlyMemory G1Inf = Enumerable.Repeat(0, 128).ToArray(); + public static readonly ReadOnlyMemory G2Inf = Enumerable.Repeat(0, 256).ToArray(); +} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsExtensions.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsExtensions.cs index 6be72e4e0b5..e81aa564d78 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsExtensions.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/BlsExtensions.cs @@ -1,10 +1,131 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only +using System; +using G1 = Nethermind.Crypto.Bls.P1; +using G2 = Nethermind.Crypto.Bls.P2; + namespace Nethermind.Evm.Precompiles.Bls; -public static class BlsParams +public static class BlsExtensions { - public const int LenFr = 32; - public const int LenFp = 64; + public static bool TryDecodeRaw(this G1 p, ReadOnlySpan raw) + { + if (raw.Length != BlsConst.LenG1) + { + return false; + } + + if (!ValidRawFp(raw[..BlsConst.LenFp]) || !ValidRawFp(raw[BlsConst.LenFp..])) + { + return false; + } + + p.Point.Clear(); + + ReadOnlySpan fp0 = raw[BlsConst.LenFpPad..BlsConst.LenFp]; + ReadOnlySpan fp1 = raw[(BlsConst.LenFp + BlsConst.LenFpPad)..]; + + bool isInfinity = !fp0.ContainsAnyExcept((byte)0) && !fp1.ContainsAnyExcept((byte)0); + if (isInfinity) + { + return true; + } + + p.Decode(fp0, fp1); + if (!p.OnCurve()) + { + return false; + } + + return true; + } + + public static ReadOnlyMemory EncodeRaw(this G1 p) + { + if (p.IsInf()) + { + return BlsConst.G1Inf; + } + + byte[] raw = new byte[BlsConst.LenG1]; + ReadOnlySpan trimmed = p.Serialize(); + trimmed[..BlsConst.LenFpTrimmed].CopyTo(raw.AsSpan()[BlsConst.LenFpPad..BlsConst.LenFp]); + trimmed[BlsConst.LenFpTrimmed..].CopyTo(raw.AsSpan()[(BlsConst.LenFp + BlsConst.LenFpPad)..]); + return raw; + } + + public static bool TryDecodeRaw(this G2 p, ReadOnlySpan raw) + { + if (raw.Length != BlsConst.LenG2) + { + return false; + } + + if (!ValidRawFp(raw[..BlsConst.LenFp]) || + !ValidRawFp(raw[BlsConst.LenFp..(2 * BlsConst.LenFp)]) || + !ValidRawFp(raw[(2 * BlsConst.LenFp)..(3 * BlsConst.LenFp)]) || + !ValidRawFp(raw[(3 * BlsConst.LenFp)..])) + { + return false; + } + + p.Point.Clear(); + + ReadOnlySpan fp0 = raw[BlsConst.LenFpPad..BlsConst.LenFp]; + ReadOnlySpan fp1 = raw[(BlsConst.LenFp + BlsConst.LenFpPad)..(2 * BlsConst.LenFp)]; + ReadOnlySpan fp2 = raw[(2 * BlsConst.LenFp + BlsConst.LenFpPad)..(3 * BlsConst.LenFp)]; + ReadOnlySpan fp3 = raw[(3 * BlsConst.LenFp + BlsConst.LenFpPad)..]; + + bool isInfinity = !fp0.ContainsAnyExcept((byte)0) + && !fp1.ContainsAnyExcept((byte)0) + && !fp2.ContainsAnyExcept((byte)0) + && !fp3.ContainsAnyExcept((byte)0); + + if (isInfinity) + { + return true; + } + + p.Decode(fp0, fp1, fp2, fp3); + if (!p.OnCurve()) + { + return false; + } + + return true; + } + + public static ReadOnlyMemory EncodeRaw(this G2 p) + { + if (p.IsInf()) + { + return BlsConst.G2Inf; + } + + byte[] raw = new byte[BlsConst.LenG2]; + ReadOnlySpan trimmed = p.Serialize(); + trimmed[..BlsConst.LenFpTrimmed].CopyTo(raw.AsSpan()[(BlsConst.LenFp + BlsConst.LenFpPad)..]); + trimmed[BlsConst.LenFpTrimmed..(2 * BlsConst.LenFpTrimmed)].CopyTo(raw.AsSpan()[BlsConst.LenFpPad..BlsConst.LenFp]); + trimmed[(2 * BlsConst.LenFpTrimmed)..(3 * BlsConst.LenFpTrimmed)].CopyTo(raw.AsSpan()[(3 * BlsConst.LenFp + BlsConst.LenFpPad)..]); + trimmed[(3 * BlsConst.LenFpTrimmed)..].CopyTo(raw.AsSpan()[(2 * BlsConst.LenFp + BlsConst.LenFpPad)..]); + return raw; + } + + public static bool ValidRawFp(ReadOnlySpan fp) + { + if (fp.Length != BlsConst.LenFp) + { + return false; + } + + // check that padding bytes are zeroes + if (fp[..BlsConst.LenFpPad].ContainsAnyExcept((byte)0)) + { + return false; + } + + // check that fp < base field order + return fp[BlsConst.LenFpPad..].SequenceCompareTo(BlsConst.BaseFieldOrder.AsSpan()) < 0; + } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1AddPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1AddPrecompile.cs index eee075c7808..87d7806d1f4 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1AddPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1AddPrecompile.cs @@ -4,7 +4,8 @@ using System; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; + +using G1 = Nethermind.Crypto.Bls.P1; namespace Nethermind.Evm.Precompiles.Bls; @@ -13,7 +14,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class G1AddPrecompile : IPrecompile { - public static G1AddPrecompile Instance = new G1AddPrecompile(); + public static readonly G1AddPrecompile Instance = new(); private G1AddPrecompile() { @@ -23,18 +24,34 @@ private G1AddPrecompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 500L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 4 * BlsParams.LenFp; + const int expectedInputLength = 2 * BlsConst.LenG1; if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - Span output = stackalloc byte[2 * BlsParams.LenFp]; - bool success = Pairings.BlsG1Add(inputData.Span, output); - return success ? (output.ToArray(), true) : IPrecompile.Failure; + G1 x = new(stackalloc long[G1.Sz]); + G1 y = new(stackalloc long[G1.Sz]); + if (!x.TryDecodeRaw(inputData[..BlsConst.LenG1].Span) || !y.TryDecodeRaw(inputData[BlsConst.LenG1..].Span)) + { + return IPrecompile.Failure; + } + + if (x.IsInf()) + { + return (inputData[BlsConst.LenG1..], true); + } + + if (y.IsInf()) + { + return (inputData[..BlsConst.LenG1], true); + } + + G1 res = x.Add(y); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MulPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MulPrecompile.cs index 984caf75169..b0f520e15ae 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MulPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MulPrecompile.cs @@ -2,10 +2,9 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; +using G1 = Nethermind.Crypto.Bls.P1; namespace Nethermind.Evm.Precompiles.Bls; @@ -14,7 +13,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class G1MulPrecompile : IPrecompile { - public static G1MulPrecompile Instance = new G1MulPrecompile(); + public static readonly G1MulPrecompile Instance = new(); private G1MulPrecompile() { @@ -24,20 +23,33 @@ private G1MulPrecompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 12000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 2 * BlsParams.LenFp + BlsParams.LenFr; + const int expectedInputLength = BlsConst.LenG1 + BlsConst.LenFr; if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - Span output = stackalloc byte[2 * BlsParams.LenFp]; - bool success = SubgroupChecks.G1IsInSubGroup(inputData.Span[..(2 * BlsParams.LenFp)]) - && Pairings.BlsG1Mul(inputData.Span, output); + G1 x = new(stackalloc long[G1.Sz]); + if (!x.TryDecodeRaw(inputData[..BlsConst.LenG1].Span) || !x.InGroup()) + { + return IPrecompile.Failure; + } + + bool scalarIsInfinity = !inputData.Span[BlsConst.LenG1..].ContainsAnyExcept((byte)0); + if (scalarIsInfinity || x.IsInf()) + { + return (BlsConst.G1Inf, true); + } + + Span scalar = stackalloc byte[32]; + inputData.Span[BlsConst.LenG1..].CopyTo(scalar); + scalar.Reverse(); - return success ? (output.ToArray(), true) : IPrecompile.Failure; + G1 res = x.Mult(scalar); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiExpPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiExpPrecompile.cs deleted file mode 100644 index 81061a51d8e..00000000000 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiExpPrecompile.cs +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using System.Runtime.CompilerServices; -using Nethermind.Core; -using Nethermind.Core.Specs; -using Nethermind.Crypto; - -namespace Nethermind.Evm.Precompiles.Bls; - -/// -/// https://eips.ethereum.org/EIPS/eip-2537 -/// -public class G1MultiExpPrecompile : IPrecompile -{ - public static G1MultiExpPrecompile Instance = new G1MultiExpPrecompile(); - - private G1MultiExpPrecompile() - { - } - - public static Address Address { get; } = Address.FromNumber(0x0d); - - public long BaseGasCost(IReleaseSpec releaseSpec) => 0L; - - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) - { - int k = inputData.Length / ItemSize; - return 12000L * k * Discount.For(k) / 1000; - } - - private const int ItemSize = 160; - - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) - { - if (inputData.Length % ItemSize > 0 || inputData.Length == 0) - { - return IPrecompile.Failure; - } - - for (int i = 0; i < (inputData.Length / ItemSize); i++) - { - int offset = i * ItemSize; - if (!SubgroupChecks.G1IsInSubGroup(inputData.Span[offset..(offset + (2 * BlsParams.LenFp))])) - { - return IPrecompile.Failure; - } - } - - Span output = stackalloc byte[2 * BlsParams.LenFp]; - bool success = Pairings.BlsG1MultiExp(inputData.Span, output); - return success ? (output.ToArray(), true) : IPrecompile.Failure; - } -} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiMulPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiMulPrecompile.cs new file mode 100644 index 00000000000..4e34d7e8e49 --- /dev/null +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G1MultiMulPrecompile.cs @@ -0,0 +1,97 @@ +// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Core; +using Nethermind.Core.Specs; +using System.Threading.Tasks; +using Nethermind.Core.Collections; + +using G1 = Nethermind.Crypto.Bls.P1; + +namespace Nethermind.Evm.Precompiles.Bls; + +/// +/// https://eips.ethereum.org/EIPS/eip-2537 +/// +public class G1MultiMulPrecompile : IPrecompile +{ + public static readonly G1MultiMulPrecompile Instance = new(); + + private G1MultiMulPrecompile() + { + } + + public static Address Address { get; } = Address.FromNumber(0x0d); + + public long BaseGasCost(IReleaseSpec releaseSpec) => 0L; + + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + { + int k = inputData.Length / ItemSize; + return 12000L * k * Discount.For(k) / 1000; + } + + private const int ItemSize = 160; + + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + { + if (inputData.Length % ItemSize > 0 || inputData.Length == 0) + { + return IPrecompile.Failure; + } + + int nItems = inputData.Length / ItemSize; + + using ArrayPoolList rawPoints = new(nItems * 18, nItems * 18); + using ArrayPoolList rawScalars = new(nItems * 32, nItems * 32); + using ArrayPoolList pointDestinations = new(nItems); + + int npoints = 0; + for (int i = 0; i < nItems; i++) + { + int offset = i * ItemSize; + ReadOnlySpan rawPoint = inputData[offset..(offset + BlsConst.LenG1)].Span; + + // exclude infinity points + int dest = rawPoint.ContainsAnyExcept((byte)0) ? npoints++ : -1; + pointDestinations.Add(dest); + } + + if (npoints == 0) + { + return (BlsConst.G1Inf, true); + } + + bool fail = false; + Parallel.ForEach(pointDestinations, (dest, state, i) => + { + if (dest != -1) + { + int offset = (int)i * ItemSize; + ReadOnlySpan rawPoint = inputData[offset..(offset + BlsConst.LenG1)].Span; + ReadOnlySpan rawScalar = inputData[(offset + BlsConst.LenG1)..(offset + ItemSize)].Span; + + G1 p = new(rawPoints.AsSpan()[(dest * 18)..]); + + if (!p.TryDecodeRaw(rawPoint) || !p.InGroup()) + { + fail = true; + state.Break(); + } + + int destOffset = dest * 32; + rawScalar.CopyTo(rawScalars.AsSpan()[destOffset..]); + rawScalars.AsSpan()[destOffset..(destOffset + 32)].Reverse(); + } + }); + + if (fail) + { + return IPrecompile.Failure; + } + + G1 res = new G1().MultiMult(rawPoints.AsSpan(), rawScalars.AsSpan(), npoints); + return (res.EncodeRaw(), true); + } +} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2AddPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2AddPrecompile.cs index b5d930a7404..6b6779f91f3 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2AddPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2AddPrecompile.cs @@ -2,10 +2,10 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; + +using G2 = Nethermind.Crypto.Bls.P2; namespace Nethermind.Evm.Precompiles.Bls; @@ -14,7 +14,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class G2AddPrecompile : IPrecompile { - public static G2AddPrecompile Instance = new G2AddPrecompile(); + public static readonly G2AddPrecompile Instance = new(); private G2AddPrecompile() { @@ -24,18 +24,34 @@ private G2AddPrecompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 800L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 8 * BlsParams.LenFp; + const int expectedInputLength = 2 * BlsConst.LenG2; if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - Span output = stackalloc byte[4 * BlsParams.LenFp]; - bool success = Pairings.BlsG2Add(inputData.Span, output); - return success ? (output.ToArray(), true) : IPrecompile.Failure; + G2 x = new(stackalloc long[G2.Sz]); + G2 y = new(stackalloc long[G2.Sz]); + if (!x.TryDecodeRaw(inputData[..BlsConst.LenG2].Span) || !y.TryDecodeRaw(inputData[BlsConst.LenG2..].Span)) + { + return IPrecompile.Failure; + } + + if (x.IsInf()) + { + return (inputData[BlsConst.LenG2..], true); + } + + if (y.IsInf()) + { + return (inputData[..BlsConst.LenG2], true); + } + + G2 res = x.Add(y); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MulPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MulPrecompile.cs index e652f1aecdd..151d20b4e3f 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MulPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MulPrecompile.cs @@ -2,10 +2,10 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; + +using G2 = Nethermind.Crypto.Bls.P2; namespace Nethermind.Evm.Precompiles.Bls; @@ -14,7 +14,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class G2MulPrecompile : IPrecompile { - public static G2MulPrecompile Instance = new G2MulPrecompile(); + public static readonly G2MulPrecompile Instance = new(); private G2MulPrecompile() { @@ -24,22 +24,34 @@ private G2MulPrecompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 45000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 4 * BlsParams.LenFp + BlsParams.LenFr; + const int expectedInputLength = BlsConst.LenG2 + BlsConst.LenFr; + if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - // Span inputDataSpan = stackalloc byte[4 * BlsParams.LenFp + BlsParams.LenFr]; - // inputData.PrepareEthInput(inputDataSpan); + G2 x = new(stackalloc long[G2.Sz]); + if (!x.TryDecodeRaw(inputData[..BlsConst.LenG2].Span) || !x.InGroup()) + { + return IPrecompile.Failure; + } + + bool scalarIsInfinity = !inputData[BlsConst.LenG2..].Span.ContainsAnyExcept((byte)0); + if (scalarIsInfinity || x.IsInf()) + { + return (BlsConst.G2Inf, true); + } + + Span scalar = stackalloc byte[32]; + inputData.Span[BlsConst.LenG2..].CopyTo(scalar); + scalar.Reverse(); - Span output = stackalloc byte[4 * BlsParams.LenFp]; - return SubgroupChecks.G2IsInSubGroup(inputData.Span[..(4 * BlsParams.LenFp)]) && Pairings.BlsG2Mul(inputData.Span, output) - ? (output.ToArray(), true) - : IPrecompile.Failure; + G2 res = x.Mult(scalar); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiExpPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiExpPrecompile.cs deleted file mode 100644 index fe0bc2c797b..00000000000 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiExpPrecompile.cs +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using System.Runtime.CompilerServices; -using Nethermind.Core; -using Nethermind.Core.Specs; -using Nethermind.Crypto; - -namespace Nethermind.Evm.Precompiles.Bls; - -/// -/// https://eips.ethereum.org/EIPS/eip-2537 -/// -public class G2MultiExpPrecompile : IPrecompile -{ - public static G2MultiExpPrecompile Instance = new G2MultiExpPrecompile(); - - private G2MultiExpPrecompile() - { - } - - public static Address Address { get; } = Address.FromNumber(0x10); - - public long BaseGasCost(IReleaseSpec releaseSpec) => 0L; - - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) - { - int k = inputData.Length / ItemSize; - return 45000L * k * Discount.For(k) / 1000; - } - - private const int ItemSize = 288; - - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) - { - if (inputData.Length % ItemSize > 0 || inputData.Length == 0) - { - return IPrecompile.Failure; - } - - for (int i = 0; i < inputData.Length / ItemSize; i++) - { - int offset = i * ItemSize; - if (!SubgroupChecks.G2IsInSubGroup(inputData.Span[offset..(offset + (4 * BlsParams.LenFp))])) - { - return IPrecompile.Failure; - } - } - - Span output = stackalloc byte[4 * BlsParams.LenFp]; - return Pairings.BlsG2MultiExp(inputData.Span, output) ? (output.ToArray(), true) : IPrecompile.Failure; - } -} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiMulPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiMulPrecompile.cs new file mode 100644 index 00000000000..ddd1eea799b --- /dev/null +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/G2MultiMulPrecompile.cs @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Core; +using Nethermind.Core.Specs; +using Nethermind.Core.Collections; +using System.Threading.Tasks; + +using G2 = Nethermind.Crypto.Bls.P2; + +namespace Nethermind.Evm.Precompiles.Bls; + +/// +/// https://eips.ethereum.org/EIPS/eip-2537 +/// +public class G2MultiMulPrecompile : IPrecompile +{ + public static readonly G2MultiMulPrecompile Instance = new(); + + private G2MultiMulPrecompile() + { + } + + public static Address Address { get; } = Address.FromNumber(0x10); + + public long BaseGasCost(IReleaseSpec releaseSpec) => 0L; + + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + { + int k = inputData.Length / ItemSize; + return 45000L * k * Discount.For(k) / 1000; + } + + private const int ItemSize = 288; + + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + { + if (inputData.Length % ItemSize > 0 || inputData.Length == 0) + { + return IPrecompile.Failure; + } + + int nItems = inputData.Length / ItemSize; + + using ArrayPoolList rawPoints = new(nItems * 36, nItems * 36); + using ArrayPoolList rawScalars = new(nItems * 32, nItems * 32); + using ArrayPoolList pointDestinations = new(nItems); + + int npoints = 0; + for (int i = 0; i < nItems; i++) + { + int offset = i * ItemSize; + ReadOnlySpan rawPoint = inputData[offset..(offset + BlsConst.LenG2)].Span; + + // exclude infinity points + int dest = rawPoint.ContainsAnyExcept((byte)0) ? npoints++ : -1; + pointDestinations.Add(dest); + } + + if (npoints == 0) + { + return (BlsConst.G2Inf, true); + } + + bool fail = false; + Parallel.ForEach(pointDestinations, (dest, state, i) => + { + if (dest != -1) + { + int offset = (int)i * ItemSize; + ReadOnlySpan rawPoint = inputData[offset..(offset + BlsConst.LenG2)].Span; + ReadOnlySpan rawScalar = inputData[(offset + BlsConst.LenG2)..(offset + ItemSize)].Span; + + G2 p = new(rawPoints.AsSpan()[(dest * 36)..]); + + if (!p.TryDecodeRaw(rawPoint) || !p.InGroup()) + { + fail = true; + state.Break(); + } + + int destOffset = dest * 32; + rawScalar.CopyTo(rawScalars.AsSpan()[destOffset..]); + rawScalars.AsSpan()[destOffset..(destOffset + 32)].Reverse(); + } + }); + + if (fail) + { + return IPrecompile.Failure; + } + + G2 res = new G2().MultiMult(rawPoints.AsSpan(), rawScalars.AsSpan(), npoints); + + return (res.EncodeRaw(), true); + } +} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG1Precompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG1Precompile.cs index 8a9cd615367..63517445eab 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG1Precompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG1Precompile.cs @@ -2,10 +2,9 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; +using G1 = Nethermind.Crypto.Bls.P1; namespace Nethermind.Evm.Precompiles.Bls; @@ -14,7 +13,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class MapToG1Precompile : IPrecompile { - public static MapToG1Precompile Instance = new MapToG1Precompile(); + public static readonly MapToG1Precompile Instance = new MapToG1Precompile(); private MapToG1Precompile() { @@ -24,17 +23,22 @@ private MapToG1Precompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 5500L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 64; + const int expectedInputLength = BlsConst.LenFp; if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - Span output = stackalloc byte[128]; - return Pairings.BlsMapToG1(inputData.Span, output) ? (output.ToArray(), true) : IPrecompile.Failure; + G1 res = new G1(stackalloc long[G1.Sz]); + if (!BlsExtensions.ValidRawFp(inputData.Span)) + { + return IPrecompile.Failure; + } + res.MapTo(inputData[BlsConst.LenFpPad..BlsConst.LenFp].Span); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG2Precompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG2Precompile.cs index e1eb684cd7b..87a77d75bf0 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG2Precompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/MapToG2Precompile.cs @@ -2,10 +2,10 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; + +using G2 = Nethermind.Crypto.Bls.P2; namespace Nethermind.Evm.Precompiles.Bls; @@ -14,7 +14,7 @@ namespace Nethermind.Evm.Precompiles.Bls; /// public class MapToG2Precompile : IPrecompile { - public static MapToG2Precompile Instance = new MapToG2Precompile(); + public static readonly MapToG2Precompile Instance = new(); private MapToG2Precompile() { @@ -24,17 +24,22 @@ private MapToG2Precompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 75000; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { - const int expectedInputLength = 2 * BlsParams.LenFp; + const int expectedInputLength = 2 * BlsConst.LenFp; if (inputData.Length != expectedInputLength) { return IPrecompile.Failure; } - Span output = stackalloc byte[4 * BlsParams.LenFp]; - return Pairings.BlsMapToG2(inputData.Span, output) ? (output.ToArray(), true) : IPrecompile.Failure; + G2 res = new G2(stackalloc long[G2.Sz]); + if (!BlsExtensions.ValidRawFp(inputData.Span[..BlsConst.LenFp]) || !BlsExtensions.ValidRawFp(inputData.Span[BlsConst.LenFp..])) + { + return IPrecompile.Failure; + } + res.MapTo(inputData[BlsConst.LenFpPad..BlsConst.LenFp].Span, inputData[(BlsConst.LenFp + BlsConst.LenFpPad)..].Span); + return (res.EncodeRaw(), true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/PairingPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/PairingPrecompile.cs index d1ae573303c..febe5c7b7ab 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/PairingPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/PairingPrecompile.cs @@ -2,10 +2,12 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Runtime.CompilerServices; using Nethermind.Core; using Nethermind.Core.Specs; -using Nethermind.Crypto; + +using G1 = Nethermind.Crypto.Bls.P1; +using G2 = Nethermind.Crypto.Bls.P2; +using GT = Nethermind.Crypto.Bls.PT; namespace Nethermind.Evm.Precompiles.Bls; @@ -15,41 +17,55 @@ namespace Nethermind.Evm.Precompiles.Bls; public class PairingPrecompile : IPrecompile { private const int PairSize = 384; + public static readonly PairingPrecompile Instance = new(); private PairingPrecompile() { } public static Address Address { get; } = Address.FromNumber(0x11); - public static PairingPrecompile Instance = new PairingPrecompile(); - public long BaseGasCost(IReleaseSpec releaseSpec) => 65000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 43000L * (inputData.Length / PairSize); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 43000L * (inputData.Length / PairSize); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { if (inputData.Length % PairSize > 0 || inputData.Length == 0) { return IPrecompile.Failure; } - for (int i = 0; i < (inputData.Length / PairSize); i++) + G1 x = new(stackalloc long[G1.Sz]); + G2 y = new(stackalloc long[G2.Sz]); + + var acc = GT.One(); + for (int i = 0; i < inputData.Length / PairSize; i++) { int offset = i * PairSize; - if (!SubgroupChecks.G1IsInSubGroup(inputData.Span[offset..(offset + (2 * BlsParams.LenFp))])) + + if (!x.TryDecodeRaw(inputData[offset..(offset + BlsConst.LenG1)].Span) || + !x.InGroup() || + !y.TryDecodeRaw(inputData[(offset + BlsConst.LenG1)..(offset + PairSize)].Span) || + !y.InGroup()) { return IPrecompile.Failure; } - offset += 2 * BlsParams.LenFp; - - if (!SubgroupChecks.G2IsInSubGroup(inputData.Span[offset..(offset + (4 * BlsParams.LenFp))])) + // x == inf || y == inf -> e(x, y) = 1 + if (x.IsInf() || y.IsInf()) { - return IPrecompile.Failure; + continue; } + + acc.Mul(new GT(y, x)); + } + + bool verified = acc.FinalExp().IsOne(); + byte[] res = new byte[32]; + if (verified) + { + res[31] = 1; } - Span output = stackalloc byte[32]; - return Pairings.BlsPairing(inputData.Span, output) ? (output.ToArray(), true) : IPrecompile.Failure; + return (res, true); } } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/SubgroupChecks.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Bls/SubgroupChecks.cs deleted file mode 100644 index 50feddba291..00000000000 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Bls/SubgroupChecks.cs +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using System; -using System.Linq; -using System.Numerics; -using System.Runtime.CompilerServices; -using Nethermind.Core.Extensions; -using Nethermind.Crypto; - -namespace Nethermind.Evm.Precompiles.Bls; - -/// -/// https://eips.ethereum.org/EIPS/eip-2537 -/// -public class SubgroupChecks -{ - internal static readonly BigInteger BlsBaseFieldOrder = new([0x1a, 0x01, 0x11, 0xea, 0x39, 0x7f, 0xe6, 0x9a, 0x4b, 0x1b, 0xa7, 0xb6, 0x43, 0x4b, 0xac, 0xd7, 0x64, 0x77, 0x4b, 0x84, 0xf3, 0x85, 0x12, 0xbf, 0x67, 0x30, 0xd2, 0xa0, 0xf6, 0xb0, 0xf6, 0x24, 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab], true, true); - internal static readonly BigInteger BlsSubgroupOrder = new([0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, 0x33, 0x39, 0xd8, 0x08, 0x09, 0xa1, 0xd8, 0x05, 0x53, 0xbd, 0xa4, 0x02, 0xff, 0xfe, 0x5b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01], true, true); - internal static readonly BigInteger Beta = new([0x5F, 0x19, 0x67, 0x2F, 0xDF, 0x76, 0xCE, 0x51, 0xBA, 0x69, 0xC6, 0x07, 0x6A, 0x0F, 0x77, 0xEA, 0xDD, 0xB3, 0xA9, 0x3B, 0xE6, 0xF8, 0x96, 0x88, 0xDE, 0x17, 0xD8, 0x13, 0x62, 0x0A, 0x00, 0x02, 0x2E, 0x01, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE], true, true); - internal static readonly BigInteger X = Normalise(new BigInteger(15132376222941642752)); - internal static readonly byte[] G1SubgroupMultiplier = (X * X % BlsSubgroupOrder).ToBigEndianByteArray(32); - internal static readonly byte[] G2SubgroupMultiplier = X.ToBigEndianByteArray(32); - internal static readonly Fp2 R = new(0, new BigInteger([0x1A, 0x01, 0x11, 0xEA, 0x39, 0x7F, 0xE6, 0x99, 0xEC, 0x02, 0x40, 0x86, 0x63, 0xD4, 0xDE, 0x85, 0xAA, 0x0D, 0x85, 0x7D, 0x89, 0x75, 0x9A, 0xD4, 0x89, 0x7D, 0x29, 0x65, 0x0F, 0xB8, 0x5F, 0x9B, 0x40, 0x94, 0x27, 0xEB, 0x4F, 0x49, 0xFF, 0xFD, 0x8B, 0xFD, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAD], true, true)); - internal static readonly Fp2 S = new(new BigInteger([0x13, 0x52, 0x03, 0xE6, 0x01, 0x80, 0xA6, 0x8E, 0xE2, 0xE9, 0xC4, 0x48, 0xD7, 0x7A, 0x2C, 0xD9, 0x1C, 0x3D, 0xED, 0xD9, 0x30, 0xB1, 0xCF, 0x60, 0xEF, 0x39, 0x64, 0x89, 0xF6, 0x1E, 0xB4, 0x5E, 0x30, 0x44, 0x66, 0xCF, 0x3E, 0x67, 0xFA, 0x0A, 0xF1, 0xEE, 0x7B, 0x04, 0x12, 0x1B, 0xDE, 0xA2], true, true), new BigInteger([0x06, 0xAF, 0x0E, 0x04, 0x37, 0xFF, 0x40, 0x0B, 0x68, 0x31, 0xE3, 0x6D, 0x6B, 0xD1, 0x7F, 0xFE, 0x48, 0x39, 0x5D, 0xAB, 0xC2, 0xD3, 0x43, 0x5E, 0x77, 0xF7, 0x6E, 0x17, 0x00, 0x92, 0x41, 0xC5, 0xEE, 0x67, 0x99, 0x2F, 0x72, 0xEC, 0x05, 0xF4, 0xC8, 0x10, 0x84, 0xFB, 0xED, 0xE3, 0xCC, 0x09], true, true)); - - [SkipLocalsInit] - public static bool G1IsInSubGroup(ReadOnlySpan p) - { - Span buf = stackalloc byte[3 * 128]; - Span mulArgs = buf[128..(2 * 128 + 32)]; - Span addArgs = buf[..(2 * 128)]; - Span res = buf[(2 * 128)..]; - - p.CopyTo(mulArgs); - G1SubgroupMultiplier.CopyTo(mulArgs[128..]); - - if (!Pairings.BlsG1Mul(mulArgs, addArgs[..128])) - { - return false; - } - - Phi(p, addArgs[128..]); - - if (!Pairings.BlsG1Add(addArgs, res)) - { - return false; - } - - return res.IndexOfAnyExcept((byte)0) == -1; - } - - [SkipLocalsInit] - public static bool G2IsInSubGroup(ReadOnlySpan p) - { - Span buf = stackalloc byte[3 * 256]; - Span mulArgs = buf[256..(2 * 256 + 32)]; - Span addArgs = buf[..(2 * 256)]; - Span res = buf[(2 * 256)..]; - - p.CopyTo(mulArgs); - G2SubgroupMultiplier.CopyTo(mulArgs[256..]); - if (!Pairings.BlsG2Mul(mulArgs, addArgs[..256])) - { - return false; - } - - Psi(p, addArgs[256..]); - - if (!Pairings.BlsG2Add(addArgs, res)) - { - return false; - } - - return res.IndexOfAnyExcept((byte)0) == -1; - } - - internal static void Phi(ReadOnlySpan p, Span res) - { - BigInteger x = new(p[..64], true, true); - x = Beta * x % BlsBaseFieldOrder; - x.ToBigEndianByteArray(64).CopyTo(res); - p[64..].CopyTo(res[64..]); - } - - internal static void Psi(ReadOnlySpan p, Span res) - { - Fp2 x = new Fp2(p[..128]).Conjugate() * R; - Fp2 y = new Fp2(p[128..]).Conjugate() * S; - x.ToBytes(res[..128]); - y.ToBytes(res[128..]); - } - - internal static BigInteger Normalise(in BigInteger x) - { - BigInteger unnormalised = x % BlsBaseFieldOrder; - return unnormalised >= 0 ? unnormalised : (BlsBaseFieldOrder + unnormalised); - } - - internal class Fp2 - { - public BigInteger c0, c1; - - public Fp2(BigInteger c0, BigInteger c1) - { - this.c0 = c0; - this.c1 = c1; - } - - public Fp2(ReadOnlySpan bytes) - { - if (bytes.Length != 128) - { - throw new Exception("Could not decode Fp2 point, incorrect length."); - } - c0 = new(bytes[..64], true, true); - c1 = new(bytes[64..], true, true); - } - - public static Fp2 operator *(Fp2 a, Fp2 b) - => new Fp2(Normalise((a.c0 * b.c0) - (a.c1 * b.c1)), Normalise((a.c1 * b.c0) + (a.c0 * b.c1))); - - public Fp2 Conjugate() - { - c1 = Normalise(-c1); - return this; - } - - public void ToBytes(Span res) - { - c0.ToBigEndianByteArray(64).CopyTo(res); - c1.ToBigEndianByteArray(64).CopyTo(res[64..]); - } - } -} diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/EcRecoverPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/EcRecoverPrecompile.cs index 93a3b7994d1..f9d41cdc221 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/EcRecoverPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/EcRecoverPrecompile.cs @@ -22,7 +22,7 @@ private EcRecoverPrecompile() public static Address Address { get; } = Address.FromNumber(1); - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; public long BaseGasCost(IReleaseSpec releaseSpec) => 3000L; @@ -30,7 +30,7 @@ private EcRecoverPrecompile() private readonly byte[] _zero31 = new byte[31]; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.EcRecoverPrecompile++; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/IPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/IPrecompile.cs index da14b92c1da..3cf1a564d62 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/IPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/IPrecompile.cs @@ -13,9 +13,9 @@ public interface IPrecompile long BaseGasCost(IReleaseSpec releaseSpec); - long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec); + long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec); - (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec); + (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec); protected static (ReadOnlyMemory, bool) Failure { get; } = (Array.Empty(), false); } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/IdentityPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/IdentityPrecompile.cs index f864bee7480..71b584012d2 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/IdentityPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/IdentityPrecompile.cs @@ -19,9 +19,9 @@ private IdentityPrecompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 15L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 3L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 3L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { return (inputData.ToArray(), true); } diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompile.cs index ee21d725029..df72af9fb97 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompile.cs @@ -40,7 +40,7 @@ public long BaseGasCost(IReleaseSpec releaseSpec) /// /// /// Gas cost of the MODEXP operation in the context of EIP2565 - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { if (!releaseSpec.IsEip2565Enabled) { @@ -88,7 +88,7 @@ private static mpz_t ImportDataToGmp(byte[] data) return result; } - private static (int, int, int) GetInputLengths(in ReadOnlyMemory inputData) + private static (int, int, int) GetInputLengths(ReadOnlyMemory inputData) { Span extendedInput = stackalloc byte[96]; inputData[..Math.Min(96, inputData.Length)].Span @@ -102,7 +102,7 @@ private static (int, int, int) GetInputLengths(in ReadOnlyMemory inputData return (baseLength, expLength, modulusLength); } - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.ModExpPrecompile++; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompilePreEip2565.cs b/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompilePreEip2565.cs index 3af18341264..cae14f37871 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompilePreEip2565.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompilePreEip2565.cs @@ -29,7 +29,7 @@ public long BaseGasCost(IReleaseSpec releaseSpec) return 0L; } - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { try { @@ -56,7 +56,7 @@ public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseS } } - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.ModExpPrecompile++; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/PointEvaluationPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/PointEvaluationPrecompile.cs index 02f4fb3a2f7..bda625a1470 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/PointEvaluationPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/PointEvaluationPrecompile.cs @@ -24,13 +24,13 @@ public class PointEvaluationPrecompile : IPrecompile public long BaseGasCost(IReleaseSpec releaseSpec) => 50000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { [SkipLocalsInit] [MethodImpl(MethodImplOptions.AggressiveInlining)] - static bool IsValid(in ReadOnlyMemory inputData) + static bool IsValid(ReadOnlyMemory inputData) { if (inputData.Length != 192) { diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Ripemd160Precompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Ripemd160Precompile.cs index 95fce1cbd81..72916147539 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Ripemd160Precompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Ripemd160Precompile.cs @@ -27,9 +27,9 @@ private Ripemd160Precompile() public long BaseGasCost(IReleaseSpec releaseSpec) => 600L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 120L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 120L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.Ripemd160Precompile++; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Secp256r1Precompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Secp256r1Precompile.cs index ed00e14a789..f269b6ce985 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Secp256r1Precompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Secp256r1Precompile.cs @@ -17,12 +17,12 @@ public class Secp256r1Precompile : IPrecompile public static Address Address { get; } = Address.FromNumber(0x100); public long BaseGasCost(IReleaseSpec releaseSpec) => 3450L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; // TODO can be optimized - Go implementation is 2-6 times faster depending on the platform. Options: // - Try to replicate Go version in C# // - Compile Go code into a library and call it via P/Invoke - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { if (inputData.Length != 160) return (null, true); diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Sha256Precompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Sha256Precompile.cs index 0e6c869ba13..36b8469aa8a 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Sha256Precompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Sha256Precompile.cs @@ -34,9 +34,9 @@ private static void InitIfNeeded() public long BaseGasCost(IReleaseSpec releaseSpec) => 60L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 12L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 12L * EvmPooledMemory.Div32Ceiling((ulong)inputData.Length); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.Sha256Precompile++; InitIfNeeded(); diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254AddPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254AddPrecompile.cs index d7d2ead270d..936960999e7 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254AddPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254AddPrecompile.cs @@ -20,9 +20,9 @@ public class Bn254AddPrecompile : IPrecompile public long BaseGasCost(IReleaseSpec releaseSpec) => releaseSpec.IsEip1108Enabled ? 150L : 500L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public unsafe (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public unsafe (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.Bn254AddPrecompile++; Span inputDataSpan = stackalloc byte[128]; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254MulPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254MulPrecompile.cs index 27ee5e6018c..3c47d072f13 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254MulPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254MulPrecompile.cs @@ -20,9 +20,9 @@ public class Bn254MulPrecompile : IPrecompile public long BaseGasCost(IReleaseSpec releaseSpec) => releaseSpec.IsEip1108Enabled ? 6000L : 40000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => 0L; - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.Bn254MulPrecompile++; Span inputDataSpan = stackalloc byte[96]; diff --git a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254PairingPrecompile.cs b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254PairingPrecompile.cs index 7c8fd01596f..e2cc9946c86 100644 --- a/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254PairingPrecompile.cs +++ b/src/Nethermind/Nethermind.Evm/Precompiles/Snarks/Bn254PairingPrecompile.cs @@ -22,9 +22,9 @@ public class Bn254PairingPrecompile : IPrecompile public long BaseGasCost(IReleaseSpec releaseSpec) => releaseSpec.IsEip1108Enabled ? 45000L : 100000L; - public long DataGasCost(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => (releaseSpec.IsEip1108Enabled ? 34000L : 80000L) * (inputData.Length / PairSize); + public long DataGasCost(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) => (releaseSpec.IsEip1108Enabled ? 34000L : 80000L) * (inputData.Length / PairSize); - public (ReadOnlyMemory, bool) Run(in ReadOnlyMemory inputData, IReleaseSpec releaseSpec) + public (ReadOnlyMemory, bool) Run(ReadOnlyMemory inputData, IReleaseSpec releaseSpec) { Metrics.Bn254PairingPrecompile++;