parent
94a94c5b65
commit
f4cacdfc6a
|
@ -89,8 +89,8 @@ proc new*(
|
|||
onStoreInitialized, onFinalizedHeader, onOptimisticHeader)
|
||||
|
||||
proc lightClientVerifier(obj: SomeLightClientObject):
|
||||
Future[Result[void, BlockError]] =
|
||||
let resfut = newFuture[Result[void, BlockError]]("lightClientVerifier")
|
||||
Future[Result[void, VerifierError]] =
|
||||
let resfut = newFuture[Result[void, VerifierError]]("lightClientVerifier")
|
||||
lightClient.processor[].addObject(MsgSource.gossip, obj, resfut)
|
||||
resfut
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import
|
|||
beacon_chain/beacon_clock,
|
||||
"."/[light_client_network, light_client_content]
|
||||
|
||||
from beacon_chain/consensus_object_pools/block_pools_types import BlockError
|
||||
from beacon_chain/consensus_object_pools/block_pools_types import VerifierError
|
||||
|
||||
logScope:
|
||||
topics = "lcman"
|
||||
|
@ -40,7 +40,7 @@ type
|
|||
Endpoint[Slot, altair.LightClientOptimisticUpdate]
|
||||
|
||||
ValueVerifier[V] =
|
||||
proc(v: V): Future[Result[void, BlockError]] {.gcsafe, raises: [Defect].}
|
||||
proc(v: V): Future[Result[void, VerifierError]] {.gcsafe, raises: [Defect].}
|
||||
BootstrapVerifier* =
|
||||
ValueVerifier[altair.LightClientBootstrap]
|
||||
UpdateVerifier* =
|
||||
|
@ -204,19 +204,19 @@ proc workerTask[E](
|
|||
let res = await self.valueVerifier(E)(val)
|
||||
if res.isErr:
|
||||
case res.error
|
||||
of BlockError.MissingParent:
|
||||
of VerifierError.MissingParent:
|
||||
# Stop, requires different request to progress
|
||||
return didProgress
|
||||
of BlockError.Duplicate:
|
||||
of VerifierError.Duplicate:
|
||||
# Ignore, a concurrent request may have already fulfilled this
|
||||
when E.V is altair.LightClientBootstrap:
|
||||
didProgress = true
|
||||
else:
|
||||
discard
|
||||
of BlockError.UnviableFork:
|
||||
of VerifierError.UnviableFork:
|
||||
notice "Received value from an unviable fork", value = val.shortLog
|
||||
return didProgress
|
||||
of BlockError.Invalid:
|
||||
of VerifierError.Invalid:
|
||||
warn "Received invalid value", value = val.shortLog
|
||||
return didProgress
|
||||
else:
|
||||
|
|
|
@ -13,7 +13,8 @@ else:
|
|||
import
|
||||
std/tables,
|
||||
web3/ethtypes,
|
||||
stew/[results, keyed_queue]
|
||||
stew/[results, keyed_queue],
|
||||
./rpc/rpc_utils
|
||||
|
||||
|
||||
## Cache for payloads received through block gossip and validated by the
|
||||
|
@ -22,7 +23,7 @@ import
|
|||
## oldest payload is deleted first.
|
||||
type BlockCache* = ref object
|
||||
max: int
|
||||
blocks: KeyedQueue[BlockHash, ExecutionPayloadV1]
|
||||
blocks: KeyedQueue[BlockHash, ExecutionData]
|
||||
|
||||
proc `==`(x, y: Quantity): bool {.borrow, noSideEffect.}
|
||||
|
||||
|
@ -30,7 +31,7 @@ proc new*(T: type BlockCache, max: uint32): T =
|
|||
let maxAsInt = int(max)
|
||||
return BlockCache(
|
||||
max: maxAsInt,
|
||||
blocks: KeyedQueue[BlockHash, ExecutionPayloadV1].init(maxAsInt)
|
||||
blocks: KeyedQueue[BlockHash, ExecutionData].init(maxAsInt)
|
||||
)
|
||||
|
||||
func len*(self: BlockCache): int =
|
||||
|
@ -39,7 +40,7 @@ func len*(self: BlockCache): int =
|
|||
func isEmpty*(self: BlockCache): bool =
|
||||
return len(self.blocks) == 0
|
||||
|
||||
proc add*(self: BlockCache, payload: ExecutionPayloadV1) =
|
||||
proc add*(self: BlockCache, payload: ExecutionData) =
|
||||
if self.blocks.hasKey(payload.blockHash):
|
||||
return
|
||||
|
||||
|
@ -48,15 +49,15 @@ proc add*(self: BlockCache, payload: ExecutionPayloadV1) =
|
|||
|
||||
discard self.blocks.append(payload.blockHash, payload)
|
||||
|
||||
proc latest*(self: BlockCache): results.Opt[ExecutionPayloadV1] =
|
||||
proc latest*(self: BlockCache): results.Opt[ExecutionData] =
|
||||
let latestPair = ? self.blocks.last()
|
||||
return Opt.some(latestPair.data)
|
||||
|
||||
proc getByNumber*(
|
||||
self: BlockCache,
|
||||
number: Quantity): Opt[ExecutionPayloadV1] =
|
||||
number: Quantity): Opt[ExecutionData] =
|
||||
|
||||
var payloadResult: Opt[ExecutionPayloadV1]
|
||||
var payloadResult: Opt[ExecutionData]
|
||||
|
||||
for payload in self.blocks.prevValues:
|
||||
if payload.blockNumber == number:
|
||||
|
@ -67,5 +68,5 @@ proc getByNumber*(
|
|||
|
||||
proc getPayloadByHash*(
|
||||
self: BlockCache,
|
||||
hash: BlockHash): Opt[ExecutionPayloadV1] =
|
||||
hash: BlockHash): Opt[ExecutionData] =
|
||||
return self.blocks.eq(hash)
|
||||
|
|
|
@ -22,7 +22,7 @@ import
|
|||
beacon_chain/spec/datatypes/[phase0, altair, bellatrix],
|
||||
beacon_chain/[light_client, nimbus_binary_common, version],
|
||||
../nimbus/rpc/cors,
|
||||
./rpc/rpc_eth_api,
|
||||
"."/rpc/[rpc_eth_api, rpc_utils],
|
||||
./nimbus_verified_proxy_conf,
|
||||
./block_cache
|
||||
|
||||
|
@ -119,7 +119,7 @@ proc run() {.raises: [Exception, Defect].} =
|
|||
when stateFork >= BeaconStateFork.Bellatrix:
|
||||
if blck.message.is_execution_block:
|
||||
template payload(): auto = blck.message.body.execution_payload
|
||||
blockCache.add(payload.asEngineExecutionPayload())
|
||||
blockCache.add(asExecutionData(payload.asEngineExecutionPayload()))
|
||||
else: discard
|
||||
return
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ template rpcClient(lcProxy: VerifiedRpcProxy): RpcClient =
|
|||
proc getPayloadByTag(
|
||||
proxy: VerifiedRpcProxy,
|
||||
quantityTag: string):
|
||||
results.Opt[ExecutionPayloadV1] {.raises: [ValueError, Defect].} =
|
||||
results.Opt[ExecutionData] {.raises: [ValueError, Defect].} =
|
||||
checkPreconditions(proxy)
|
||||
|
||||
let tagResult = parseQuantityTag(quantityTag)
|
||||
|
@ -113,7 +113,7 @@ proc getPayloadByTag(
|
|||
|
||||
proc getPayloadByTagOrThrow(
|
||||
proxy: VerifiedRpcProxy,
|
||||
quantityTag: string): ExecutionPayloadV1 {.raises: [ValueError, Defect].} =
|
||||
quantityTag: string): ExecutionData {.raises: [ValueError, Defect].} =
|
||||
|
||||
let tagResult = getPayloadByTag(proxy, quantityTag)
|
||||
|
||||
|
|
|
@ -17,6 +17,63 @@ import
|
|||
stint,
|
||||
web3
|
||||
|
||||
type
|
||||
ExecutionData* = object
|
||||
parentHash*: BlockHash
|
||||
feeRecipient*: Address
|
||||
stateRoot*: BlockHash
|
||||
receiptsRoot*: BlockHash
|
||||
logsBloom*: FixedBytes[256]
|
||||
prevRandao*: FixedBytes[32]
|
||||
blockNumber*: Quantity
|
||||
gasLimit*: Quantity
|
||||
gasUsed*: Quantity
|
||||
timestamp*: Quantity
|
||||
extraData*: DynamicBytes[0, 32]
|
||||
baseFeePerGas*: UInt256
|
||||
blockHash*: BlockHash
|
||||
transactions*: seq[TypedTransaction]
|
||||
withdrawals*: seq[WithdrawalV1]
|
||||
|
||||
proc asExecutionData*(
|
||||
payload: ExecutionPayloadV1 | ExecutionPayloadV2): ExecutionData =
|
||||
when payload is ExecutionPayloadV1:
|
||||
return ExecutionData(
|
||||
parentHash: payload.parentHash,
|
||||
feeRecipient: payload.feeRecipient,
|
||||
stateRoot: payload.stateRoot,
|
||||
receiptsRoot: payload.receiptsRoot,
|
||||
logsBloom: payload.logsBloom,
|
||||
prevRandao: payload.prevRandao,
|
||||
blockNumber: payload.blockNumber,
|
||||
gasLimit: payload.gasLimit,
|
||||
gasUsed: payload.gasUsed,
|
||||
timestamp: payload.timestamp,
|
||||
extraData: payload.extraData,
|
||||
baseFeePerGas: payload.baseFeePerGas,
|
||||
blockHash: payload.blockHash,
|
||||
transactions: payload.transactions,
|
||||
withdrawals: @[]
|
||||
)
|
||||
else:
|
||||
return ExecutionData(
|
||||
parentHash: payload.parentHash,
|
||||
feeRecipient: payload.feeRecipient,
|
||||
stateRoot: payload.stateRoot,
|
||||
receiptsRoot: payload.receiptsRoot,
|
||||
logsBloom: payload.logsBloom,
|
||||
prevRandao: payload.prevRandao,
|
||||
blockNumber: payload.blockNumber,
|
||||
gasLimit: payload.gasLimit,
|
||||
gasUsed: payload.gasUsed,
|
||||
timestamp: payload.timestamp,
|
||||
extraData: payload.extraData,
|
||||
baseFeePerGas: payload.baseFeePerGas,
|
||||
blockHash: payload.blockHash,
|
||||
transactions: payload.transactions,
|
||||
withdrawals: payload.withdrawals
|
||||
)
|
||||
|
||||
template unsafeQuantityToInt64(q: Quantity): int64 =
|
||||
int64 q
|
||||
|
||||
|
@ -44,7 +101,7 @@ proc calculateTransactionData(
|
|||
return (tr.rootHash(), txHashes, txSize)
|
||||
|
||||
func blockHeaderSize(
|
||||
payload: ExecutionPayloadV1, txRoot: etypes.Hash256): uint64 =
|
||||
payload: ExecutionData, txRoot: etypes.Hash256): uint64 =
|
||||
let bh = etypes.BlockHeader(
|
||||
parentHash : payload.parentHash.asEthHash,
|
||||
ommersHash : etypes.EMPTY_UNCLE_HASH,
|
||||
|
@ -66,7 +123,7 @@ func blockHeaderSize(
|
|||
return uint64(len(rlp.encode(bh)))
|
||||
|
||||
proc asBlockObject*(
|
||||
p: ExecutionPayloadV1): BlockObject {.raises: [Defect, RlpError].} =
|
||||
p: ExecutionData): BlockObject {.raises: [Defect, RlpError].} =
|
||||
# TODO: currently we always calculate txHashes as BlockObject does not have
|
||||
# option of returning full transactions. It needs fixing at nim-web3 library
|
||||
# level
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 9df76c39df254c7ff0cec6dec5c9f345f2819c91
|
||||
Subproject commit 75d030ff71264513fb9701c75a326cd36fcb4692
|
|
@ -1 +1 @@
|
|||
Subproject commit 16a921168678017c42c1b15617951a88cd8c5705
|
||||
Subproject commit 1e2e2e6d16a22cfc33f475b293c3ffbce8c46409
|
|
@ -1 +1 @@
|
|||
Subproject commit f141ae57d36dfa7bb2f26d7dd9fe6789acb3f429
|
||||
Subproject commit 4e71e77da78d2ee1849facc140fcd06be4248a28
|
Loading…
Reference in New Issue