@@ -86,14 +86,14 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
86
86
} yield ()
87
87
}
88
88
89
- def loadGenesisData (genesisData : GenesisData ): Try [Unit ] = {
89
+ def loadGenesisData (genesisData : GenesisData , storageRootHashes : Map [ Address , ByteString ] = Map .empty ): Try [Unit ] = {
90
90
import MerklePatriciaTrie .defaultByteArraySerializable
91
91
92
92
val stateStorage = blockchain.getStateStorage
93
93
val storage = stateStorage.getReadOnlyStorage
94
94
val initalRootHash = MerklePatriciaTrie .EmptyRootHash
95
95
96
- val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage)
96
+ val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage, storageRootHashes )
97
97
val header : BlockHeader = prepareHeader(genesisData, stateMptRootHash)
98
98
99
99
log.debug(s " Prepared genesis header: $header" )
@@ -122,20 +122,27 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
122
122
}
123
123
}
124
124
125
- private def getGenesisStateRoot (genesisData : GenesisData , initalRootHash : Array [Byte ], storage : MptStorage ) = {
125
+ private def getGenesisStateRoot (
126
+ genesisData : GenesisData ,
127
+ initalRootHash : Array [Byte ],
128
+ storage : MptStorage ,
129
+ storageRootHashes : Map [Address , ByteString ]
130
+ ) = {
126
131
import MerklePatriciaTrie .defaultByteArraySerializable
127
132
128
133
genesisData.alloc.zipWithIndex.foldLeft(initalRootHash) { case (rootHash, ((address, genesisAccount), _)) =>
129
134
val mpt = MerklePatriciaTrie [Array [Byte ], Account ](rootHash, storage)
130
135
val paddedAddress = address.reverse.padTo(addressLength, " 0" ).reverse.mkString
136
+
131
137
val stateRoot = mpt
132
138
.put(
133
139
crypto.kec256(Hex .decode(paddedAddress)),
134
140
Account (
135
141
nonce = genesisAccount.nonce
136
142
.getOrElse(blockchainConfig.accountStartNonce),
137
143
balance = genesisAccount.balance,
138
- codeHash = genesisAccount.code.map(codeValue => crypto.kec256(codeValue)).getOrElse(Account .EmptyCodeHash )
144
+ codeHash = genesisAccount.code.map(codeValue => crypto.kec256(codeValue)).getOrElse(Account .EmptyCodeHash ),
145
+ storageRoot = storageRootHashes.getOrElse(Address (Hex .decode(paddedAddress)), Account .EmptyStorageRootHash )
139
146
)
140
147
)
141
148
.getRootHash
0 commit comments