github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/crypto/merkle/hash.go (about)

     1  package merkle
     2  
     3  import (
     4  	"hash"
     5  
     6  	"github.com/lazyledger/lazyledger-core/crypto/tmhash"
     7  )
     8  
     9  // TODO: make these have a large predefined capacity
    10  var (
    11  	leafPrefix  = []byte{0}
    12  	innerPrefix = []byte{1}
    13  )
    14  
    15  // returns tmhash(<empty>)
    16  func emptyHash() []byte {
    17  	return tmhash.Sum([]byte{})
    18  }
    19  
    20  // returns tmhash(0x00 || leaf)
    21  func leafHash(leaf []byte) []byte {
    22  	return tmhash.Sum(append(leafPrefix, leaf...))
    23  }
    24  
    25  // returns tmhash(0x00 || leaf)
    26  func leafHashOpt(s hash.Hash, leaf []byte) []byte {
    27  	s.Reset()
    28  	s.Write(leafPrefix)
    29  	s.Write(leaf)
    30  	return s.Sum(nil)
    31  }
    32  
    33  // returns tmhash(0x01 || left || right)
    34  func innerHash(left []byte, right []byte) []byte {
    35  	return tmhash.Sum(append(innerPrefix, append(left, right...)...))
    36  }
    37  
    38  func innerHashOpt(s hash.Hash, left []byte, right []byte) []byte {
    39  	s.Reset()
    40  	s.Write(innerPrefix)
    41  	s.Write(left)
    42  	s.Write(right)
    43  	return s.Sum(nil)
    44  }