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