// Code extracted from vendor/github.com/ethereum/go-ethereum/common/types.go package statusproto import ( "encoding/hex" ) const ( // HashLength is the expected length of the hash HashLength = 32 ) // Hash represents the 32 byte Keccak256 hash of arbitrary data. type Hash [HashLength]byte // Encode encodes b as a hex string with 0x prefix. func encode(b []byte) string { enc := make([]byte, len(b)*2+2) copy(enc, "0x") hex.Encode(enc[2:], b) return string(enc) } // has0xPrefix validates str begins with '0x' or '0X'. func has0xPrefix(str string) bool { return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X') } // Hex2Bytes returns the bytes represented by the hexadecimal string str. func Hex2Bytes(str string) []byte { h, _ := hex.DecodeString(str) return h } // FromHex returns the bytes represented by the hexadecimal string s. // s may be prefixed with "0x". func FromHex(s string) []byte { if has0xPrefix(s) { s = s[2:] } if len(s)%2 == 1 { s = "0" + s } return Hex2Bytes(s) } // HexToHash sets byte representation of s to hash. // If b is larger than len(h), b will be cropped from the left. func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) } // Hex converts a hash to a hex string. func (h *Hash) Hex() string { return encode(h[:]) } // Bytes gets the byte representation of the underlying hash. func (h Hash) Bytes() []byte { return h[:] } // String implements the stringer interface and is used also by the logger when // doing full logging into a file. func (h *Hash) String() string { return h.Hex() } // SetBytes sets the hash to the value of b. // If b is larger than len(h), b will be cropped from the left. func (h *Hash) SetBytes(b []byte) { if len(b) > len(h) { b = b[len(b)-HashLength:] } copy(h[HashLength-len(b):], b) } // BytesToHash sets b to hash. // If b is larger than len(h), b will be cropped from the left. func BytesToHash(b []byte) Hash { var h Hash h.SetBytes(b) return h }