mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 14:52:17 +00:00
59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
|
package merkle
|
||
|
|
||
|
import (
|
||
|
"github.com/tendermint/go-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)
|
||
|
}
|
||
|
|
||
|
// SimpleHashFromHashers computes a Merkle tree from items that can be hashed.
|
||
|
func SimpleHashFromHashers(items []Hasher) []byte {
|
||
|
hashes := make([][]byte, len(items))
|
||
|
for i, item := range items {
|
||
|
hash := item.Hash()
|
||
|
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]Hasher) []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)
|
||
|
}
|
||
|
}
|