@@ -2,11 +2,9 @@ package io.iohk.ethereum.blockchain.data
2
2
3
3
import java .io .FileNotFoundException
4
4
import akka .util .ByteString
5
- import io .iohk .ethereum .blockchain .data .GenesisDataLoader .JsonSerializers .{
6
- ByteStringJsonSerializer ,
7
- UInt256JsonSerializer
8
- }
9
- import io .iohk .ethereum .db .storage .MptStorage
5
+ import io .iohk .ethereum .blockchain .data .GenesisDataLoader .JsonSerializers .{ByteStringJsonSerializer , UInt256JsonSerializer }
6
+ import io .iohk .ethereum .db .dataSource .EphemDataSource
7
+ import io .iohk .ethereum .db .storage .{ArchiveNodeStorage , MptStorage , NodeStorage , SerializingMptStorage }
10
8
import io .iohk .ethereum .db .storage .StateStorage .GenesisDataLoad
11
9
import io .iohk .ethereum .rlp .RLPList
12
10
import io .iohk .ethereum .utils .BlockchainConfig
@@ -86,14 +84,14 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
86
84
} yield ()
87
85
}
88
86
89
- def loadGenesisData (genesisData : GenesisData , storageRootHashes : Map [ Address , ByteString ] = Map .empty ): Try [Unit ] = {
87
+ def loadGenesisData (genesisData : GenesisData ): Try [Unit ] = {
90
88
import MerklePatriciaTrie .defaultByteArraySerializable
91
89
92
90
val stateStorage = blockchain.getStateStorage
93
91
val storage = stateStorage.getReadOnlyStorage
94
92
val initalRootHash = MerklePatriciaTrie .EmptyRootHash
95
93
96
- val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage, storageRootHashes )
94
+ val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage)
97
95
val header : BlockHeader = prepareHeader(genesisData, stateMptRootHash)
98
96
99
97
log.debug(s " Prepared genesis header: $header" )
@@ -125,8 +123,7 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
125
123
private def getGenesisStateRoot (
126
124
genesisData : GenesisData ,
127
125
initalRootHash : Array [Byte ],
128
- storage : MptStorage ,
129
- storageRootHashes : Map [Address , ByteString ]
126
+ storage : MptStorage
130
127
) = {
131
128
import MerklePatriciaTrie .defaultByteArraySerializable
132
129
@@ -142,14 +139,25 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
142
139
.getOrElse(blockchainConfig.accountStartNonce),
143
140
balance = genesisAccount.balance,
144
141
codeHash = genesisAccount.code.map(codeValue => crypto.kec256(codeValue)).getOrElse(Account .EmptyCodeHash ),
145
- storageRoot = storageRootHashes.getOrElse( Address ( Hex .decode(paddedAddress)), Account .EmptyStorageRootHash )
142
+ storageRoot = genesisAccount.storage.map(computeStorageRootHash).getOrElse( Account .EmptyStorageRootHash )
146
143
)
147
144
)
148
145
.getRootHash
149
146
stateRoot
150
147
}
151
148
}
152
149
150
+ private def computeStorageRootHash (storage : Map [UInt256 , UInt256 ]): ByteString = {
151
+ val emptyTrie = EthereumUInt256Mpt .storageMpt(
152
+ ByteString (MerklePatriciaTrie .EmptyRootHash ),
153
+ new SerializingMptStorage (new ArchiveNodeStorage (new NodeStorage (EphemDataSource ())))
154
+ )
155
+
156
+ val storageTrie = storage.foldLeft(emptyTrie)((trie, tuple) => trie.put(tuple._1, tuple._2))
157
+
158
+ ByteString (storageTrie.getRootHash)
159
+ }
160
+
153
161
private def prepareHeader (genesisData : GenesisData , stateMptRootHash : Array [Byte ]) =
154
162
BlockHeader (
155
163
parentHash = zeros(hashLength),
0 commit comments