diff --git a/nimbus/core/casper.nim b/nimbus/core/casper.nim index 801758ddb..7d913060c 100644 --- a/nimbus/core/casper.nim +++ b/nimbus/core/casper.nim @@ -11,9 +11,9 @@ import type CasperRef* = ref object - feeRecipient* : EthAddress - timestamp* : EthTime - prevRandao* : Hash256 + feeRecipient : EthAddress + timestamp : EthTime + prevRandao : Hash256 proc prepare*(ctx: CasperRef, header: var BlockHeader) = header.coinbase = ctx.feeRecipient @@ -21,7 +21,7 @@ proc prepare*(ctx: CasperRef, header: var BlockHeader) = header.prevRandao = ctx.prevRandao header.difficulty = DifficultyInt.zero -proc prepareForSeal*(ctx: CasperRef, header: var BlockHeader) = +proc prepareForSeal*(ctx: CasperRef, header: var BlockHeader) {.gcsafe, raises:[RlpError].} = header.nonce = default(BlockNonce) header.extraData = @[] # TODO: probably this should be configurable by user? # this repetition, assigning prevRandao is because how txpool works diff --git a/nimbus/core/sealer.nim b/nimbus/core/sealer.nim index d5cd6bf53..3d01f42fa 100644 --- a/nimbus/core/sealer.nim +++ b/nimbus/core/sealer.nim @@ -33,6 +33,10 @@ import from web3/ethtypes as web3types import nil, TypedTransaction, WithdrawalV1, ExecutionPayloadV1OrV2, toExecutionPayloadV1OrV2, toExecutionPayloadV1 from web3/engine_api_types import PayloadAttributesV1, ExecutionPayloadV1, PayloadAttributesV2, ExecutionPayloadV2 +export + # generateExecutionPayload caller will need this + casper + type EngineState* = enum EngineStopped, @@ -142,6 +146,17 @@ template unsafeQuantityToInt64(q: web3types.Quantity): int64 = proc toTypedTransaction(tx: Transaction): TypedTransaction = web3types.TypedTransaction(rlp.encode(tx)) +func toWithdrawal(x: WithdrawalV1): Withdrawal = + result.index = x.index.uint64 + result.validatorIndex = x.validatorIndex.uint64 + result.address = x.address.EthAddress + result.amount = x.amount.uint64 + +func toWithdrawals(list: openArray[WithdrawalV1]): seq[Withdrawal] = + result = newSeqOfCap[Withdrawal](list.len) + for x in list: + result.add toWithdrawal(x) + proc generateExecutionPayload*(engine: SealingEngineRef, payloadAttrs: PayloadAttributesV1 | PayloadAttributesV2): Result[ExecutionPayloadV1OrV2, string] = let @@ -153,6 +168,11 @@ proc generateExecutionPayload*(engine: SealingEngineRef, pos.timestamp = fromUnix(payloadAttrs.timestamp.unsafeQuantityToInt64) pos.feeRecipient = EthAddress payloadAttrs.suggestedFeeRecipient + when payloadAttrs is PayloadAttributesV2: + engine.txPool.withdrawals = payloadAttrs.withdrawals.toWithdrawals + else: + engine.txPool.withdrawals = @[] + if headBlock.blockHash != engine.txPool.head.blockHash: # reorg discard engine.txPool.smartHead(headBlock) diff --git a/nimbus/core/tx_pool.nim b/nimbus/core/tx_pool.nim index 770c1e3cf..4457205d3 100644 --- a/nimbus/core/tx_pool.nim +++ b/nimbus/core/tx_pool.nim @@ -436,7 +436,8 @@ import chronicles, eth/keys, stew/[keyed_queue, results], - ../common/common + ../common/common, + ./casper export TxItemRef, @@ -621,6 +622,10 @@ proc ethBlock*(xp: TxPoolRef): EthBlock for (_,nonceList) in xp.txDB.packingOrderAccounts(txItemPacked): result.txs.add toSeq(nonceList.incNonce).mapIt(it.tx) + let com = xp.chain.com + if com.consensus == ConsensusType.POS: + result.withdrawals = some(xp.chain.withdrawals) + proc gasCumulative*(xp: TxPoolRef): GasInt = ## Getter, retrieves the gas that will be burned in the block after ## retrieving it via `ethBlock`. @@ -766,6 +771,9 @@ proc `minTipPrice=`*(xp: TxPoolRef; val: GasPrice) = xp.pMinTipPrice = val xp.pDirtyBuckets = true +proc `withdrawals=`*(xp: TxPoolRef, val: sink seq[Withdrawal]) = + xp.chain.withdrawals = system.move(val) + # ------------------------------------------------------------------------------ # Public functions, per-tx-item operations # ------------------------------------------------------------------------------ diff --git a/nimbus/core/tx_pool/tx_chain.nim b/nimbus/core/tx_pool/tx_chain.nim index 90405874e..9216e1b60 100644 --- a/nimbus/core/tx_pool/tx_chain.nim +++ b/nimbus/core/tx_pool/tx_chain.nim @@ -66,6 +66,7 @@ type limits: TxChainGasLimits ## Gas limits for packer and next header txEnv: TxChainPackerEnv ## Assorted parameters, tx packer environment prepHeader: BlockHeader ## Prepared Header from Consensus Engine + withdrawals: seq[Withdrawal] # ------------------------------------------------------------------------------ # Private functions @@ -90,7 +91,7 @@ proc prepareHeader(dh: TxChainRef; parent: BlockHeader) of ConsensusType.POS: dh.com.pos.prepare(dh.prepHeader) -proc prepareForSeal(dh: TxChainRef; header: var BlockHeader) {.gcsafe, raises: [].} = +proc prepareForSeal(dh: TxChainRef; header: var BlockHeader) {.gcsafe, raises: [RlpError].} = case dh.com.consensus of ConsensusType.POW: # do nothing, tx pool was designed with POW in mind @@ -201,6 +202,9 @@ proc getHeader*(dh: TxChainRef): BlockHeader # nonce: BlockNonce # mining free vaiable fee: dh.txEnv.vmState.fee) + if dh.com.forkGTE(Shanghai): + result.withdrawalsRoot = some(calcWithdrawalsRoot(dh.withdrawals)) + dh.prepareForSeal(result) proc clearAccounts*(dh: TxChainRef) @@ -280,6 +284,10 @@ proc vmState*(dh: TxChainRef): BaseVMState = ## Getter, `BaseVmState` descriptor based on the current insertion point. dh.txEnv.vmState +proc withdrawals*(dh: TxChainRef): seq[Withdrawal] = + ## Getter, `BaseVmState` descriptor based on the current insertion point. + result = system.move(dh.withdrawals) + # ------------------------------------------------------------------------------ # Public functions, setters # ------------------------------------------------------------------------------ @@ -342,6 +350,9 @@ proc `txRoot=`*(dh: TxChainRef; val: Hash256) = ## Setter dh.txEnv.txRoot = val +proc `withdrawals=`*(dh: TxChainRef, val: sink seq[Withdrawal]) = + dh.withdrawals = system.move(val) + # ------------------------------------------------------------------------------ # End # ------------------------------------------------------------------------------ diff --git a/vendor/nim-eth b/vendor/nim-eth index d57a1094b..e639dc1e1 160000 --- a/vendor/nim-eth +++ b/vendor/nim-eth @@ -1 +1 @@ -Subproject commit d57a1094b1c0d6faa6b3b70ae653948299266fa3 +Subproject commit e639dc1e145722ec137639ee040eddc524f853dd