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 }