package util import ( "crypto/sha256" "encoding/binary" "encoding/hex" "golang.org/x/crypto/ripemd160" ) // rev reverses a byte slice. useful for switching endian-ness func rev(b []byte) []byte { r := make([]byte, len(b)) for left, right := 0, len(b)-1; left < right; left, right = left+1, right-1 { r[left], r[right] = b[right], b[left] } return r } func ClaimIDFromOutpoint(txid string, nout int) (string, error) { // convert transaction id to byte array txidBytes, err := hex.DecodeString(txid) if err != nil { return "", err } // reverse (make big-endian) txidBytes = rev(txidBytes) // append nout noutBytes := make([]byte, 4) // num bytes in uint32 binary.BigEndian.PutUint32(noutBytes, uint32(nout)) txidBytes = append(txidBytes, noutBytes...) // sha256 it s := sha256.New() s.Write(txidBytes) // ripemd it r := ripemd160.New() r.Write(s.Sum(nil)) // reverse (make little-endian) res := rev(r.Sum(nil)) return hex.EncodeToString(res), nil }