Bitcoin-Crypto
view release on metacpan or search on metacpan
lib/Bitcoin/Crypto/Key/ExtPrivate.pm view on Meta::CPAN
# child number - 4 bytes
$hmac_data .= ensure_length pack('N', $child_num), 4;
my $data = hmac('SHA512', $self->chain_code, $hmac_data);
my $tweak = substr $data, 0, 32;
my $chain_code = substr $data, 32, 32;
Bitcoin::Crypto::Exception::KeyDerive->trap_into(
sub {
$key = ecc->add_private_key($key, $tweak);
die_no_trace 'verification failed' unless ecc->verify_private_key($key);
},
"key $child_num in sequence was found invalid"
);
return $self->new(
_key_instance => $key,
chain_code => $chain_code,
child_number => $child_num,
parent_fingerprint => $self->get_fingerprint,
depth => $self->depth + 1,
);
}
1;
__END__
=head1 NAME
Bitcoin::Crypto::Key::ExtPrivate - Bitcoin extended private keys
=head1 SYNOPSIS
use Bitcoin::Crypto qw(btc_extprv);
use Bitcoin::Crypto::Util qw(generate_mnemonic to_format)
# generate mnemonic words first
my $mnemonic = generate_mnemonic;
print "Your mnemonic is: $mnemonic";
# create ExtPrivateKey from mnemonic (without password)
my $key = btc_extprv->from_mnemonic($mnemonic);
my $ser_key = to_format [base58 => $key->to_serialized];
print "Your exported master key is: $ser_key";
# derive child private key
my $path = "m/0'";
my $child_key = $key->derive_key($path);
my $ser_child_key = to_format [base58 => $child_key->to_serialized];
print "Your exported $path child key is: $ser_child_key";
# create basic keypair
my $basic_private = $child_key->get_basic_key;
my $basic_public = $child_key->get_public_key->get_basic_key;
=head1 DESCRIPTION
This class allows you to create an extended private key instance. Extended keys
can be used to securely generate as many addresses as needed through key
derivation. This allows for long-term, reusable wallet with a single backup.
Moreover, you can use an extended private key to:
=over
=item * generate extended public keys
=item * derive extended keys using standard bip44 or a custom path
=item * restore keys from mnemonic codes, seeds and serialized form
=back
=head1 INTERFACE
=head2 Attributes
=head3 network
Instance of L<Bitcoin::Crypto::Network> - current network for this key. Can be
coerced from network id. Default: current default network.
I<writer:> C<set_network>
=head3 purpose
BIP44 purpose which was used to obtain this key. Filled automatically when
deriving an extended key. If the key was not obtained through BIP44 derivation,
this attribute is C<undef>.
I<writer:> C<set_purpose>
I<clearer:> C<clear_purpose>
=head3 depth
Integer - depth of derivation. Default: C<0> (master key)
=head3 parent_fingerprint
Bytestring of length 4 - fingerprint of the parent key. Default: four zero bytes
=head3 child_number
Integer - sequence number of the key on the current L</depth>. Default: C<0>
=head3 chain_code
Bytestring of length 32 - chain code of the extended key.
=head2 Methods
=head3 new
Constructor is reserved for internal and advanced use only. Use
L</from_mnemonic>, L</from_seed> or L</from_serialized> instead.
=head3 from_mnemonic
$key_object = $class->from_mnemonic($mnemonic, $password = '', $lang = undef)
( run in 1.227 second using v1.01-cache-2.11-cpan-39bf76dae61 )