github.com/lbryio/lbcd@v0.22.119/claimtrie/change/claimid.go (about) 1 package change 2 3 import ( 4 "encoding/binary" 5 "encoding/hex" 6 7 "github.com/lbryio/lbcd/chaincfg/chainhash" 8 "github.com/lbryio/lbcd/wire" 9 btcutil "github.com/lbryio/lbcutil" 10 ) 11 12 // ClaimID represents a Claim's ClaimID. 13 const ClaimIDSize = 20 14 15 type ClaimID [ClaimIDSize]byte 16 17 // NewClaimID returns a Claim ID calculated from Ripemd160(Sha256(OUTPOINT). 18 func NewClaimID(op wire.OutPoint) (id ClaimID) { 19 20 var buffer [chainhash.HashSize + 4]byte // hoping for stack alloc 21 copy(buffer[:], op.Hash[:]) 22 binary.BigEndian.PutUint32(buffer[chainhash.HashSize:], op.Index) 23 copy(id[:], btcutil.Hash160(buffer[:])) 24 return id 25 } 26 27 // NewIDFromString returns a Claim ID from a string. 28 func NewIDFromString(s string) (id ClaimID, err error) { 29 30 if len(s) == 40 { 31 _, err = hex.Decode(id[:], []byte(s)) 32 } else { 33 copy(id[:], s) 34 } 35 for i, j := 0, len(id)-1; i < j; i, j = i+1, j-1 { 36 id[i], id[j] = id[j], id[i] 37 } 38 return id, err 39 } 40 41 // Key is for in-memory maps 42 func (id ClaimID) Key() string { 43 return string(id[:]) 44 } 45 46 // String is for anything written to a DB 47 func (id ClaimID) String() string { 48 49 for i, j := 0, len(id)-1; i < j; i, j = i+1, j-1 { 50 id[i], id[j] = id[j], id[i] 51 } 52 53 return hex.EncodeToString(id[:]) 54 }