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 { switch len(items) { case 0: return nil case 1: return tmhash.Sum(items[0]) default: left := SimpleHashFromByteSlices(items[:(len(items)+1)/2]) right := SimpleHashFromByteSlices(items[(len(items)+1)/2:]) return simpleHashFromTwoHashes(left, right) } } // 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() }