@@ -8,8 +8,10 @@ package evm
8
8
9
9
import (
10
10
"bytes"
11
+ "encoding/hex"
11
12
"fmt"
12
13
"math/big"
14
+ "sort"
13
15
14
16
"github.com/ethereum/go-ethereum/common"
15
17
"github.com/ethereum/go-ethereum/core/types"
@@ -571,11 +573,24 @@ func (stateDB *StateDBAdapter) setContractState(addr hash.Hash160, key, value ha
571
573
572
574
// CommitContracts commits contract code to db and update pending contract account changes to trie
573
575
func (stateDB * StateDBAdapter ) CommitContracts () error {
574
- for addr , contract := range stateDB .cachedContract {
576
+ addrStrs := make ([]string , 0 )
577
+ for addr := range stateDB .cachedContract {
578
+ addrStrs = append (addrStrs , hex .EncodeToString (addr [:]))
579
+ }
580
+ sort .Strings (addrStrs )
581
+
582
+ for _ , addrStr := range addrStrs {
583
+ var addr hash.Hash160
584
+ addrBytes , err := hex .DecodeString (addrStr )
585
+ if err != nil {
586
+ return errors .Wrap (err , "failed to decode address hash" )
587
+ }
588
+ copy (addr [:], addrBytes )
575
589
if _ , ok := stateDB .suicided [addr ]; ok {
576
590
// no need to update a suicide account/contract
577
591
continue
578
592
}
593
+ contract := stateDB .cachedContract [addr ]
579
594
if err := contract .Commit (); err != nil {
580
595
stateDB .logError (err )
581
596
return errors .Wrap (err , "failed to commit contract" )
@@ -588,14 +603,39 @@ func (stateDB *StateDBAdapter) CommitContracts() error {
588
603
}
589
604
}
590
605
// delete suicided accounts/contract
606
+ addrStrs = make ([]string , 0 )
591
607
for addr := range stateDB .suicided {
608
+ addrStrs = append (addrStrs , hex .EncodeToString (addr [:]))
609
+ }
610
+ sort .Strings (addrStrs )
611
+
612
+ for _ , addrStr := range addrStrs {
613
+ var addr hash.Hash160
614
+ addrBytes , err := hex .DecodeString (addrStr )
615
+ if err != nil {
616
+ return errors .Wrap (err , "failed to decode address hash" )
617
+ }
618
+ copy (addr [:], addrBytes )
592
619
if err := stateDB .sm .DelState (addr ); err != nil {
593
620
stateDB .logError (err )
594
621
return errors .Wrapf (err , "failed to delete suicide account/contract %x" , addr [:])
595
622
}
596
623
}
597
624
// write preimages to DB
598
- for k , v := range stateDB .preimages {
625
+ addrStrs = make ([]string , 0 )
626
+ for addr := range stateDB .preimages {
627
+ addrStrs = append (addrStrs , hex .EncodeToString (addr [:]))
628
+ }
629
+ sort .Strings (addrStrs )
630
+
631
+ for _ , addrStr := range addrStrs {
632
+ var k common.Hash
633
+ addrBytes , err := hex .DecodeString (addrStr )
634
+ if err != nil {
635
+ return errors .Wrap (err , "failed to decode address hash" )
636
+ }
637
+ copy (k [:], addrBytes )
638
+ v := stateDB .preimages [k ]
599
639
h := make ([]byte , len (k ))
600
640
copy (h , k [:])
601
641
stateDB .cb .Put (PreimageKVNameSpace , h , v , "failed to put hash %x preimage %x" , k , v )
0 commit comments