Skip to content

Commit fbd13d2

Browse files
fix(lib/trie): remove map deletion at loadProof (#2259)
* fix: remove map deletion to every proof hash * chore: use `node` as variable name
1 parent fd9b70d commit fbd13d2

File tree

2 files changed

+73
-10
lines changed

2 files changed

+73
-10
lines changed

lib/trie/database.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ func (t *Trie) loadProof(proofHashToNode map[string]Node, n Node) {
137137
if !ok {
138138
continue
139139
}
140-
delete(proofHashToNode, proofHash)
141140

142141
branch.Children[i] = node
143142
t.loadProof(proofHashToNode, node)

lib/trie/proof_test.go

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,10 @@ func testGenerateProof(t *testing.T, entries []Pair, keys [][]byte) ([]byte, [][
7878
value := trie.Get(key)
7979
require.NotNil(t, value)
8080

81-
itemFromDB := Pair{
81+
items[idx] = Pair{
8282
Key: key,
8383
Value: value,
8484
}
85-
items[idx] = itemFromDB
8685
}
8786

8887
return root, proof, items
@@ -95,23 +94,23 @@ func TestVerifyProof_ShouldReturnTrue(t *testing.T) {
9594
{Key: []byte("alpha"), Value: make([]byte, 32)},
9695
{Key: []byte("bravo"), Value: []byte("bravo")},
9796
{Key: []byte("do"), Value: []byte("verb")},
98-
{Key: []byte("dog"), Value: []byte("puppy")},
99-
{Key: []byte("doge"), Value: make([]byte, 32)},
97+
{Key: []byte("dogea"), Value: []byte("puppy")},
98+
{Key: []byte("dogeb"), Value: []byte("puppy")},
10099
{Key: []byte("horse"), Value: []byte("stallion")},
101100
{Key: []byte("house"), Value: []byte("building")},
102101
}
103102

104103
keys := [][]byte{
105104
[]byte("do"),
106-
[]byte("dog"),
107-
[]byte("doge"),
105+
[]byte("dogea"),
106+
[]byte("dogeb"),
108107
}
109108

110-
root, proof, pl := testGenerateProof(t, entries, keys)
109+
root, proof, pairs := testGenerateProof(t, entries, keys)
110+
v, err := VerifyProof(proof, root, pairs)
111111

112-
v, err := VerifyProof(proof, root, pl)
113-
require.True(t, v)
114112
require.NoError(t, err)
113+
require.True(t, v)
115114
}
116115

117116
func TestVerifyProof_ShouldReturnDuplicateKeysError(t *testing.T) {
@@ -158,3 +157,68 @@ func TestVerifyProof_ShouldReturnTrueWithouCompareValues(t *testing.T) {
158157
require.True(t, v)
159158
require.NoError(t, err)
160159
}
160+
161+
func TestBranchNodes_SameHash_DiferentPaths_GenerateAndVerifyProof(t *testing.T) {
162+
value := []byte("somevalue")
163+
entries := []Pair{
164+
{Key: []byte("d"), Value: value},
165+
{Key: []byte("b"), Value: value},
166+
{Key: []byte("dxyz"), Value: value},
167+
{Key: []byte("bxyz"), Value: value},
168+
{Key: []byte("dxyzi"), Value: value},
169+
{Key: []byte("bxyzi"), Value: value},
170+
}
171+
172+
keys := [][]byte{
173+
[]byte("d"),
174+
[]byte("b"),
175+
[]byte("dxyz"),
176+
[]byte("bxyz"),
177+
[]byte("dxyzi"),
178+
[]byte("bxyzi"),
179+
}
180+
181+
root, proof, pairs := testGenerateProof(t, entries, keys)
182+
183+
ok, err := VerifyProof(proof, root, pairs)
184+
require.NoError(t, err)
185+
require.True(t, ok)
186+
}
187+
188+
func TestLeafNodes_SameHash_DifferentPaths_GenerateAndVerifyProof(t *testing.T) {
189+
tmp := t.TempDir()
190+
191+
memdb, err := chaindb.NewBadgerDB(&chaindb.Config{
192+
InMemory: true,
193+
DataDir: tmp,
194+
})
195+
require.NoError(t, err)
196+
197+
var (
198+
value = []byte("somevalue")
199+
key1 = []byte("worlda")
200+
key2 = []byte("worldb")
201+
)
202+
203+
tt := NewEmptyTrie()
204+
tt.Put(key1, value)
205+
tt.Put(key2, value)
206+
207+
err = tt.Store(memdb)
208+
require.NoError(t, err)
209+
210+
hash, err := tt.Hash()
211+
require.NoError(t, err)
212+
213+
proof, err := GenerateProof(hash.ToBytes(), [][]byte{key1, key2}, memdb)
214+
require.NoError(t, err)
215+
216+
pairs := []Pair{
217+
{Key: key1, Value: value},
218+
{Key: key2, Value: value},
219+
}
220+
221+
ok, err := VerifyProof(proof, hash.ToBytes(), pairs)
222+
require.NoError(t, err)
223+
require.True(t, ok)
224+
}

0 commit comments

Comments
 (0)