diff --git a/nimbus/conf_utils.nim b/nimbus/conf_utils.nim index e4c10aca8..98692b166 100644 --- a/nimbus/conf_utils.nim +++ b/nimbus/conf_utils.nim @@ -25,7 +25,7 @@ proc importRlpBlock*(importFile: string, chainDB: BasechainDB): bool = error "failed to import", fileName = importFile return false - var chain = newChain(chainDB) + var chain = newChain(chainDB, extraValidation = true) # the encoded rlp can contains one or more blocks var rlp = rlpFromBytes(res.get) let head = chainDB.getCanonicalHead() diff --git a/nimbus/p2p/chain.nim b/nimbus/p2p/chain.nim index 4d06e3e17..acce437a4 100644 --- a/nimbus/p2p/chain.nim +++ b/nimbus/p2p/chain.nim @@ -1,7 +1,7 @@ import ../db/db_chain, eth/common, chronicles, ../vm_state, ../vm_types, ../vm_computation, ../vm_message, ../vm_types2, stint, nimcrypto, ../utils, eth/trie/db, ./executor, ../chain_config, ../genesis, ../utils, - stew/endians2 + stew/endians2, ./validate, ./validate/epoch_hash_cache when not defined(release): import ../tracer @@ -25,6 +25,8 @@ type db: BaseChainDB forkIds: array[ChainFork, ForkID] blockZeroHash: KeccakHash + cacheByEpoch: EpochHashCache + extraValidation: bool func toChainFork(c: ChainConfig, number: BlockNumber): ChainFork = if number >= c.berlinBlock: Berlin @@ -87,7 +89,7 @@ func calculateForkIds(c: ChainConfig, genesisCRC: uint32): array[ChainFork, Fork prevFork = result[fork].nextFork prevCRC = result[fork].crc -proc newChain*(db: BaseChainDB): Chain = +proc newChain*(db: BaseChainDB, extraValidation = false): Chain = result.new result.db = db @@ -97,6 +99,10 @@ proc newChain*(db: BaseChainDB): Chain = result.blockZeroHash = g.toBlock.blockHash let genesisCRC = crc32(0, result.blockZeroHash.data) result.forkIds = calculateForkIds(db.config, genesisCRC) + result.extraValidation = extraValidation + + if extraValidation: + result.cacheByEpoch.initEpochHashCache method genesisHash*(c: Chain): KeccakHash {.gcsafe.} = c.blockZeroHash @@ -149,6 +155,17 @@ method persistBlocks*(c: Chain, headers: openarray[BlockHeader], bodies: openarr if validationResult != ValidationResult.OK: return validationResult + if c.extraValidation: + let res = validateKinship( + c.db, headers[i], + bodies[i].uncles, + checkSealOK = false, # TODO: how to checkseal from here + c.cacheByEpoch + ) + if res.isErr: + debug "kinship validation error", msg = res.error + return ValidationResult.Error + discard c.db.persistHeaderToDb(headers[i]) if c.db.getCanonicalHead().blockHash != headers[i].blockHash: debug "Stored block header hash doesn't match declared hash"