Skip to content

Commit d91d37b

Browse files
author
Aurélien Richez
committed
Make GenesisDataLoader compute the storage hash instead of taking it as argument.
1 parent a376f5c commit d91d37b

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

src/main/scala/io/iohk/ethereum/blockchain/data/GenesisDataLoader.scala

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import io.iohk.ethereum.blockchain.data.GenesisDataLoader.JsonSerializers.{
66
ByteStringJsonSerializer,
77
UInt256JsonSerializer
88
}
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}
1011
import io.iohk.ethereum.db.storage.StateStorage.GenesisDataLoad
1112
import io.iohk.ethereum.rlp.RLPList
1213
import io.iohk.ethereum.utils.BlockchainConfig
@@ -86,14 +87,14 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
8687
} yield ()
8788
}
8889

89-
def loadGenesisData(genesisData: GenesisData, storageRootHashes: Map[Address, ByteString] = Map.empty): Try[Unit] = {
90+
def loadGenesisData(genesisData: GenesisData): Try[Unit] = {
9091
import MerklePatriciaTrie.defaultByteArraySerializable
9192

9293
val stateStorage = blockchain.getStateStorage
9394
val storage = stateStorage.getReadOnlyStorage
9495
val initalRootHash = MerklePatriciaTrie.EmptyRootHash
9596

96-
val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage, storageRootHashes)
97+
val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage)
9798
val header: BlockHeader = prepareHeader(genesisData, stateMptRootHash)
9899

99100
log.debug(s"Prepared genesis header: $header")
@@ -122,12 +123,7 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
122123
}
123124
}
124125

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) = {
131127
import MerklePatriciaTrie.defaultByteArraySerializable
132128

133129
genesisData.alloc.zipWithIndex.foldLeft(initalRootHash) { case (rootHash, ((address, genesisAccount), _)) =>
@@ -142,14 +138,25 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
142138
.getOrElse(blockchainConfig.accountStartNonce),
143139
balance = genesisAccount.balance,
144140
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)
146142
)
147143
)
148144
.getRootHash
149145
stateRoot
150146
}
151147
}
152148

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+
153160
private def prepareHeader(genesisData: GenesisData, stateMptRootHash: Array[Byte]) =
154161
BlockHeader(
155162
parentHash = zeros(hashLength),

src/main/scala/io/iohk/ethereum/jsonrpc/TestService.scala

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,10 @@ class TestService(
157157

158158
//save account codes to world state
159159
storeGenesisAccountCodes(newBlockchainConfig, genesisData.alloc)
160-
val storesRootHash = storeGenesisAccountStorageData(newBlockchainConfig, genesisData.alloc)
160+
storeGenesisAccountStorageData(newBlockchainConfig, genesisData.alloc)
161161
// update test ledger with new config
162162
testLedgerWrapper.blockchainConfig = newBlockchainConfig
163163

164-
// remove current genesis (Try because it may not exist)
165-
Try(blockchain.removeBlock(blockchain.genesisHeader.hash, withState = false))
166-
genesisDataLoader.loadGenesisData(genesisData, storesRootHash)
167-
168164
accountAddresses = genesisData.alloc.keys.toList
169165
accountRangeOffset = 0
170166

@@ -185,7 +181,7 @@ class TestService(
185181
InMemoryWorldStateProxy.persistState(worldToPersist)
186182
}
187183

188-
private def storeGenesisAccountStorageData(config: BlockchainConfig, accounts: Map[String, GenesisAccount]) = {
184+
private def storeGenesisAccountStorageData(config: BlockchainConfig, accounts: Map[String, GenesisAccount]): Unit = {
189185
val genesisBlock = blockchain.getBlockByNumber(0).get
190186
val world =
191187
blockchain.getWorldStateProxy(0, UInt256.Zero, genesisBlock.header.stateRoot, false, config.ethCompatibleStorage)
@@ -203,9 +199,7 @@ class TestService(
203199
updatedWorld
204200
})
205201

206-
InMemoryWorldStateProxy.persistState(worldToPersist).contractStorages.map { case (address, values) =>
207-
address -> ByteString(values.inner.getRootHash)
208-
}
202+
InMemoryWorldStateProxy.persistState(worldToPersist)
209203
}
210204

211205
def mineBlocks(request: MineBlocksRequest): ServiceResponse[MineBlocksResponse] = {

0 commit comments

Comments
 (0)