View Source BitcoinLib.Key.HD.ExtendedPublic (BitcoinLib v0.1.2)

Bitcoin extended public key management module

Link to this section Summary

Functions

Simply calls from_derivation_path and directly returns the public key whatever the outcome.any() Will crash if the index is negative or greater than 0x7FFFFFFF

Derives the nth child of a HD public key

Deserialization of a public key from its xpub version

Deserialization of a public key from its xpub version

Derives a child public key, following a derivation path

Derives an extended public key from an extended private key. Happens to be the same process as for regular keys.

Computes a public key hash out of a public key

Serialization of a master public key into its xpub version

Serialization of a master public key into its xpub version

Converts the public key to an address of the type specified as the second parameter

Link to this section Functions

Link to this function

derive_child!(public_key, index)

View Source
@spec derive_child!(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  integer()
) :: %BitcoinLib.Key.HD.ExtendedPublic{
  chain_code: term(),
  depth: term(),
  fingerprint: term(),
  index: term(),
  key: term(),
  parent_fingerprint: term()
}

Simply calls from_derivation_path and directly returns the public key whatever the outcome.any() Will crash if the index is negative or greater than 0x7FFFFFFF

examples

Examples

iex> public_key = %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x252C616D91A2488C1FD1F0F172E98F7D1F6E51F8F389B2F8D632A8B490D5F6DA9, ...> chain_code: 0x463223AAC10FB13F291A1BC76BC26003D98DA661CB76DF61E750C139826DEA8B ...> } ...> index = 0 ...> BitcoinLib.Key.HD.ExtendedPublic.derive_child!(public_key, index) %BitcoinLib.Key.HD.ExtendedPublic{

key: 0x30204D3503024160E8303C0042930EA92A9D671DE9AA139C1867353F6B6664E59,
chain_code: 0x05AAE71D7C080474EFAAB01FA79E96F4C6CFE243237780B0DF4BC36106228E31,
depth: 1,
index: 0,
parent_fingerprint: 0x18C1259,
fingerprint: 0x9680603F

}

Link to this function

derive_child(public_key, index)

View Source
@spec derive_child(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  binary()
) ::
  {:ok,
   %BitcoinLib.Key.HD.ExtendedPublic{
     chain_code: term(),
     depth: term(),
     fingerprint: term(),
     index: term(),
     key: term(),
     parent_fingerprint: term()
   }}

Derives the nth child of a HD public key

Takes a public key, its chain code and the child's index Returns the child's public key and it's associated chain code

Inspired by https://learnmeabitcoin.com/technical/extended-keys#child-extended-key-derivation

examples

Examples

iex> public_key = %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x252C616D91A2488C1FD1F0F172E98F7D1F6E51F8F389B2F8D632A8B490D5F6DA9, ...> chain_code: 0x463223AAC10FB13F291A1BC76BC26003D98DA661CB76DF61E750C139826DEA8B ...> } ...> index = 0 ...> BitcoinLib.Key.HD.ExtendedPublic.derive_child(public_key, index) {

:ok,
%BitcoinLib.Key.HD.ExtendedPublic{
  key: 0x30204D3503024160E8303C0042930EA92A9D671DE9AA139C1867353F6B6664E59,
  chain_code: 0x05AAE71D7C080474EFAAB01FA79E96F4C6CFE243237780B0DF4BC36106228E31,
  depth: 1,
  index: 0,
  parent_fingerprint: 0x18C1259,
  fingerprint: 0x9680603F
}

}

Link to this function

deserialize!(serialized_public_key)

View Source
@spec deserialize!(binary()) :: %BitcoinLib.Key.HD.ExtendedPublic{
  chain_code: term(),
  depth: term(),
  fingerprint: term(),
  index: term(),
  key: term(),
  parent_fingerprint: term()
}

Deserialization of a public key from its xpub version

examples

Examples

values from https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vector-1

iex> "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" ...> |> BitcoinLib.Key.HD.ExtendedPublic.deserialize!() %BitcoinLib.Key.HD.ExtendedPublic{

fingerprint: 0x3442193E,
key: 0x339A36013301597DAEF41FBE593A02CC513D0B55527EC2DF1050E2E8FF49C85C2,
chain_code: 0x873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508,
depth: 0,
index: 0,
parent_fingerprint: 0

}

Link to this function

deserialize(serialized_public_key)

View Source
@spec deserialize(binary()) ::
  {:ok,
   %BitcoinLib.Key.HD.ExtendedPublic{
     chain_code: term(),
     depth: term(),
     fingerprint: term(),
     index: term(),
     key: term(),
     parent_fingerprint: term()
   }}
  | {:error, binary()}

Deserialization of a public key from its xpub version

examples

Examples

values from https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vector-1

iex> "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" ...> |> BitcoinLib.Key.HD.ExtendedPublic.deserialize() {

:ok,
%BitcoinLib.Key.HD.ExtendedPublic{
  fingerprint: 0x3442193E,
  key: 0x339A36013301597DAEF41FBE593A02CC513D0B55527EC2DF1050E2E8FF49C85C2,
  chain_code: 0x873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508,
  depth: 0,
  index: 0,
  parent_fingerprint: 0
}

}

Link to this function

from_derivation_path(public_key, derivation_path)

View Source
@spec from_derivation_path(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  %BitcoinLib.Key.HD.DerivationPath{
    account: term(),
    address_index: term(),
    change: term(),
    coin_type: term(),
    purpose: term(),
    type: term()
  }
) ::
  {:ok,
   %BitcoinLib.Key.HD.ExtendedPublic{
     chain_code: term(),
     depth: term(),
     fingerprint: term(),
     index: term(),
     key: term(),
     parent_fingerprint: term()
   }}

Derives a child public key, following a derivation path

examples

Examples

iex> public_key = %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x252C616D91A2488C1FD1F0F172E98F7D1F6E51F8F389B2F8D632A8B490D5F6DA9, ...> chain_code: 0x463223AAC10FB13F291A1BC76BC26003D98DA661CB76DF61E750C139826DEA8B ...> } ...> {:ok, derivation_path} = BitcoinLib.Key.HD.DerivationPath.parse("M/44'/0'/0'/0/0") ...> BitcoinLib.Key.HD.ExtendedPublic.from_derivation_path(public_key, derivation_path) {

:ok,
%BitcoinLib.Key.HD.ExtendedPublic{
  key: 0x29DCAFD0D7D67B13657CC9EE7C8976E141F20F0684BF3FC83CAF068E74186BCDC,
  chain_code: 0x162EEE68F7C3823CAF8BD2615A4A33633673CAAB66FF6F338FB0653FC59D462D,
  depth: 5,
  index: 0,
  parent_fingerprint: 0xCA2A5281,
  fingerprint: 0xAEAAB1AD
}

}

Link to this function

from_private_key(private_key)

View Source
@spec from_private_key(%BitcoinLib.Key.HD.ExtendedPrivate{
  chain_code: term(),
  depth: term(),
  fingerprint: term(),
  index: term(),
  key: term(),
  parent_fingerprint: term()
}) :: {integer(), integer()}

Derives an extended public key from an extended private key. Happens to be the same process as for regular keys.

Inspired by https://learnmeabitcoin.com/technical/hd-wallets#master-private-key

examples

Examples

iex> %BitcoinLib.Key.HD.ExtendedPrivate{ ...> key: 0x081549973BAFBBA825B31BCC402A3C4ED8E3185C2F3A31C75E55F423E9629AA3, ...> chain_code: 0x1D7D2A4C940BE028B945302AD79DD2CE2AFE5ED55E1A2937A5AF57F8401E73DD ...> } ...> |> BitcoinLib.Key.HD.ExtendedPublic.from_private_key() %BitcoinLib.Key.HD.ExtendedPublic{

fingerprint: 0xED104CB8,
key: 0x0343B337DEC65A47B3362C9620A6E6FF39A1DDFA908ABAB1666C8A30A3F8A7CCCC,
chain_code: 0x1D7D2A4C940BE028B945302AD79DD2CE2AFE5ED55E1A2937A5AF57F8401E73DD,
depth: 0,
index: 0,
parent_fingerprint: 0

}

Computes a public key hash out of a public key

examples

Examples

iex> %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x0343B337DEC65A47B3362C9620A6E6FF39A1DDFA908ABAB1666C8A30A3F8A7CCCC, ...> chain_code: 0x1D7D2A4C940BE028B945302AD79DD2CE2AFE5ED55E1A2937A5AF57F8401E73DD ...> } ...> |> BitcoinLib.Key.HD.ExtendedPublic.get_hash() 0xED104CB8EF3ADABEC5D2BE8178C99847F9694269

Link to this function

serialize!(public_key, format \\ :xpub)

View Source

Serialization of a master public key into its xpub version

examples

Examples

values from https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vector-1

iex> %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x339A36013301597DAEF41FBE593A02CC513D0B55527EC2DF1050E2E8FF49C85C2, ...> chain_code: 0x873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508, ...> depth: 0, ...> index: 0, ...> parent_fingerprint: 0 ...> } ...> |> BitcoinLib.Key.HD.ExtendedPublic.serialize!() "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"

Link to this function

serialize(public_key, format \\ :xpub)

View Source
@spec serialize(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  :xpub | :ypub | :zpub
) :: {:ok, binary()} | {:error, binary()}
@spec serialize(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  :xpub | :ypub
) :: binary()

Serialization of a master public key into its xpub version

examples

Examples

values from https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vector-1

iex> %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x339A36013301597DAEF41FBE593A02CC513D0B55527EC2DF1050E2E8FF49C85C2, ...> chain_code: 0x873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508, ...> depth: 0, ...> index: 0, ...> parent_fingerprint: 0 ...> } ...> |> BitcoinLib.Key.HD.ExtendedPublic.serialize() {

:ok,
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"

}

Link to this function

to_address(public_key, type)

View Source
@spec to_address(
  %BitcoinLib.Key.HD.ExtendedPublic{
    chain_code: term(),
    depth: term(),
    fingerprint: term(),
    index: term(),
    key: term(),
    parent_fingerprint: term()
  },
  :p2pkh | :p2sh | :bech32
) :: binary()

Converts the public key to an address of the type specified as the second parameter

examples

Examples

iex> %BitcoinLib.Key.HD.ExtendedPublic{ ...> key: 0x3EB181FB7B5CF63D82307188B20828B83008F2D2511E5C6EDCBE171C63DD2CBC1, ...> chain_code: 0x581F15490635CF8CD0AEEF556562F52C60179E0E87E0EA92977E364D949DC2E4, ...> depth: 0x5, ...> index: 0x0 ...> } ...> |> BitcoinLib.Key.HD.ExtendedPublic.to_address(:p2pkh) "1BRjWnoAVg3EASJHex5YeyDWC1zZ4CA5vc"