class Tapyrus::ExtPubkey
BIP-32 Extended public key
Attributes
chain_code[RW]
depth[RW]
number[RW]
parent_fingerprint[RW]
pubkey[RW]
ver[RW]
Public Class Methods
encode_base58(hex)
click to toggle source
from_base58(address)
click to toggle source
import pub key from Base58
private key address
# File lib/tapyrus/ext_key.rb, line 332 def self.from_base58(address) ExtPubkey.parse_from_payload(ExtPubkey.validate_checksum(address)) end
parse_from_payload(payload)
click to toggle source
# File lib/tapyrus/ext_key.rb, line 309 def self.parse_from_payload(payload) buf = StringIO.new(payload) ext_pubkey = ExtPubkey.new ext_pubkey.ver = buf.read(4).bth # version raise ArgumentError, Errors::Messages::INVALID_BIP32_VERSION unless ExtPubkey.support_version?(ext_pubkey.ver) ext_pubkey.depth = buf.read(1).unpack('C').first ext_pubkey.parent_fingerprint = buf.read(4).bth ext_pubkey.number = buf.read(4).unpack('N').first if ext_pubkey.depth == 0 unless ext_pubkey.parent_fingerprint == ExtKey::MASTER_FINGERPRINT raise ArgumentError, Errors::Messages::INVALID_BIP32_FINGERPRINT end raise ArgumentError, Errors::Messages::INVALID_BIP32_ZERO_INDEX if ext_pubkey.number > 0 end if ext_pubkey.parent_fingerprint == ExtKey::MASTER_FINGERPRINT && ext_pubkey.depth > 0 raise ArgumentError, Errors::Messages::INVALID_BIP32_ZERO_DEPTH end ext_pubkey.chain_code = buf.read(32) ext_pubkey.pubkey = Tapyrus::Key.new(pubkey: buf.read(33).bth).pubkey ext_pubkey end
support_version?(version)
click to toggle source
check whether version
is supported version bytes.
# File lib/tapyrus/ext_key.rb, line 359 def self.support_version?(version) p = Tapyrus.chain_params [p.bip49_pubkey_p2wpkh_p2sh_version, p.bip84_pubkey_p2wpkh_version, p.extended_pubkey_version].include?(version) end
validate_checksum(base58)
click to toggle source
Validate address checksum and return payload. @param [String] BIP32 Base58
address @return [String] BIP32 payload with binary format
# File lib/tapyrus/ext_key.rb, line 339 def self.validate_checksum(base58) raw = Base58.decode(base58) raise ArgumentError, Errors::Messages::INVALID_CHECKSUM unless Tapyrus.calc_checksum(raw[0...-8]) == raw[-8..-1] raw[0...-8].htb end
version_from_purpose(purpose)
click to toggle source
get version bytes from purpose' value.
# File lib/tapyrus/ext_key.rb, line 346 def self.version_from_purpose(purpose) v = purpose - Tapyrus::HARDENED_THRESHOLD case v when 49 Tapyrus.chain_params.bip49_pubkey_p2wpkh_p2sh_version when 84 Tapyrus.chain_params.bip84_pubkey_p2wpkh_version else Tapyrus.chain_params.extended_pubkey_version end end
Public Instance Methods
==(other)
click to toggle source
# File lib/tapyrus/ext_key.rb, line 305 def ==(other) to_payload == other.to_payload end
addr()
click to toggle source
get address
# File lib/tapyrus/ext_key.rb, line 230 def addr key.to_p2pkh end
derive(number)
click to toggle source
derive child key
# File lib/tapyrus/ext_key.rb, line 268 def derive(number) new_key = ExtPubkey.new new_key.depth = depth + 1 new_key.number = number new_key.parent_fingerprint = fingerprint raise 'hardened key is not support' if number > (Tapyrus::HARDENED_THRESHOLD - 1) data = pub.htb << [number].pack('N') l = Tapyrus.hmac_sha512(chain_code, data) left = l[0..31].bth.to_i(16) raise 'invalid key' if left >= CURVE_ORDER p1 = Tapyrus::Key.new(priv_key: left.to_s(16), key_type: Tapyrus::Key::TYPES[:uncompressed]).to_point p2 = Tapyrus::Key.new(pubkey: pubkey, key_type: key_type).to_point new_key.pubkey = (p1 + p2).to_hex new_key.chain_code = l[32..-1] new_key.ver = version new_key end
fingerprint()
click to toggle source
get fingerprint
# File lib/tapyrus/ext_key.rb, line 246 def fingerprint identifier.slice(0..7) end
hardened?()
click to toggle source
whether hardened key.
# File lib/tapyrus/ext_key.rb, line 263 def hardened? number >= Tapyrus::HARDENED_THRESHOLD end
hash160()
click to toggle source
# File lib/tapyrus/ext_key.rb, line 225 def hash160 Tapyrus.hash160(pub) end
identifier()
click to toggle source
get key identifier
# File lib/tapyrus/ext_key.rb, line 241 def identifier Tapyrus.hash160(pub) end
key()
click to toggle source
get key object @return [Tapyrus::Key]
# File lib/tapyrus/ext_key.rb, line 236 def key Tapyrus::Key.new(pubkey: pubkey, key_type: key_type) end
key_type()
click to toggle source
get key type defined by BIP-178 using version.
# File lib/tapyrus/ext_key.rb, line 293 def key_type v = version case v when Tapyrus.chain_params.bip49_pubkey_p2wpkh_p2sh_version Tapyrus::Key::TYPES[:p2wpkh_p2sh] when Tapyrus.chain_params.bip84_pubkey_p2wpkh_version Tapyrus::Key::TYPES[:p2wpkh] when Tapyrus.chain_params.extended_pubkey_version Tapyrus::Key::TYPES[:compressed] end end
master?()
click to toggle source
# File lib/tapyrus/ext_key.rb, line 364 def master? depth == 0 && number == 0 && parent_fingerprint == '00000000' end
pub()
click to toggle source
# File lib/tapyrus/ext_key.rb, line 221 def pub pubkey end
to_base58()
click to toggle source
Base58
encoded extended pubkey
# File lib/tapyrus/ext_key.rb, line 251 def to_base58 ExtPubkey.encode_base58(to_hex) end
to_payload()
click to toggle source
serialize extended pubkey
# File lib/tapyrus/ext_key.rb, line 217 def to_payload version.htb << [depth].pack('C') << parent_fingerprint.htb << [number].pack('N') << chain_code << pub.htb end
version()
click to toggle source
get version bytes using serialization format
# File lib/tapyrus/ext_key.rb, line 287 def version return ExtPubkey.version_from_purpose(number) if depth == 1 ver ? ver : Tapyrus.chain_params.extended_pubkey_version end