[lbry] chaincfg: implement LBRY PoW Hash

This commit is contained in:
Roy Lee 2018-05-28 19:46:51 -07:00
parent a5050cf2de
commit d7bfc9c077

View file

@ -5,7 +5,12 @@
package chainhash package chainhash
import "crypto/sha256" import (
"crypto/sha256"
"crypto/sha512"
"golang.org/x/crypto/ripemd160"
)
// HashB calculates hash(b) and returns the resulting bytes. // HashB calculates hash(b) and returns the resulting bytes.
func HashB(b []byte) []byte { func HashB(b []byte) []byte {
@ -31,3 +36,26 @@ func DoubleHashH(b []byte) Hash {
first := sha256.Sum256(b) first := sha256.Sum256(b)
return Hash(sha256.Sum256(first[:])) return Hash(sha256.Sum256(first[:]))
} }
// LbryPoWHashH calculates returns the PoW Hash.
//
// doubled := SHA256(SHA256(b))
// expanded := SHA512(doubled)
// left := RIPEMD160(expanded[0:32])
// right := RIPEMD160(expanded[32:64])
// result := SHA256(SHA256(left||right))
func LbryPoWHashH(b []byte) Hash {
doubled := DoubleHashB(b)
expanded := sha512.Sum512(doubled)
r := ripemd160.New()
r.Reset()
r.Write(expanded[:sha256.Size])
left := r.Sum(nil)
r.Reset()
r.Write(expanded[sha256.Size:])
combined := r.Sum(left)
return DoubleHashH(combined)
}