public (Keccak CodeHash, Keccak StorageRoot) DecodeHashesOnly(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { rlpStream.SkipLength(); rlpStream.SkipItem(); rlpStream.SkipItem(); Keccak storageRoot = rlpStream.DecodeKeccak(); Keccak codeHash = rlpStream.DecodeKeccak(); return(codeHash, storageRoot); }
public Account Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { rlpStream.ReadSequenceLength(); UInt256 nonce = rlpStream.DecodeUInt256(); UInt256 balance = rlpStream.DecodeUInt256(); Keccak storageRoot = rlpStream.DecodeKeccak(); Keccak codeHash = rlpStream.DecodeKeccak(); Account account = new Account(nonce, balance, storageRoot, codeHash); return(account); }
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 Keccak DecodeStorageRootOnly(RlpStream rlpStream) { rlpStream.SkipLength(); rlpStream.SkipItem(); rlpStream.SkipItem(); Keccak storageRoot = rlpStream.DecodeKeccak(); return(storageRoot); }
private Keccak DecodeCodeHash(RlpStream rlpStream) { Keccak codeHash = null; if (_slimFormat && rlpStream.IsNextItemEmptyArray()) { rlpStream.ReadByte(); codeHash = Keccak.OfAnEmptyString; } else { codeHash = rlpStream.DecodeKeccak(); } return(codeHash); }
private Keccak DecodeStorageRoot(RlpStream rlpStream) { Keccak storageRoot = null; if (_slimFormat && rlpStream.IsNextItemEmptyArray()) { rlpStream.ReadByte(); storageRoot = Keccak.EmptyTreeHash; } else { storageRoot = rlpStream.DecodeKeccak(); } return(storageRoot); }
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 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 LogEntry?Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } rlpStream.ReadSequenceLength(); Address?address = rlpStream.DecodeAddress(); long sequenceLength = rlpStream.ReadSequenceLength(); Keccak[] topics = new Keccak[sequenceLength / 33]; for (int i = 0; i < topics.Length; i++) { topics[i] = rlpStream.DecodeKeccak(); } byte[] data = rlpStream.DecodeByteArray(); return(new LogEntry(address, data, topics)); }
public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } bool isStorage = (rlpBehaviors & RlpBehaviors.Storage) != 0; TxReceipt txReceipt = new TxReceipt(); rlpStream.ReadSequenceLength(); byte[] firstItem = rlpStream.DecodeByteArray(); if (firstItem.Length == 1) { txReceipt.StatusCode = firstItem[0]; } else { txReceipt.PostTransactionState = firstItem.Length == 0 ? null : new Keccak(firstItem); } if (isStorage) { txReceipt.BlockHash = rlpStream.DecodeKeccak(); } if (isStorage) { txReceipt.BlockNumber = (long)rlpStream.DecodeUInt256(); } if (isStorage) { txReceipt.Index = rlpStream.DecodeInt(); } if (isStorage) { txReceipt.Sender = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.Recipient = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.ContractAddress = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.GasUsed = (long)rlpStream.DecodeUBigInt(); } txReceipt.GasUsedTotal = (long)rlpStream.DecodeUBigInt(); txReceipt.Bloom = rlpStream.DecodeBloom(); int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; List <LogEntry> logEntries = new List <LogEntry>(); while (rlpStream.Position < lastCheck) { logEntries.Add(Rlp.Decode <LogEntry>(rlpStream, RlpBehaviors.AllowExtraData)); } bool allowExtraData = (rlpBehaviors & RlpBehaviors.AllowExtraData) != 0; if (!allowExtraData) { rlpStream.Check(lastCheck); } if (!allowExtraData) { if (isStorage && _supportTxHash) { // since txHash was added later and may not be in rlp, we provide special mark byte that it will be next if (rlpStream.PeekByte() == MarkTxHashByte) { rlpStream.ReadByte(); txReceipt.TxHash = rlpStream.DecodeKeccak(); } } // since error was added later we can only rely on it in cases where we read receipt only and no data follows, empty errors might not be serialized if (rlpStream.Position != rlpStream.Length) { txReceipt.Error = rlpStream.DecodeString(); } } txReceipt.Logs = logEntries.ToArray(); return(txReceipt); }
public BlockHeader?Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } Span <byte> headerRlp = rlpStream.PeekNextItem(); int headerSequenceLength = rlpStream.ReadSequenceLength(); int headerCheck = rlpStream.Position + headerSequenceLength; Keccak? parentHash = rlpStream.DecodeKeccak(); Keccak? unclesHash = rlpStream.DecodeKeccak(); Address?beneficiary = rlpStream.DecodeAddress(); Keccak? stateRoot = rlpStream.DecodeKeccak(); Keccak? transactionsRoot = rlpStream.DecodeKeccak(); Keccak? receiptsRoot = rlpStream.DecodeKeccak(); Bloom? bloom = rlpStream.DecodeBloom(); UInt256 difficulty = rlpStream.DecodeUInt256(); long number = rlpStream.DecodeLong(); long gasLimit = rlpStream.DecodeLong(); long gasUsed = rlpStream.DecodeLong(); UInt256 timestamp = rlpStream.DecodeUInt256(); byte[]? extraData = rlpStream.DecodeByteArray(); BlockHeader blockHeader = new( parentHash, unclesHash, beneficiary, difficulty, number, gasLimit, timestamp, extraData) { StateRoot = stateRoot, TxRoot = transactionsRoot, ReceiptsRoot = receiptsRoot, Bloom = bloom, GasUsed = gasUsed, Hash = Keccak.Compute(headerRlp) }; if (rlpStream.PeekPrefixAndContentLength().ContentLength == Keccak.Size) { blockHeader.MixHash = rlpStream.DecodeKeccak(); blockHeader.Nonce = (ulong)rlpStream.DecodeUBigInt(); } else { blockHeader.AuRaStep = (long)rlpStream.DecodeUInt256(); blockHeader.AuRaSignature = rlpStream.DecodeByteArray(); } if (blockHeader.Number >= Eip1559TransitionBlock) { blockHeader.BaseFeePerGas = rlpStream.DecodeUInt256(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(headerCheck); } return(blockHeader); }
public BlockHeader Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } var headerRlp = rlpStream.PeekNextItem(); int headerSequenceLength = rlpStream.ReadSequenceLength(); int headerCheck = rlpStream.Position + headerSequenceLength; Keccak parentHash = rlpStream.DecodeKeccak(); Keccak ommersHash = rlpStream.DecodeKeccak(); Address beneficiary = rlpStream.DecodeAddress(); Keccak stateRoot = rlpStream.DecodeKeccak(); Keccak transactionsRoot = rlpStream.DecodeKeccak(); Keccak receiptsRoot = rlpStream.DecodeKeccak(); Bloom bloom = rlpStream.DecodeBloom(); UInt256 difficulty = rlpStream.DecodeUInt256(); UInt256 number = rlpStream.DecodeUInt256(); UInt256 gasLimit = rlpStream.DecodeUInt256(); UInt256 gasUsed = rlpStream.DecodeUInt256(); UInt256 timestamp = rlpStream.DecodeUInt256(); byte[] extraData = rlpStream.DecodeByteArray(); BlockHeader blockHeader = new BlockHeader( parentHash, ommersHash, beneficiary, difficulty, (long)number, (long)gasLimit, timestamp, extraData) { StateRoot = stateRoot, TxRoot = transactionsRoot, ReceiptsRoot = receiptsRoot, Bloom = bloom, GasUsed = (long)gasUsed, Hash = Keccak.Compute(headerRlp) }; if (rlpStream.PeekPrefixAndContentLength().ContentLength == Keccak.Size) { blockHeader.MixHash = rlpStream.DecodeKeccak(); blockHeader.Nonce = (ulong)rlpStream.DecodeUBigInt(); } else { blockHeader.AuRaStep = (long)rlpStream.DecodeUInt256(); blockHeader.AuRaSignature = rlpStream.DecodeByteArray(); } if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData) { rlpStream.Check(headerCheck); } return(blockHeader); }