mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-26 07:12:16 +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)
59 lines
1.4 KiB
Go
59 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)
|
|
}
|
|
|
|
// 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)
|
|
}
|
|
}
|