@@ -19,6 +19,7 @@ package vm
19
19
import (
20
20
"fmt"
21
21
"math/big"
22
+ "reflect"
22
23
"testing"
23
24
24
25
"github.com/ethereum/go-ethereum/common"
@@ -32,6 +33,14 @@ type precompiledTest struct {
32
33
noBenchmark bool // Benchmark primarily the worst-cases
33
34
}
34
35
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
+
35
44
// modexpTests are the test and benchmark data for the modexp precompiled contract.
36
45
var modexpTests = []precompiledTest {
37
46
{
@@ -336,8 +345,61 @@ var bn256PairingTests = []precompiledTest{
336
345
},
337
346
}
338
347
348
+ // EIP-152 test vectors
349
+ var blake2FMalformedInputTests = []precompiledFailureTest {
350
+ {
351
+ input : "" ,
352
+ expectedError : errBlake2FInvalidInputLength ,
353
+ name : "vector 0: empty input" ,
354
+ },
355
+ {
356
+ input : "00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
357
+ expectedError : errBlake2FInvalidInputLength ,
358
+ name : "vector 1: less than 213 bytes input" ,
359
+ },
360
+ {
361
+ input : "000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
362
+ expectedError : errBlake2FInvalidInputLength ,
363
+ name : "vector 2: more than 213 bytes input" ,
364
+ },
365
+ {
366
+ input : "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002" ,
367
+ expectedError : errBlake2FInvalidFinalFlag ,
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
+ input : "007A120048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001" ,
396
+ expected : "6d2ce9e534d50e18ff866ae92d70cceba79bbcd14c63819fe48752c8aca87a4bb7dcc230d22a4047f0486cfcfb50a17b24b2899eb8fca370f22240adb5170189" ,
397
+ name : "vector 8" ,
398
+ },
399
+ }
400
+
339
401
func testPrecompiled (addr string , test precompiledTest , t * testing.T ) {
340
- p := PrecompiledContractsByzantium [common .HexToAddress (addr )]
402
+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
341
403
in := common .Hex2Bytes (test .input )
342
404
contract := NewContract (AccountRef (common .HexToAddress ("1337" )),
343
405
nil , new (big.Int ), p .RequiredGas (in ))
@@ -350,11 +412,25 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) {
350
412
})
351
413
}
352
414
415
+ func testPrecompiledFailure (addr string , test precompiledFailureTest , t * testing.T ) {
416
+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
417
+ in := common .Hex2Bytes (test .input )
418
+ contract := NewContract (AccountRef (common .HexToAddress ("31337" )),
419
+ nil , new (big.Int ), p .RequiredGas (in ))
420
+
421
+ t .Run (test .name , func (t * testing.T ) {
422
+ _ , err := RunPrecompiledContract (p , in , contract )
423
+ if ! reflect .DeepEqual (err , test .expectedError ) {
424
+ t .Errorf ("Expected error [%v], got [%v]" , test .expectedError , err )
425
+ }
426
+ })
427
+ }
428
+
353
429
func benchmarkPrecompiled (addr string , test precompiledTest , bench * testing.B ) {
354
430
if test .noBenchmark {
355
431
return
356
432
}
357
- p := PrecompiledContractsByzantium [common .HexToAddress (addr )]
433
+ p := PrecompiledContractsIstanbul [common .HexToAddress (addr )]
358
434
in := common .Hex2Bytes (test .input )
359
435
reqGas := p .RequiredGas (in )
360
436
contract := NewContract (AccountRef (common .HexToAddress ("1337" )),
@@ -481,3 +557,20 @@ func BenchmarkPrecompiledBn256Pairing(bench *testing.B) {
481
557
benchmarkPrecompiled ("08" , test , bench )
482
558
}
483
559
}
560
+ func TestPrecompiledBlake2F (t * testing.T ) {
561
+ for _ , test := range blake2FTests {
562
+ testPrecompiled ("09" , test , t )
563
+ }
564
+ }
565
+
566
+ func BenchmarkPrecompiledBlake2F (bench * testing.B ) {
567
+ for _ , test := range blake2FTests {
568
+ benchmarkPrecompiled ("09" , test , bench )
569
+ }
570
+ }
571
+
572
+ func TestPrecompileBlake2FMalformedInput (t * testing.T ) {
573
+ for _ , test := range blake2FMalformedInputTests {
574
+ testPrecompiledFailure ("09" , test , t )
575
+ }
576
+ }
0 commit comments