@@ -35,6 +35,7 @@ import (
3535 "github.com/ethereum/go-ethereum/ethdb"
3636 "github.com/ethereum/go-ethereum/event"
3737 "github.com/ethereum/go-ethereum/params"
38+ "github.com/ethereum/go-ethereum/rlp"
3839)
3940
4041// in this test, we can set n to 1, and it means we can process Istanbul and commit a
@@ -105,22 +106,23 @@ func getGenesisAndKeys(n int) (*core.Genesis, []*ecdsa.PrivateKey) {
105106}
106107
107108func appendValidators (genesis * core.Genesis , addrs []common.Address ) {
109+
108110 if len (genesis .ExtraData ) < types .IstanbulExtraVanity {
109111 genesis .ExtraData = append (genesis .ExtraData , bytes .Repeat ([]byte {0x00 }, types .IstanbulExtraVanity )... )
110112 }
111113 genesis .ExtraData = genesis .ExtraData [:types .IstanbulExtraVanity ]
112114
113- validatorSize := byte (len (addrs ))
114- genesis .ExtraData = append (genesis .ExtraData , validatorSize )
115-
116- for _ , addr := range addrs {
117- genesis .ExtraData = append (genesis .ExtraData , addr [:]... )
115+ ist := & types.IstanbulExtra {
116+ Validators : addrs ,
117+ Seal : []byte {},
118+ CommittedSeal : [][]byte {},
118119 }
119- genesis .ExtraData = append (genesis .ExtraData , make ([]byte , types .IstanbulExtraSeal )... )
120120
121- // committed seal
122- genesis .ExtraData = append (genesis .ExtraData , byte (0x01 ))
123- genesis .ExtraData = append (genesis .ExtraData , make ([]byte , types .IstanbulExtraSeal )... )
121+ istPayload , err := rlp .EncodeToBytes (& ist )
122+ if err != nil {
123+ panic ("failed to encode istanbul extra" )
124+ }
125+ genesis .ExtraData = append (genesis .ExtraData , istPayload ... )
124126}
125127
126128func makeHeader (parent * types.Block , config * istanbul.Config ) * types.Header {
@@ -474,3 +476,120 @@ OUT3:
474476 }
475477 }
476478}
479+
480+ func TestPrepareExtra (t * testing.T ) {
481+ validators := make ([]common.Address , 4 )
482+ validators [0 ] = common .BytesToAddress (hexutil .MustDecode ("0x44add0ec310f115a0e603b2d7db9f067778eaf8a" ))
483+ validators [1 ] = common .BytesToAddress (hexutil .MustDecode ("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212" ))
484+ validators [2 ] = common .BytesToAddress (hexutil .MustDecode ("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6" ))
485+ validators [3 ] = common .BytesToAddress (hexutil .MustDecode ("0x8be76812f765c24641ec63dc2852b378aba2b440" ))
486+
487+ vanity := make ([]byte , types .IstanbulExtraVanity )
488+ expectedResult := append (vanity , hexutil .MustDecode ("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0" )... )
489+
490+ h := & types.Header {
491+ Extra : vanity ,
492+ }
493+
494+ payload , err := prepareExtra (h , validators )
495+ if err != nil {
496+ t .Errorf ("unexpected error: %v" , err )
497+ }
498+ if ! reflect .DeepEqual (payload , expectedResult ) {
499+ t .Errorf ("expected: %v, but got: %v" , expectedResult , payload )
500+ }
501+
502+ // append useless information to extra-data
503+ h .Extra = append (vanity , make ([]byte , 15 )... )
504+
505+ payload , err = prepareExtra (h , validators )
506+ if ! reflect .DeepEqual (payload , expectedResult ) {
507+ t .Errorf ("expected: %v, got: %v" , expectedResult , payload )
508+ }
509+ }
510+
511+ func TestWriteSeal (t * testing.T ) {
512+ vanity := bytes .Repeat ([]byte {0x00 }, types .IstanbulExtraVanity )
513+ istRawData := hexutil .MustDecode ("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0" )
514+ expectedSeal := append ([]byte {1 , 2 , 3 }, bytes .Repeat ([]byte {0x00 }, types .IstanbulExtraSeal - 3 )... )
515+ expectedIstExtra := & types.IstanbulExtra {
516+ Validators : []common.Address {
517+ common .BytesToAddress (hexutil .MustDecode ("0x44add0ec310f115a0e603b2d7db9f067778eaf8a" )),
518+ common .BytesToAddress (hexutil .MustDecode ("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212" )),
519+ common .BytesToAddress (hexutil .MustDecode ("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6" )),
520+ common .BytesToAddress (hexutil .MustDecode ("0x8be76812f765c24641ec63dc2852b378aba2b440" )),
521+ },
522+ Seal : expectedSeal ,
523+ CommittedSeal : [][]byte {},
524+ }
525+ var expectedErr error
526+
527+ h := & types.Header {
528+ Extra : append (vanity , istRawData ... ),
529+ }
530+
531+ // normal case
532+ err := writeSeal (h , expectedSeal )
533+ if err != expectedErr {
534+ t .Errorf ("expected: %v, but got: %v" , expectedErr , err )
535+ }
536+
537+ // verify istanbul extra-data
538+ istExtra , err := types .ExtractIstanbulExtra (h )
539+ if err != nil {
540+ t .Errorf ("unexpected error: %v" , err )
541+ }
542+ if ! reflect .DeepEqual (istExtra , expectedIstExtra ) {
543+ t .Errorf ("expected: %v, got: %v" , expectedIstExtra , istExtra )
544+ }
545+
546+ // invalid seal
547+ unexpectedSeal := append (expectedSeal , make ([]byte , 1 )... )
548+ err = writeSeal (h , unexpectedSeal )
549+ if err != errInvalidSignature {
550+ t .Errorf ("expected: %v, got: %v" , errInvalidSignature , err )
551+ }
552+ }
553+
554+ func TestWriteCommittedSeals (t * testing.T ) {
555+ vanity := bytes .Repeat ([]byte {0x00 }, types .IstanbulExtraVanity )
556+ istRawData := hexutil .MustDecode ("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0" )
557+ expectedCommittedSeal := append ([]byte {1 , 2 , 3 }, bytes .Repeat ([]byte {0x00 }, types .IstanbulExtraSeal - 3 )... )
558+ expectedIstExtra := & types.IstanbulExtra {
559+ Validators : []common.Address {
560+ common .BytesToAddress (hexutil .MustDecode ("0x44add0ec310f115a0e603b2d7db9f067778eaf8a" )),
561+ common .BytesToAddress (hexutil .MustDecode ("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212" )),
562+ common .BytesToAddress (hexutil .MustDecode ("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6" )),
563+ common .BytesToAddress (hexutil .MustDecode ("0x8be76812f765c24641ec63dc2852b378aba2b440" )),
564+ },
565+ Seal : []byte {},
566+ CommittedSeal : [][]byte {expectedCommittedSeal },
567+ }
568+ var expectedErr error
569+
570+ h := & types.Header {
571+ Extra : append (vanity , istRawData ... ),
572+ }
573+
574+ // normal case
575+ err := writeCommittedSeals (h , expectedCommittedSeal )
576+ if err != expectedErr {
577+ t .Errorf ("expected: %v, but got: %v" , expectedErr , err )
578+ }
579+
580+ // verify istanbul extra-data
581+ istExtra , err := types .ExtractIstanbulExtra (h )
582+ if err != nil {
583+ t .Errorf ("unexpected error: %v" , err )
584+ }
585+ if ! reflect .DeepEqual (istExtra , expectedIstExtra ) {
586+ t .Errorf ("expected: %v, got: %v" , expectedIstExtra , istExtra )
587+ }
588+
589+ // invalid seal
590+ unexpectedCommittedSeal := append (expectedCommittedSeal , make ([]byte , 1 )... )
591+ err = writeCommittedSeals (h , unexpectedCommittedSeal )
592+ if err != errInvalidCommittedSeals {
593+ t .Errorf ("expected: %v, got: %v" , errInvalidCommittedSeals , err )
594+ }
595+ }
0 commit comments