public BaselineTreeNode GetLeaf(uint leafIndex) { ulong nodeIndex = GetNodeIndex(LeafRow, leafIndex); Bytes32 value = LoadValue(LeafRow, leafIndex); return(new BaselineTreeNode(new Keccak(value.AsSpan().ToArray()), nodeIndex)); }
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(); }
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)); }
private void SaveValue(ulong nodeIndex, Bytes32 hash) { SaveValue(nodeIndex, hash.AsSpan().ToArray()); }