arnaucube
arnaucube/arboPublic Self-hosted repository
Add tree.Get
arnaucube root@arnaucube.com
Wed, 31 Mar 2021 23:05:10 +0200
commit

4cd2ff6182660dc055f8109d792c6d2b25b4bb3f

parent

bde87ca844ab719f6512c5de0c08caadb3c1c081

2 files changed, 36 insertions(+), 2 deletions(-)

jump to
M tree.go → tree.go

@@ -434,8 +434,22 @@ }

// Get returns the value for a given key func (t *Tree) Get(k []byte) ([]byte, []byte, error) { - // unimplemented - return nil, nil, fmt.Errorf("unimplemented") + keyPath := make([]byte, t.hashFunction.Len()) + copy(keyPath[:], k) + + path := getPath(t.maxLevels, keyPath) + // go down to the leaf + var siblings [][]byte + _, value, _, err := t.down(k, t.root, siblings, path, 0, true) + if err != nil { + return nil, nil, err + } + leafK, leafV := readLeafValue(value) + if !bytes.Equal(k, leafK) { + panic(fmt.Errorf("%s != %s", BytesToBigInt(k), BytesToBigInt(leafK))) + } + + return leafK, leafV, nil } // CheckProof verifies the given proof. The proof verification depends on the
M tree_test.go → tree_test.go

@@ -145,6 +145,26 @@ err = tree.Add(k, v)

assert.Nil(t, err) } +func TestGet(t *testing.T) { + tree, err := NewTree(memory.NewMemoryStorage(), 100, HashFunctionPoseidon) + require.Nil(t, err) + + defer tree.db.Close() + for i := 0; i < 10; i++ { + k := BigIntToBytes(big.NewInt(int64(i))) + v := BigIntToBytes(big.NewInt(int64(i * 2))) + if err := tree.Add(k, v); err != nil { + t.Fatal(err) + } + } + + k := BigIntToBytes(big.NewInt(int64(7))) + gettedKey, gettedValue, err := tree.Get(k) + assert.Nil(t, err) + assert.Equal(t, k, gettedKey) + assert.Equal(t, BigIntToBytes(big.NewInt(int64(7*2))), gettedValue) +} + func TestGenProofAndVerify(t *testing.T) { tree, err := NewTree(memory.NewMemoryStorage(), 100, HashFunctionPoseidon) require.Nil(t, err)