@@ -19,6 +19,7 @@ package vm
1919import (
2020 "fmt"
2121 "math/big"
22+ "reflect"
2223 "testing"
2324
2425 "github.com/ethereum/go-ethereum/common"
@@ -32,6 +33,14 @@ type precompiledTest struct {
3233 noBenchmark bool // Benchmark primarily the worst-cases
3334}
3435
36+ // precompiledFailureTest defines the input/error pairs for precompiled
37+ // contract failure tests.
38+ type precompiledFailureTest struct {
39+ input string
40+ expectedError error
41+ name string
42+ }
43+
3544// modexpTests are the test and benchmark data for the modexp precompiled contract.
3645var modexpTests = []precompiledTest {
3746 {
@@ -336,8 +345,56 @@ var bn256PairingTests = []precompiledTest{
336345 },
337346}
338347
348+ // EIP-152 test vectors
349+ var blake2FMalformedInputTests = []precompiledFailureTest {
350+ {
351+ input : "" ,
352+ expectedError : errBlake2FIncorrectInputLength ,
353+ name : "vector 0: empty input" ,
354+ },
355+ {
356+ input : "00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
357+ expectedError : errBlake2FIncorrectInputLength ,
358+ name : "vector 1: less than 213 bytes input" ,
359+ },
360+ {
361+ input : "000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
362+ expectedError : errBlake2FIncorrectInputLength ,
363+ name : "vector 2: more than 213 bytes input" ,
364+ },
365+ {
366+ input : "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002" ,
367+ expectedError : errBlake2FIncorrectFinalBlockIndicator ,
368+ name : "vector 3: malformed final block indicator flag" ,
369+ },
370+ }
371+
372+ // EIP-152 test vectors
373+ var blake2FTests = []precompiledTest {
374+ {
375+ input : "0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
376+ expected : "08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b" ,
377+ name : "vector 4" ,
378+ },
379+ { // https://tools.ietf.org/html/rfc7693#appendix-A
380+ input : "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
381+ expected : "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923" ,
382+ name : "vector 5" ,
383+ },
384+ {
385+ input : "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000" ,
386+ expected : "75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735" ,
387+ name : "vector 6" ,
388+ },
389+ {
390+ input : "0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
391+ expected : "b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421" ,
392+ name : "vector 7" ,
393+ },
394+ }
395+
339396func testPrecompiled (addr string , test precompiledTest , t * testing.T ) {
340- p := PrecompiledContractsByzantium [common .HexToAddress (addr )]
397+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
341398 in := common .Hex2Bytes (test .input )
342399 contract := NewContract (AccountRef (common .HexToAddress ("1337" )),
343400 nil , new (big.Int ), p .RequiredGas (in ))
@@ -350,11 +407,25 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) {
350407 })
351408}
352409
410+ func testPrecompiledFailure (addr string , test precompiledFailureTest , t * testing.T ) {
411+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
412+ in := common .Hex2Bytes (test .input )
413+ contract := NewContract (AccountRef (common .HexToAddress ("31337" )),
414+ nil , new (big.Int ), p .RequiredGas (in ))
415+
416+ t .Run (test .name , func (t * testing.T ) {
417+ _ , err := RunPrecompiledContract (p , in , contract )
418+ if ! reflect .DeepEqual (err , test .expectedError ) {
419+ t .Errorf ("Expected error [%v], got [%v]" , test .expectedError , err )
420+ }
421+ })
422+ }
423+
353424func benchmarkPrecompiled (addr string , test precompiledTest , bench * testing.B ) {
354425 if test .noBenchmark {
355426 return
356427 }
357- p := PrecompiledContractsByzantium [common .HexToAddress (addr )]
428+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
358429 in := common .Hex2Bytes (test .input )
359430 reqGas := p .RequiredGas (in )
360431 contract := NewContract (AccountRef (common .HexToAddress ("1337" )),
@@ -481,3 +552,20 @@ func BenchmarkPrecompiledBn256Pairing(bench *testing.B) {
481552 benchmarkPrecompiled ("08" , test , bench )
482553 }
483554}
555+ func TestPrecompiledBlake2F (t * testing.T ) {
556+ for _ , test := range blake2FTests {
557+ testPrecompiled ("09" , test , t )
558+ }
559+ }
560+
561+ func BenchmarkPrecompiledBlake2F (bench * testing.B ) {
562+ for _ , test := range blake2FTests {
563+ benchmarkPrecompiled ("09" , test , bench )
564+ }
565+ }
566+
567+ func TestPrecompileBlake2FMalformedInput (t * testing.T ) {
568+ for _ , test := range blake2FMalformedInputTests {
569+ testPrecompiledFailure ("09" , test , t )
570+ }
571+ }
0 commit comments