71 lines
2.2 KiB
Nim
71 lines
2.2 KiB
Nim
|
# beacon_chain
|
||
|
# Copyright (c) 2018-2023 Status Research & Development GmbH
|
||
|
# Licensed and distributed under either of
|
||
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
||
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
||
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||
|
|
||
|
{.push raises: [].}
|
||
|
|
||
|
import
|
||
|
std/tables,
|
||
|
../spec/datatypes/deneb
|
||
|
|
||
|
|
||
|
const
|
||
|
MaxBlobs = SLOTS_PER_EPOCH * MAX_BLOBS_PER_BLOCK
|
||
|
|
||
|
|
||
|
type
|
||
|
BlobQuarantine* = object
|
||
|
blobs*: Table[(Eth2Digest, BlobIndex), ref BlobSidecar]
|
||
|
|
||
|
|
||
|
func put*(quarantine: var BlobQuarantine, blobSidecar: ref BlobSidecar) =
|
||
|
if quarantine.blobs.lenu64 > MaxBlobs:
|
||
|
return
|
||
|
discard quarantine.blobs.hasKeyOrPut((blobSidecar.block_root,
|
||
|
blobSidecar.index), blobSidecar)
|
||
|
|
||
|
func blobIndices*(quarantine: BlobQuarantine, digest: Eth2Digest):
|
||
|
seq[BlobIndex] =
|
||
|
var r: seq[BlobIndex] = @[]
|
||
|
for i in 0..MAX_BLOBS_PER_BLOCK-1:
|
||
|
if quarantine.blobs.hasKey((digest, i)):
|
||
|
r.add(i)
|
||
|
r
|
||
|
|
||
|
func hasBlob*(quarantine: BlobQuarantine, blobSidecar: BlobSidecar) : bool =
|
||
|
quarantine.blobs.hasKey((blobSidecar.block_root, blobSidecar.index))
|
||
|
|
||
|
func popBlobs*(quarantine: var BlobQuarantine, digest: Eth2Digest):
|
||
|
seq[ref BlobSidecar] =
|
||
|
var r: seq[ref BlobSidecar] = @[]
|
||
|
for i in 0..MAX_BLOBS_PER_BLOCK-1:
|
||
|
var b: ref BlobSidecar
|
||
|
if quarantine.blobs.pop((digest, i), b):
|
||
|
r.add(b)
|
||
|
r
|
||
|
|
||
|
func peekBlobs*(quarantine: var BlobQuarantine, digest: Eth2Digest):
|
||
|
seq[ref BlobSidecar] =
|
||
|
var r: seq[ref BlobSidecar] = @[]
|
||
|
for i in 0..MAX_BLOBS_PER_BLOCK-1:
|
||
|
quarantine.blobs.withValue((digest, i), value):
|
||
|
r.add(value[])
|
||
|
r
|
||
|
|
||
|
func removeBlobs*(quarantine: var BlobQuarantine, digest: Eth2Digest) =
|
||
|
for i in 0..MAX_BLOBS_PER_BLOCK-1:
|
||
|
quarantine.blobs.del((digest, i))
|
||
|
|
||
|
func hasBlobs*(quarantine: BlobQuarantine, blck: deneb.SignedBeaconBlock):
|
||
|
bool =
|
||
|
let idxs = quarantine.blobIndices(blck.root)
|
||
|
if len(blck.message.body.blob_kzg_commitments) != len(idxs):
|
||
|
return false
|
||
|
for i in 0..len(idxs):
|
||
|
if idxs[i] != uint64(i):
|
||
|
return false
|
||
|
true
|