mirror of
https://github.com/fluencelabs/tendermint
synced 2025-08-01 04:31:57 +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)
|
|
}
|
|
}
|