Exemple #1
0
        public BaselineTreeNode GetLeaf(uint leafIndex)
        {
            ulong   nodeIndex = GetNodeIndex(LeafRow, leafIndex);
            Bytes32 value     = LoadValue(LeafRow, leafIndex);

            return(new BaselineTreeNode(new Keccak(value.AsSpan().ToArray()), nodeIndex));
        }
Exemple #2
0
        public void Insert(Bytes32 leaf)
        {
            SaveValue(GetNodeIndex(LeafRow, Count), leaf.AsSpan().ToArray());

            uint    indexAtRow        = Count;
            uint    siblingIndexAtRow = GetSiblingIndexAtRow(LeafRow, indexAtRow);
            Bytes32 hash        = leaf;
            Bytes32 siblingHash = LoadValue(LeafRow, siblingIndexAtRow);

            ulong nodeIndex = GetNodeIndex(LeafRow, Count);

            SaveValue(nodeIndex, hash);

            for (int row = LeafRow; row > 0; row--)
            {
                ulong parentIndex = GetParentIndex(GetNodeIndex((uint)row, indexAtRow));
                var   parentHash  = Hash(hash.AsSpan(), siblingHash.AsSpan());
                SaveValue(parentIndex, parentHash);

                indexAtRow = GetIndexAtRow((uint)row - 1, parentIndex);

                if (row != 1)
                {
                    siblingIndexAtRow = GetSiblingIndexAtRow((uint)row - 1, indexAtRow);
                    hash        = Bytes32.Wrap(parentHash);
                    siblingHash = LoadValue((uint)row - 1, siblingIndexAtRow);
                }
            }

            Count++;
        }
        public void Insert(Bytes32 leaf)
        {
            _keyValueStore[Rlp.Encode(Count).Bytes] = leaf.AsSpan().ToArray();

            uint    indexAtLevel        = Count;
            uint    siblingIndexAtLevel = GetSiblingIndex(LeafLevel, indexAtLevel);
            Bytes32 hash        = leaf;
            Bytes32 siblingHash = LoadValue(LeafLevel, siblingIndexAtLevel);

            uint nodeIndex = GetNodeIndex(LeafLevel, Count);

            SaveValue(nodeIndex, hash);

            for (int level = LeafLevel; level > 0; level--)
            {
                uint parentIndex = GetParentIndex(GetNodeIndex((uint)level, indexAtLevel));
                var  parentHash  = Hash(hash.AsSpan(), siblingHash.AsSpan());
                SaveValue(parentIndex, parentHash);

                indexAtLevel = GetIndexAtLevel((uint)level - 1, parentIndex);

                if (level != 1)
                {
                    siblingIndexAtLevel = GetSiblingIndex((uint)level - 1, indexAtLevel);
                    hash        = Bytes32.Wrap(parentHash);
                    siblingHash = LoadValue((uint)level - 1, siblingIndexAtLevel);
                }
            }

            Count++;
            StoreCountInTheDb();
        }
Exemple #4
0
        private Bytes32 LoadValue(ulong nodeIndex)
        {
            byte[] nodeHashBytes = _keyValueStore[BuildDbKey(nodeIndex)];
            if (nodeHashBytes == null)
            {
                return(ZeroHash);
            }

            return(Bytes32.Wrap(nodeHashBytes));
        }
        private Bytes32 LoadValue(uint nodeIndex)
        {
            byte[] nodeHashBytes = _keyValueStore[Rlp.Encode(nodeIndex).Bytes];
            if (nodeHashBytes == null)
            {
                return(Bytes32.Wrap(ZeroHashesInternal[31 - GetLevel(nodeIndex)]));
            }

            return(Bytes32.Wrap(nodeHashBytes));
        }
Exemple #6
0
 private void SaveValue(ulong nodeIndex, Bytes32 hash)
 {
     SaveValue(nodeIndex, hash.AsSpan().ToArray());
 }