Skip to content

Commit d4d5e5a

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

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ package io.iohk.ethereum.blockchain.data
22

33
import java.io.FileNotFoundException
44
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}
108
import io.iohk.ethereum.db.storage.StateStorage.GenesisDataLoad
119
import io.iohk.ethereum.rlp.RLPList
1210
import io.iohk.ethereum.utils.BlockchainConfig
@@ -86,14 +84,14 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
8684
} yield ()
8785
}
8886

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

9290
val stateStorage = blockchain.getStateStorage
9391
val storage = stateStorage.getReadOnlyStorage
9492
val initalRootHash = MerklePatriciaTrie.EmptyRootHash
9593

96-
val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage, storageRootHashes)
94+
val stateMptRootHash = getGenesisStateRoot(genesisData, initalRootHash, storage)
9795
val header: BlockHeader = prepareHeader(genesisData, stateMptRootHash)
9896

9997
log.debug(s"Prepared genesis header: $header")
@@ -125,8 +123,7 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
125123
private def getGenesisStateRoot(
126124
genesisData: GenesisData,
127125
initalRootHash: Array[Byte],
128-
storage: MptStorage,
129-
storageRootHashes: Map[Address, ByteString]
126+
storage: MptStorage
130127
) = {
131128
import MerklePatriciaTrie.defaultByteArraySerializable
132129

@@ -142,14 +139,25 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
142139
.getOrElse(blockchainConfig.accountStartNonce),
143140
balance = genesisAccount.balance,
144141
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)
146143
)
147144
)
148145
.getRootHash
149146
stateRoot
150147
}
151148
}
152149

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+
153161
private def prepareHeader(genesisData: GenesisData, stateMptRootHash: Array[Byte]) =
154162
BlockHeader(
155163
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)