public Block Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } int sequenceLength = rlpStream.ReadSequenceLength(); int blockCheck = rlpStream.Position + sequenceLength; BlockHeader header = Rlp.Decode <BlockHeader>(rlpStream); int transactionsSequenceLength = rlpStream.ReadSequenceLength(); int transactionsCheck = rlpStream.Position + transactionsSequenceLength; List <Transaction> transactions = new List <Transaction>(); while (rlpStream.Position < transactionsCheck) { transactions.Add(Rlp.Decode <Transaction>(rlpStream)); } rlpStream.Check(transactionsCheck); int ommersSequenceLength = rlpStream.ReadSequenceLength(); int ommersCheck = rlpStream.Position + ommersSequenceLength; List <BlockHeader> ommerHeaders = new List <BlockHeader>(); while (rlpStream.Position < ommersCheck) { ommerHeaders.Add(Rlp.Decode <BlockHeader>(rlpStream, rlpBehaviors)); } rlpStream.Check(ommersCheck); if (!rlpBehaviors.HasFlag(RlpBehaviors.AllowExtraData)) { rlpStream.Check(blockCheck); } return(new Block(header, transactions, ommerHeaders)); }
public Block Decode(Rlp.DecoderContext context, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { int sequenceLength = context.ReadSequenceLength(); if (sequenceLength == 0) { return(null); } int blockCheck = context.Position + sequenceLength; BlockHeader header = Rlp.Decode <BlockHeader>(context); int transactionsSequenceLength = context.ReadSequenceLength(); int transactionsCheck = context.Position + transactionsSequenceLength; List <Transaction> transactions = new List <Transaction>(); while (context.Position < transactionsCheck) { transactions.Add(Rlp.Decode <Transaction>(context)); } context.Check(transactionsCheck); int ommersSequenceLength = context.ReadSequenceLength(); int ommersCheck = context.Position + ommersSequenceLength; List <BlockHeader> ommerHeaders = new List <BlockHeader>(); while (context.Position < ommersCheck) { ommerHeaders.Add(Rlp.Decode <BlockHeader>(context, rlpBehaviors)); } context.Check(ommersCheck); if (!rlpBehaviors.HasFlag(RlpBehaviors.AllowExtraData)) { context.Check(blockCheck); } return(new Block(header, transactions, ommerHeaders)); }
public ChainLevelInfo Decode(Rlp.DecoderContext context, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { int lastCheck = context.ReadSequenceLength() + context.Position; bool hasMainChainBlock = context.DecodeBool(); List <BlockInfo> blockInfos = new List <BlockInfo>(); context.ReadSequenceLength(); while (context.Position < lastCheck) { blockInfos.Add(Rlp.Decode <BlockInfo>(context, RlpBehaviors.AllowExtraData)); } if (!rlpBehaviors.HasFlag(RlpBehaviors.AllowExtraData)) { context.Check(lastCheck); } ChainLevelInfo info = new ChainLevelInfo(hasMainChainBlock, blockInfos.ToArray()); return(info); }
public TxReceipt Decode(Rlp.DecoderContext context, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { bool isStorage = (rlpBehaviors & RlpBehaviors.Storage) != 0; TxReceipt txReceipt = new TxReceipt(); context.ReadSequenceLength(); byte[] firstItem = context.DecodeByteArray(); if (firstItem.Length == 1) { txReceipt.StatusCode = firstItem[0]; } else { txReceipt.PostTransactionState = firstItem.Length == 0 ? null : new Keccak(firstItem); } if (isStorage) { txReceipt.BlockHash = context.DecodeKeccak(); } if (isStorage) { txReceipt.BlockNumber = (long)context.DecodeUInt256(); } if (isStorage) { txReceipt.Index = context.DecodeInt(); } if (isStorage) { txReceipt.Sender = context.DecodeAddress(); } if (isStorage) { txReceipt.Recipient = context.DecodeAddress(); } if (isStorage) { txReceipt.ContractAddress = context.DecodeAddress(); } if (isStorage) { txReceipt.GasUsed = (long)context.DecodeUBigInt(); } txReceipt.GasUsedTotal = (long)context.DecodeUBigInt(); txReceipt.Bloom = context.DecodeBloom(); int lastCheck = context.ReadSequenceLength() + context.Position; List <LogEntry> logEntries = new List <LogEntry>(); while (context.Position < lastCheck) { logEntries.Add(Rlp.Decode <LogEntry>(context, RlpBehaviors.AllowExtraData)); } bool allowExtraData = (rlpBehaviors & RlpBehaviors.AllowExtraData) != 0; if (!allowExtraData) { context.Check(lastCheck); } // since error was added later we can only rely on it in cases where we read receipt only and no data follows if (isStorage && !allowExtraData && context.Position != context.Length) { txReceipt.Error = context.DecodeString(); } txReceipt.Logs = logEntries.ToArray(); return(txReceipt); }