Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
    }
Пример #3
0
        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);
        }
    }
Пример #4
0
        public LogEntry?Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (decoderContext.IsNextItemNull())
            {
                decoderContext.ReadByte();
                return(null);
            }

            decoderContext.ReadSequenceLength();
            Address?address        = decoderContext.DecodeAddress();
            long    sequenceLength = decoderContext.ReadSequenceLength();

            Keccak[] topics = new Keccak[sequenceLength / 33];
            for (int i = 0; i < topics.Length; i++)
            {
                topics[i] = decoderContext.DecodeKeccak();
            }

            byte[] data = decoderContext.DecodeByteArray();

            return(new LogEntry(address, data, topics));
        }
Пример #5
0
        public TxReceipt Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (decoderContext.IsNextItemNull())
            {
                decoderContext.ReadByte();
                return(null);
            }

            bool      isStorage = (rlpBehaviors & RlpBehaviors.Storage) != 0;
            TxReceipt txReceipt = new TxReceipt();

            decoderContext.ReadSequenceLength();
            byte[] firstItem = decoderContext.DecodeByteArray();
            if (firstItem.Length == 1)
            {
                txReceipt.StatusCode = firstItem[0];
            }
            else
            {
                txReceipt.PostTransactionState = firstItem.Length == 0 ? null : new Keccak(firstItem);
            }

            if (isStorage)
            {
                txReceipt.BlockHash = decoderContext.DecodeKeccak();
            }
            if (isStorage)
            {
                txReceipt.BlockNumber = (long)decoderContext.DecodeUInt256();
            }
            if (isStorage)
            {
                txReceipt.Index = decoderContext.DecodeInt();
            }
            if (isStorage)
            {
                txReceipt.Sender = decoderContext.DecodeAddress();
            }
            if (isStorage)
            {
                txReceipt.Recipient = decoderContext.DecodeAddress();
            }
            if (isStorage)
            {
                txReceipt.ContractAddress = decoderContext.DecodeAddress();
            }
            if (isStorage)
            {
                txReceipt.GasUsed = (long)decoderContext.DecodeUBigInt();
            }
            txReceipt.GasUsedTotal = (long)decoderContext.DecodeUBigInt();
            txReceipt.Bloom        = decoderContext.DecodeBloom();

            int             lastCheck  = decoderContext.ReadSequenceLength() + decoderContext.Position;
            List <LogEntry> logEntries = new List <LogEntry>();

            while (decoderContext.Position < lastCheck)
            {
                logEntries.Add(Rlp.Decode <LogEntry>(ref decoderContext, RlpBehaviors.AllowExtraData));
            }

            bool allowExtraData = (rlpBehaviors & RlpBehaviors.AllowExtraData) != 0;

            if (!allowExtraData)
            {
                decoderContext.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 (decoderContext.PeekByte() == MarkTxHashByte)
                    {
                        decoderContext.ReadByte();
                        txReceipt.TxHash = decoderContext.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 (decoderContext.Position != decoderContext.Length)
                {
                    txReceipt.Error = decoderContext.DecodeString();
                }
            }

            txReceipt.Logs = logEntries.ToArray();
            return(txReceipt);
        }
Пример #6
0
        public BlockHeader?Decode(ref Rlp.ValueDecoderContext decoderContext,
                                  RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (decoderContext.IsNextItemNull())
            {
                return(null);
            }

            var headerRlp            = decoderContext.PeekNextItem();
            int headerSequenceLength = decoderContext.ReadSequenceLength();
            int headerCheck          = decoderContext.Position + headerSequenceLength;

            Keccak? parentHash       = decoderContext.DecodeKeccak();
            Keccak? unclesHash       = decoderContext.DecodeKeccak();
            Address?beneficiary      = decoderContext.DecodeAddress();
            Keccak? stateRoot        = decoderContext.DecodeKeccak();
            Keccak? transactionsRoot = decoderContext.DecodeKeccak();
            Keccak? receiptsRoot     = decoderContext.DecodeKeccak();
            Bloom?  bloom            = decoderContext.DecodeBloom();
            UInt256 difficulty       = decoderContext.DecodeUInt256();
            long    number           = decoderContext.DecodeLong();
            long    gasLimit         = decoderContext.DecodeLong();
            long    gasUsed          = decoderContext.DecodeLong();
            UInt256 timestamp        = decoderContext.DecodeUInt256();

            byte[]? extraData = decoderContext.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 (decoderContext.PeekPrefixAndContentLength().ContentLength == Keccak.Size)
            {
                blockHeader.MixHash = decoderContext.DecodeKeccak();
                blockHeader.Nonce   = (ulong)decoderContext.DecodeUBigInt();
            }
            else
            {
                blockHeader.AuRaStep      = (long)decoderContext.DecodeUInt256();
                blockHeader.AuRaSignature = decoderContext.DecodeByteArray();
            }

            if (blockHeader.Number >= Eip1559TransitionBlock)
            {
                blockHeader.BaseFeePerGas = decoderContext.DecodeUInt256();
            }

            if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData)
            {
                decoderContext.Check(headerCheck);
            }

            return(blockHeader);
        }
Пример #7
0
 public Keccak Decode(ref Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None) => decoderContext.DecodeKeccak();
Пример #8
0
        public BlockHeader Decode(Rlp.ValueDecoderContext decoderContext, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (decoderContext.IsNextItemNull())
            {
                return(null);
            }

            var headerRlp            = decoderContext.PeekNextItem();
            int headerSequenceLength = decoderContext.ReadSequenceLength();
            int headerCheck          = decoderContext.Position + headerSequenceLength;

            Keccak  parentHash       = decoderContext.DecodeKeccak();
            Keccak  ommersHash       = decoderContext.DecodeKeccak();
            Address beneficiary      = decoderContext.DecodeAddress();
            Keccak  stateRoot        = decoderContext.DecodeKeccak();
            Keccak  transactionsRoot = decoderContext.DecodeKeccak();
            Keccak  receiptsRoot     = decoderContext.DecodeKeccak();
            Bloom   bloom            = decoderContext.DecodeBloom();
            UInt256 difficulty       = decoderContext.DecodeUInt256();
            UInt256 number           = decoderContext.DecodeUInt256();
            UInt256 gasLimit         = decoderContext.DecodeUInt256();
            UInt256 gasUsed          = decoderContext.DecodeUInt256();
            UInt256 timestamp        = decoderContext.DecodeUInt256();

            byte[] extraData = decoderContext.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 (decoderContext.PeekPrefixAndContentLength().ContentLength == Keccak.Size)
            {
                blockHeader.MixHash = decoderContext.DecodeKeccak();
                blockHeader.Nonce   = (ulong)decoderContext.DecodeUBigInt();
            }
            else
            {
                blockHeader.AuRaStep      = (long)decoderContext.DecodeUInt256();
                blockHeader.AuRaSignature = decoderContext.DecodeByteArray();
            }

            if ((rlpBehaviors & RlpBehaviors.AllowExtraData) != RlpBehaviors.AllowExtraData)
            {
                decoderContext.Check(headerCheck);
            }

            return(blockHeader);
        }