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  }