public BlockInfo Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (decoderContext.IsNextItemNull()) { decoderContext.ReadByte(); return(null); } int lastCheck = decoderContext.ReadSequenceLength() + decoderContext.Position; BlockInfo blockInfo = new BlockInfo { BlockHash = decoderContext.DecodeKeccak(), WasProcessed = decoderContext.DecodeBool(), TotalDifficulty = decoderContext.DecodeUInt256() }; if (_chainWithFinalization) { blockInfo.IsFinalized = decoderContext.DecodeBool(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { decoderContext.Check(lastCheck); } return(blockInfo); }
public ChainLevelInfo?Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (decoderContext.IsNextItemNull()) { return(null); } int lastCheck = decoderContext.ReadSequenceLength() + decoderContext.Position; bool hasMainChainBlock = decoderContext.DecodeBool(); List <BlockInfo> blockInfos = new(); decoderContext.ReadSequenceLength(); while (decoderContext.Position < lastCheck) { // block info can be null for corrupted states (also cases where block hash is null from the old DBs) BlockInfo?blockInfo = Rlp.Decode <BlockInfo?>(ref decoderContext, RlpBehaviors.AllowExtraData); if (blockInfo is not null) { blockInfos.Add(blockInfo); } } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { decoderContext.Check(lastCheck); } ChainLevelInfo info = new(hasMainChainBlock, blockInfos.ToArray()); return(info); }
public ChainLevelInfo?Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (decoderContext.IsNextItemNull()) { return(null); } int lastCheck = decoderContext.ReadSequenceLength() + decoderContext.Position; bool hasMainChainBlock = decoderContext.DecodeBool(); List <BlockInfo> blockInfos = new(); decoderContext.ReadSequenceLength(); while (decoderContext.Position < lastCheck) { blockInfos.Add(Rlp.Decode <BlockInfo>(ref decoderContext, RlpBehaviors.AllowExtraData)); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { decoderContext.Check(lastCheck); } ChainLevelInfo info = new(hasMainChainBlock, blockInfos.ToArray()); return(info); }
public BlockInfo?Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (decoderContext.IsNextItemNull()) { decoderContext.ReadByte(); return(null); } int lastCheck = decoderContext.ReadSequenceLength() + decoderContext.Position; Keccak? blockHash = decoderContext.DecodeKeccak(); bool wasProcessed = decoderContext.DecodeBool(); UInt256 totalDifficulty = decoderContext.DecodeUInt256(); bool isFinalized = false; if (_chainWithFinalization) { isFinalized = decoderContext.DecodeBool(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { decoderContext.Check(lastCheck); } if (blockHash is null) { return(null); } BlockInfo blockInfo = new(blockHash, totalDifficulty) { WasProcessed = wasProcessed, IsFinalized = isFinalized }; return(blockInfo); } }
public BlockInfo?Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (decoderContext.IsNextItemNull()) { decoderContext.ReadByte(); return(null); } int lastCheck = decoderContext.ReadSequenceLength() + decoderContext.Position; Keccak? blockHash = decoderContext.DecodeKeccak(); bool wasProcessed = decoderContext.DecodeBool(); UInt256 totalDifficulty = decoderContext.DecodeUInt256(); BlockMetadata metadata = BlockMetadata.None; // if we hadn't reached the end of the stream, assume we have metadata to decode if (decoderContext.Position != lastCheck) { metadata = (BlockMetadata)decoderContext.DecodeInt(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { decoderContext.Check(lastCheck); } if (blockHash is null) { return(null); } BlockInfo blockInfo = new(blockHash, totalDifficulty) { WasProcessed = wasProcessed, Metadata = metadata }; return(blockInfo); } }