mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-30 09:12:14 +00:00
except now we calculate the max size using the maxPacketMsgSize() function, which frees developers from having to know amino encoding details. plus, 10 additional bytes are added to leave the room for amino upgrades (both making it more efficient / less efficient)
89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
package merkle
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
cmn "github.com/tendermint/tmlibs/common"
|
|
. "github.com/tendermint/tmlibs/test"
|
|
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
"testing"
|
|
)
|
|
|
|
type testItem []byte
|
|
|
|
func (tI testItem) Hash() []byte {
|
|
return []byte(tI)
|
|
}
|
|
|
|
func TestSimpleProof(t *testing.T) {
|
|
|
|
total := 100
|
|
|
|
items := make([]Hasher, total)
|
|
for i := 0; i < total; i++ {
|
|
items[i] = testItem(cmn.RandBytes(tmhash.Size))
|
|
}
|
|
|
|
rootHash := SimpleHashFromHashers(items)
|
|
|
|
rootHash2, proofs := SimpleProofsFromHashers(items)
|
|
|
|
if !bytes.Equal(rootHash, rootHash2) {
|
|
t.Errorf("Unmatched root hashes: %X vs %X", rootHash, rootHash2)
|
|
}
|
|
|
|
// For each item, check the trail.
|
|
for i, item := range items {
|
|
itemHash := item.Hash()
|
|
proof := proofs[i]
|
|
|
|
// Verify success
|
|
ok := proof.Verify(i, total, itemHash, rootHash)
|
|
if !ok {
|
|
t.Errorf("Verification failed for index %v.", i)
|
|
}
|
|
|
|
// Wrong item index should make it fail
|
|
{
|
|
ok = proof.Verify((i+1)%total, total, itemHash, rootHash)
|
|
if ok {
|
|
t.Errorf("Expected verification to fail for wrong index %v.", i)
|
|
}
|
|
}
|
|
|
|
// Trail too long should make it fail
|
|
origAunts := proof.Aunts
|
|
proof.Aunts = append(proof.Aunts, cmn.RandBytes(32))
|
|
{
|
|
ok = proof.Verify(i, total, itemHash, rootHash)
|
|
if ok {
|
|
t.Errorf("Expected verification to fail for wrong trail length.")
|
|
}
|
|
}
|
|
proof.Aunts = origAunts
|
|
|
|
// Trail too short should make it fail
|
|
proof.Aunts = proof.Aunts[0 : len(proof.Aunts)-1]
|
|
{
|
|
ok = proof.Verify(i, total, itemHash, rootHash)
|
|
if ok {
|
|
t.Errorf("Expected verification to fail for wrong trail length.")
|
|
}
|
|
}
|
|
proof.Aunts = origAunts
|
|
|
|
// Mutating the itemHash should make it fail.
|
|
ok = proof.Verify(i, total, MutateByteSlice(itemHash), rootHash)
|
|
if ok {
|
|
t.Errorf("Expected verification to fail for mutated leaf hash")
|
|
}
|
|
|
|
// Mutating the rootHash should make it fail.
|
|
ok = proof.Verify(i, total, itemHash, MutateByteSlice(rootHash))
|
|
if ok {
|
|
t.Errorf("Expected verification to fail for mutated root hash")
|
|
}
|
|
}
|
|
}
|