github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/mmr/hasher.go (about)

     1  package mmr
     2  
     3  import "crypto/sha256"
     4  
     5  // HashType can be replaced by https://github.com/zhiqiangxu/gg
     6  type HashType [32]byte
     7  
     8  // Hasher for mmr
     9  type Hasher interface {
    10  	Empty() HashType
    11  	Leaf(data []byte) HashType
    12  	Node(left, right HashType) HashType
    13  }
    14  
    15  type hasher32 struct {
    16  	leafPrefix []byte
    17  	nodePrefix []byte
    18  }
    19  
    20  // NewHasher creates a Hasher
    21  func NewHasher(leafPrefix, nodePrefix []byte) Hasher {
    22  	return &hasher32{leafPrefix: leafPrefix, nodePrefix: nodePrefix}
    23  }
    24  
    25  func (self *hasher32) Empty() HashType {
    26  	return sha256.Sum256(nil)
    27  }
    28  
    29  func (self *hasher32) Leaf(leaf []byte) HashType {
    30  	data := append([]byte{}, self.leafPrefix...)
    31  	data = append(data, leaf...)
    32  	return sha256.Sum256(data)
    33  }
    34  
    35  func (self *hasher32) Node(left, right HashType) HashType {
    36  	data := append([]byte{}, self.nodePrefix...)
    37  	data = append(data, left[:]...)
    38  	data = append(data, right[:]...)
    39  	return sha256.Sum256(data)
    40  }