mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-09 05:22:13 +00:00
* crypto/merkle: Remove byter in favor of plain byte slices This PR is fully backwards compatible in terms of function output! (The Go API differs though) The only test case changes was to refactor it to be table driven. * Update godocs per review comments
73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
package merkle
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
cmn "github.com/tendermint/tendermint/libs/common"
|
|
. "github.com/tendermint/tendermint/libs/test"
|
|
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
)
|
|
|
|
type testItem []byte
|
|
|
|
func (tI testItem) Hash() []byte {
|
|
return []byte(tI)
|
|
}
|
|
|
|
func TestSimpleProof(t *testing.T) {
|
|
|
|
total := 100
|
|
|
|
items := make([][]byte, total)
|
|
for i := 0; i < total; i++ {
|
|
items[i] = testItem(cmn.RandBytes(tmhash.Size))
|
|
}
|
|
|
|
rootHash := SimpleHashFromByteSlices(items)
|
|
|
|
rootHash2, proofs := SimpleProofsFromByteSlices(items)
|
|
|
|
require.Equal(t, rootHash, rootHash2, "Unmatched root hashes: %X vs %X", rootHash, rootHash2)
|
|
|
|
// For each item, check the trail.
|
|
for i, item := range items {
|
|
itemHash := tmhash.Sum(item)
|
|
proof := proofs[i]
|
|
|
|
// Check total/index
|
|
require.Equal(t, proof.Index, i, "Unmatched indicies: %d vs %d", proof.Index, i)
|
|
|
|
require.Equal(t, proof.Total, total, "Unmatched totals: %d vs %d", proof.Total, total)
|
|
|
|
// Verify success
|
|
err := proof.Verify(rootHash, itemHash)
|
|
require.NoError(t, err, "Verificatior failed: %v.", err)
|
|
|
|
// Trail too long should make it fail
|
|
origAunts := proof.Aunts
|
|
proof.Aunts = append(proof.Aunts, cmn.RandBytes(32))
|
|
err = proof.Verify(rootHash, itemHash)
|
|
require.Error(t, err, "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]
|
|
err = proof.Verify(rootHash, itemHash)
|
|
require.Error(t, err, "Expected verification to fail for wrong trail length")
|
|
|
|
proof.Aunts = origAunts
|
|
|
|
// Mutating the itemHash should make it fail.
|
|
err = proof.Verify(rootHash, MutateByteSlice(itemHash))
|
|
require.Error(t, err, "Expected verification to fail for mutated leaf hash")
|
|
|
|
// Mutating the rootHash should make it fail.
|
|
err = proof.Verify(MutateByteSlice(rootHash), itemHash)
|
|
require.Error(t, err, "Expected verification to fail for mutated root hash")
|
|
}
|
|
}
|