コード例 #1
0
        /// <summary>
        /// Spend some time trying to find some base interface like ICountableEnumerable, none of such in .NET Core
        /// </summary>
        private static void EncodeListItem(
            RlpStream stream,
            Address address,
            IEnumerable <UInt256> indexes,
            int indexesCount)
        {
            // {} brackets applied to show the content structure
            // Address
            //   Index1
            //   Index2
            //   ...
            //   IndexN
            AccessItemLengths lengths = new(indexesCount);

            stream.StartSequence(lengths.ContentLength);
            {
                stream.Encode(address);
                stream.StartSequence(lengths.IndexesContentLength);
                {
                    foreach (UInt256 index in indexes)
                    {
                        // storage indices are encoded as 32 bytes data arrays
                        stream.Encode(index, 32);
                    }
                }
            }
        }
コード例 #2
0
    protected override void EncodeValue(RlpStream rlpStream)
    {
        // I am just guessing this one
        int contentLength = 5 + Rlp.LengthOf(Value.NextBlock);

        rlpStream.StartSequence(contentLength + 1);
        rlpStream.StartSequence(contentLength);
        rlpStream.Encode(Value.ForkHash);
        rlpStream.Encode(Value.NextBlock);
    }
コード例 #3
0
 public void Encode(RlpStream rlpStream, PendingValidators item, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
 {
     (int contentLength, int addressesLength) = GetContentLength(item, rlpBehaviors);
     rlpStream.StartSequence(contentLength);
     rlpStream.Encode(item.BlockNumber);
     rlpStream.Encode(item.BlockHash);
     rlpStream.StartSequence(addressesLength);
     for (int i = 0; i < item.Addresses.Length; i++)
     {
         rlpStream.Encode(item.Addresses[i]);
     }
     rlpStream.Encode(item.AreFinalized);
 }
コード例 #4
0
        public void Encode(RlpStream stream, UserOperationWithEntryPoint?opWithEntryPoint, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (opWithEntryPoint is null)
            {
                stream.EncodeNullObject();
                return;
            }

            int contentLength = GetContentLength(opWithEntryPoint);

            UserOperation op         = opWithEntryPoint.UserOperation;
            Address       entryPoint = opWithEntryPoint.EntryPoint;

            stream.StartSequence(contentLength);

            stream.Encode(op.Sender);
            stream.Encode(op.Nonce);
            stream.Encode(op.InitCode);
            stream.Encode(op.CallData);
            stream.Encode(op.CallGas);
            stream.Encode(op.VerificationGas);
            stream.Encode(op.PreVerificationGas);
            stream.Encode(op.MaxFeePerGas);
            stream.Encode(op.MaxPriorityFeePerGas);
            stream.Encode(op.Paymaster);
            stream.Encode(op.PaymasterData);
            stream.Encode(op.Signature);
            stream.Encode(entryPoint);
        }
コード例 #5
0
        public void Encode(RlpStream stream, ValidatorInfo?item, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (item == null)
            {
                stream.EncodeNullObject();
                return;
            }

            var(contentLength, validatorLength) = GetContentLength(item, rlpBehaviors);
            stream.StartSequence(contentLength);
            stream.Encode(item.FinalizingBlockNumber);
            stream.Encode(item.PreviousFinalizingBlockNumber);
            stream.StartSequence(validatorLength);
            for (int i = 0; i < item.Validators.Length; i++)
            {
                stream.Encode(item.Validators[i]);
            }
        }
コード例 #6
0
        public void Encode(RlpStream stream, AccessList?item, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            if (item is null)
            {
                stream.WriteByte(Rlp.NullObjectByte);
            }
            else
            {
                int contentLength = GetContentLength(item);
                stream.StartSequence(contentLength);

                if (!item.IsNormalized)
                {
                    AccessListItem?currentItem = default;

                    void SerializeCurrent()
                    {
                        if (currentItem is not null)
                        {
                            AccessListItem toEncode = currentItem.Value;
                            EncodeListItem(stream, toEncode.Address, toEncode.Indexes, toEncode.Indexes.Count);
                        }
                    }

                    foreach (object accessListEntry in item.OrderQueue !)
                    {
                        if (accessListEntry is Address address)
                        {
                            // serialize any element that is not the last
                            SerializeCurrent();
                            currentItem = new AccessListItem(address, new List <UInt256>());
                        }
                        else
                        {
                            if (currentItem is null)
                            {
                                throw new InvalidDataException(
                                          $"{nameof(AccessList)} order looks corrupted - processing index ahead of address");
                            }

                            currentItem.Value.Indexes.Add((UInt256)accessListEntry);
                        }
                    }

                    // serialize the last element
                    SerializeCurrent();
                }
                else
                {
                    foreach ((Address address, IReadOnlySet <UInt256> indexes) in item.Data)
                    {
                        EncodeListItem(stream, address, indexes, indexes.Count);
                    }
                }
            }
        }
コード例 #7
0
        public byte[] Serialize(NewBlockMessage message)
        {
            int       contentLength = _blockDecoder.GetLength(message.Block, RlpBehaviors.None) + Rlp.LengthOf((UInt256)message.TotalDifficulty);
            int       totalLength   = Rlp.LengthOfSequence(contentLength);
            RlpStream rlpStream     = new RlpStream(totalLength);

            rlpStream.StartSequence(contentLength);
            rlpStream.Encode(message.Block);
            rlpStream.Encode(message.TotalDifficulty);
            return(rlpStream.Data);
        }
コード例 #8
0
        public Rlp Encode(NetworkNode item, RlpBehaviors rlpBehaviors = RlpBehaviors.None)
        {
            int       contentLength = GetContentLength(item, rlpBehaviors);
            RlpStream stream        = new RlpStream(Rlp.GetSequenceRlpLength(contentLength));

            stream.StartSequence(contentLength);
            stream.Encode(item.NodeId.Bytes);
            stream.Encode(item.Host);
            stream.Encode(item.Port);
            stream.Encode(string.Empty);
            stream.Encode(item.Reputation);
            return(new Rlp(stream.Data));
        }
コード例 #9
0
        public byte[] Serialize(BlockHeadersMessage message)
        {
            int contentLength = 0;

            for (int i = 0; i < message.BlockHeaders.Length; i++)
            {
                contentLength += _headerDecoder.GetLength(message.BlockHeaders[i], RlpBehaviors.None);
            }

            int       length    = Rlp.LengthOfSequence(contentLength);
            RlpStream rlpStream = new RlpStream(length);

            rlpStream.StartSequence(contentLength);
            for (int i = 0; i < message.BlockHeaders.Length; i++)
            {
                rlpStream.Encode(message.BlockHeaders[i]);
            }

            return(rlpStream.Data);
        }
コード例 #10
0
        private byte[] SerializeMetadata()
        {
            int contentLength = 0;

            for (int i = 0; i < _metadata.TrackedTrees.Length; i++)
            {
                contentLength += Rlp.LengthOf(_metadata.TrackedTrees[i]);
            }

            int totalLength = Rlp.LengthOfSequence(contentLength);

            RlpStream rlpStream = new RlpStream(totalLength);

            rlpStream.StartSequence(contentLength);
            for (int i = 0; i < _metadata.TrackedTrees.Length; i++)
            {
                rlpStream.Encode(_metadata.TrackedTrees[i]);
            }

            return(rlpStream.Data);
        }