mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-06 08:07:11 +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
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package merkle
|
|
|
|
import (
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
)
|
|
|
|
// SimpleHashFromTwoHashes is the basic operation of the Merkle tree: Hash(left | right).
|
|
func SimpleHashFromTwoHashes(left, right []byte) []byte {
|
|
var hasher = tmhash.New()
|
|
err := encodeByteSlice(hasher, left)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
err = encodeByteSlice(hasher, right)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return hasher.Sum(nil)
|
|
}
|
|
|
|
// SimpleHashFromByteSlices computes a Merkle tree where the leaves are the byte slice,
|
|
// in the provided order.
|
|
func SimpleHashFromByteSlices(items [][]byte) []byte {
|
|
hashes := make([][]byte, len(items))
|
|
for i, item := range items {
|
|
hash := tmhash.Sum(item)
|
|
hashes[i] = hash
|
|
}
|
|
return simpleHashFromHashes(hashes)
|
|
}
|
|
|
|
// SimpleHashFromMap computes a Merkle tree from sorted map.
|
|
// Like calling SimpleHashFromHashers with
|
|
// `item = []byte(Hash(key) | Hash(value))`,
|
|
// sorted by `item`.
|
|
func SimpleHashFromMap(m map[string][]byte) []byte {
|
|
sm := newSimpleMap()
|
|
for k, v := range m {
|
|
sm.Set(k, v)
|
|
}
|
|
return sm.Hash()
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
// Expects hashes!
|
|
func simpleHashFromHashes(hashes [][]byte) []byte {
|
|
// Recursive impl.
|
|
switch len(hashes) {
|
|
case 0:
|
|
return nil
|
|
case 1:
|
|
return hashes[0]
|
|
default:
|
|
left := simpleHashFromHashes(hashes[:(len(hashes)+1)/2])
|
|
right := simpleHashFromHashes(hashes[(len(hashes)+1)/2:])
|
|
return SimpleHashFromTwoHashes(left, right)
|
|
}
|
|
}
|