public BlockInfo Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; BlockInfo blockInfo = new BlockInfo { BlockHash = rlpStream.DecodeKeccak(), WasProcessed = rlpStream.DecodeBool(), TotalDifficulty = rlpStream.DecodeUInt256() }; if (_chainWithFinalization) { blockInfo.IsFinalized = rlpStream.DecodeBool(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(lastCheck); } return(blockInfo); }
public ChainLevelInfo Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { return(null); } int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; bool hasMainChainBlock = rlpStream.DecodeBool(); List <BlockInfo> blockInfos = new List <BlockInfo>(); rlpStream.ReadSequenceLength(); while (rlpStream.Position < lastCheck) { blockInfos.Add(Rlp.Decode <BlockInfo>(rlpStream, RlpBehaviors.AllowExtraData)); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(lastCheck); } ChainLevelInfo info = new ChainLevelInfo(hasMainChainBlock, blockInfos.ToArray()); return(info); }
public BlockInfo?Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; Keccak?blockHash = rlpStream.DecodeKeccak(); bool wasProcessed = rlpStream.DecodeBool(); UInt256 totalDifficulty = rlpStream.DecodeUInt256(); bool isFinalized = false; if (_chainWithFinalization) { isFinalized = rlpStream.DecodeBool(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(lastCheck); } if (blockHash is null) { return(null); } BlockInfo blockInfo = new(blockHash, totalDifficulty) { WasProcessed = wasProcessed, IsFinalized = isFinalized }; return(blockInfo); }
public BlockInfo?Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; Keccak?blockHash = rlpStream.DecodeKeccak(); bool wasProcessed = rlpStream.DecodeBool(); UInt256 totalDifficulty = rlpStream.DecodeUInt256(); BlockMetadata metadata = BlockMetadata.None; // if we hadn't reached the end of the stream, assume we have metadata to decode if (rlpStream.Position != lastCheck) { metadata = (BlockMetadata)rlpStream.DecodeInt(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(lastCheck); } if (blockHash is null) { return(null); } BlockInfo blockInfo = new(blockHash, totalDifficulty) { WasProcessed = wasProcessed, Metadata = metadata, }; return(blockInfo); }
public ChainLevelInfo?Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.Length == 0) { throw new RlpException($"Received a 0 length stream when decoding a {nameof(ChainLevelInfo)}"); } if (rlpStream.IsNextItemNull()) { return(null); } int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; bool hasMainChainBlock = rlpStream.DecodeBool(); List <BlockInfo> blockInfos = new(); rlpStream.ReadSequenceLength(); while (rlpStream.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?>(rlpStream, RlpBehaviors.AllowExtraData); if (blockInfo is not null) { blockInfos.Add(blockInfo); } } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(lastCheck); } ChainLevelInfo info = new(hasMainChainBlock, blockInfos.ToArray()); return(info); }