module Tapyrus::Util
tapyrus utility. following methods can be used as follows.
Tapyrus.pack_var_int(5)
Constants
- DIGEST_NAME_SHA256
Public Instance Methods
byte convert to the sequence of bits packed eight in a byte with the least significant bit first.
# File lib/tapyrus/util.rb, line 79 def byte_to_bit(byte) byte.unpack('b*').first end
# File lib/tapyrus/util.rb, line 126 def calc_checksum(hex) double_sha256(hex.htb).bth[0..7] end
decode Base58
check encoding address. @param [String] addr address. @return [Array] hex and address version
# File lib/tapyrus/util.rb, line 109 def decode_base58_address(addr) hex = Base58.decode(addr) if hex.size == 50 && calc_checksum(hex[0...-8]) == hex[-8..-1] unless [Tapyrus.chain_params.address_version, Tapyrus.chain_params.p2sh_version].include?(hex[0..1]) raise 'Invalid version bytes.' end [hex[2...-8], hex[0..1]] elsif hex.size == 116 && calc_checksum(hex[0...-8]) == hex[-8..-1] unless [Tapyrus.chain_params.cp2pkh_version, Tapyrus.chain_params.cp2sh_version].include?(hex[0..1]) raise 'Invalid version bytes.' end [hex[2...-8], hex[0..1]] else raise 'Invalid address.' end end
# File lib/tapyrus/util.rb, line 74 def double_sha256(payload) sha256(sha256(payload)) end
encode Base58
check address. @param [String] hex the address payload. @param [String] addr_version the address version for P2PKH and P2SH. @return [String] Base58
check encoding address.
# File lib/tapyrus/util.rb, line 101 def encode_base58_address(hex, addr_version) base = addr_version + hex Base58.encode(base + calc_checksum(base)) end
generate sha256-ripemd160 hash for value
# File lib/tapyrus/util.rb, line 93 def hash160(hex) Digest::RMD160.hexdigest(Digest::SHA256.digest(hex.htb)) end
# File lib/tapyrus/util.rb, line 132 def hmac_sha256(key, data) OpenSSL::HMAC.digest(DIGEST_NAME_SHA256, key, data) end
# File lib/tapyrus/util.rb, line 61 def pack_boolean(b) b ? [0x01].pack('C') : [0x00].pack('C') end
# File lib/tapyrus/util.rb, line 18 def pack_var_int(i) if i < 0xfd [i].pack('C') elsif i <= 0xffff [0xfd, i].pack('Cv') elsif i <= 0xffffffff [0xfe, i].pack('CV') elsif i <= 0xffffffffffffffff [0xff, i].pack('CQ') else raise "int(#{i}) too large!" end end
# File lib/tapyrus/util.rb, line 9 def pack_var_string(payload) pack_var_int(payload.bytesize) + payload end
padding zero to the left of binary string until bytesize. @param [String] binary string @param [Integer] bytesize total bytesize. @return [String] padded binary string.
# File lib/tapyrus/util.rb, line 87 def padding_zero(binary, bytesize) return binary unless binary.bytesize < bytesize ('00' * (bytesize - binary.bytesize)).htb + binary end
# File lib/tapyrus/util.rb, line 70 def sha256(payload) Digest::SHA256.digest(payload) end
# File lib/tapyrus/util.rb, line 65 def unpack_boolean(payload) data, payload = payload.unpack('Ca*') [(data.zero? ? false : true), payload] end
@return an integer for a valid payload, otherwise nil
# File lib/tapyrus/util.rb, line 33 def unpack_var_int(payload) case payload.unpack('C').first when 0xfd payload.unpack('xva*') when 0xfe payload.unpack('xVa*') when 0xff payload.unpack('xQa*') else payload.unpack('Ca*') end end
@return an integer for a valid payload, otherwise nil
# File lib/tapyrus/util.rb, line 47 def unpack_var_int_from_io(buf) uchar = buf.read(1)&.unpack('C')&.first case uchar when 0xfd buf.read(2)&.unpack('v')&.first when 0xfe buf.read(4)&.unpack('V')&.first when 0xff buf.read(8)&.unpack('Q')&.first else uchar end end
# File lib/tapyrus/util.rb, line 13 def unpack_var_string(payload) size, payload = unpack_var_int(payload) size > 0 ? payload.unpack("a#{size}a*") : [nil, payload] end
check whether addr
is valid address. @param [String] addr an address @return [Boolean] if valid address return true, otherwise false.
# File lib/tapyrus/util.rb, line 139 def valid_address?(addr) begin Tapyrus::Script.parse_from_addr(addr) true rescue Exception => e false end end