|
|
|
@ -182,7 +182,7 @@ func TestRangeProof(t *testing.T) { |
|
|
|
|
keys = append(keys, entries[i].k) |
|
|
|
|
vals = append(vals, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err) |
|
|
|
|
} |
|
|
|
@ -233,7 +233,7 @@ func TestRangeProofWithNonExistentProof(t *testing.T) { |
|
|
|
|
keys = append(keys, entries[i].k) |
|
|
|
|
vals = append(vals, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err) |
|
|
|
|
} |
|
|
|
@ -254,7 +254,7 @@ func TestRangeProofWithNonExistentProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), first, last, k, v, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, last, k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal("Failed to verify whole rang with non-existent edges") |
|
|
|
|
} |
|
|
|
@ -289,7 +289,7 @@ func TestRangeProofWithInvalidNonExistentProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), first, k[len(k)-1], k, v, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, k[len(k)-1], k, v, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatalf("Expected to detect the error, got nil") |
|
|
|
|
} |
|
|
|
@ -311,7 +311,7 @@ func TestRangeProofWithInvalidNonExistentProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), k[0], last, k, v, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), k[0], last, k, v, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatalf("Expected to detect the error, got nil") |
|
|
|
|
} |
|
|
|
@ -335,7 +335,7 @@ func TestOneElementRangeProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(entries[start].k, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the first node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), entries[start].k, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), entries[start].k, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -350,7 +350,7 @@ func TestOneElementRangeProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(entries[start].k, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), first, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), first, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -365,7 +365,7 @@ func TestOneElementRangeProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), entries[start].k, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), entries[start].k, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -380,7 +380,7 @@ func TestOneElementRangeProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -399,7 +399,7 @@ func TestOneElementRangeProof(t *testing.T) { |
|
|
|
|
if err := tinyTrie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(tinyTrie.Hash(), first, last, [][]byte{entry.k}, [][]byte{entry.v}, proof) |
|
|
|
|
_, err = VerifyRangeProof(tinyTrie.Hash(), first, last, [][]byte{entry.k}, [][]byte{entry.v}, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -421,7 +421,7 @@ func TestAllElementsProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), nil, nil, k, v, nil) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), nil, nil, k, v, nil) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -434,7 +434,7 @@ func TestAllElementsProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(entries[len(entries)-1].k, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), k[0], k[len(k)-1], k, v, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), k[0], k[len(k)-1], k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -449,7 +449,7 @@ func TestAllElementsProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), first, last, k, v, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), first, last, k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -482,7 +482,7 @@ func TestSingleSideRangeProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), common.Hash{}.Bytes(), k[len(k)-1], k, v, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), common.Hash{}.Bytes(), k[len(k)-1], k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -518,7 +518,7 @@ func TestReverseSingleSideRangeProof(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), k[0], last.Bytes(), k, v, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), k[0], last.Bytes(), k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -590,7 +590,7 @@ func TestBadRangeProof(t *testing.T) { |
|
|
|
|
index = mrand.Intn(end - start) |
|
|
|
|
vals[index] = nil |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatalf("%d Case %d index %d range: (%d->%d) expect error, got nil", i, testcase, index, start, end-1) |
|
|
|
|
} |
|
|
|
@ -624,7 +624,7 @@ func TestGappedRangeProof(t *testing.T) { |
|
|
|
|
keys = append(keys, entries[i].k) |
|
|
|
|
vals = append(vals, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatal("expect error, got nil") |
|
|
|
|
} |
|
|
|
@ -651,7 +651,7 @@ func TestSameSideProofs(t *testing.T) { |
|
|
|
|
if err := trie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatalf("Expected error, got nil") |
|
|
|
|
} |
|
|
|
@ -667,7 +667,7 @@ func TestSameSideProofs(t *testing.T) { |
|
|
|
|
if err := trie.Prove(last, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the last node %v", err) |
|
|
|
|
} |
|
|
|
|
_, _, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof) |
|
|
|
|
_, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatalf("Expected error, got nil") |
|
|
|
|
} |
|
|
|
@ -735,7 +735,7 @@ func TestHasRightElement(t *testing.T) { |
|
|
|
|
k = append(k, entries[i].k) |
|
|
|
|
v = append(v, entries[i].v) |
|
|
|
|
} |
|
|
|
|
_, hasMore, err := VerifyRangeProof(trie.Hash(), firstKey, lastKey, k, v, proof) |
|
|
|
|
hasMore, err := VerifyRangeProof(trie.Hash(), firstKey, lastKey, k, v, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
@ -768,25 +768,19 @@ func TestEmptyRangeProof(t *testing.T) { |
|
|
|
|
if err := trie.Prove(first, 0, proof); err != nil { |
|
|
|
|
t.Fatalf("Failed to prove the first node %v", err) |
|
|
|
|
} |
|
|
|
|
db, _, err := VerifyRangeProof(trie.Hash(), first, nil, nil, nil, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), first, nil, nil, nil, proof) |
|
|
|
|
if c.err && err == nil { |
|
|
|
|
t.Fatalf("Expected error, got nil") |
|
|
|
|
} |
|
|
|
|
if !c.err && err != nil { |
|
|
|
|
t.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
|
// If no error was returned, ensure the returned database contains
|
|
|
|
|
// the entire proof, since there's no value
|
|
|
|
|
if !c.err { |
|
|
|
|
if memdb := db.(*memorydb.Database); memdb.Len() != proof.Len() { |
|
|
|
|
t.Errorf("database entry count mismatch: have %d, want %d", memdb.Len(), proof.Len()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TestBloatedProof tests a malicious proof, where the proof is more or less the
|
|
|
|
|
// whole trie.
|
|
|
|
|
// whole trie. Previously we didn't accept such packets, but the new APIs do, so
|
|
|
|
|
// lets leave this test as a bit weird, but present.
|
|
|
|
|
func TestBloatedProof(t *testing.T) { |
|
|
|
|
// Use a small trie
|
|
|
|
|
trie, kvs := nonRandomTrie(100) |
|
|
|
@ -814,10 +808,8 @@ func TestBloatedProof(t *testing.T) { |
|
|
|
|
trie.Prove(keys[0], 0, want) |
|
|
|
|
trie.Prove(keys[len(keys)-1], 0, want) |
|
|
|
|
|
|
|
|
|
db, _, _ := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) |
|
|
|
|
// The db should not contain anything of the bloated data
|
|
|
|
|
if used := db.(*memorydb.Database); used.Len() != want.Len() { |
|
|
|
|
t.Fatalf("notary proof size mismatch: have %d, want %d", used.Len(), want.Len()) |
|
|
|
|
if _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof); err != nil { |
|
|
|
|
t.Fatalf("expected bloated proof to succeed, got %v", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -921,7 +913,7 @@ func benchmarkVerifyRangeProof(b *testing.B, size int) { |
|
|
|
|
|
|
|
|
|
b.ResetTimer() |
|
|
|
|
for i := 0; i < b.N; i++ { |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, proof) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, proof) |
|
|
|
|
if err != nil { |
|
|
|
|
b.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err) |
|
|
|
|
} |
|
|
|
@ -948,7 +940,7 @@ func benchmarkVerifyRangeNoProof(b *testing.B, size int) { |
|
|
|
|
} |
|
|
|
|
b.ResetTimer() |
|
|
|
|
for i := 0; i < b.N; i++ { |
|
|
|
|
_, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, nil) |
|
|
|
|
_, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, nil) |
|
|
|
|
if err != nil { |
|
|
|
|
b.Fatalf("Expected no error, got %v", err) |
|
|
|
|
} |
|
|
|
|