BSV-ex v0.1.0 BSV View Source

BSV-ex. Elixir Bitcoin SV library.

The intent of this library is to provide a full-featured BSV library that is broadly comparable in scope to Money Button's BSV Javascript library.

Currently this library offers the following:

  • General crypto functions - wide range of hashing, ECDSA and RSA encryption and signature functions.
  • Bitcoin specific crypto - Electrum-compatible message encryption and signatures.
  • Bitcoin key pair generation and related functions.
  • BIP-39 mnemonic phrase generation and deterministic keys.
  • Raw transaction parsing, manipulation and serialization.

What is NOT in this library:

  • P2P - this is not a full node implementation.

Installation

As this package uses libsecp256k1 NIF bindings, please ensure you have libtool, automake and autogen installed in order for the package to compile.

The package can be installed by adding bsv to your list of dependencies in mix.exs:

def deps do
  [
    {:bsv, "~> 0.1.0"}
  ]
end

Usage

Many examples are demonstrated throught the documentation, but see the following for some quick-start examples:

Key pairs and addresses

For more examples refer to BSV.KeyPair and BSV.Address.

iex> keys = BSV.KeyPair.generate
%BSV.KeyPair{
  network: :main,
  private_key: <<1, 249, 98, 144, 230, 172, 5, 56, 197, 143, 133, 240, 144, 223, 25, 32, 55, 42, 159, 26, 128, 66, 149, 49, 235, 179, 116, 11, 209, 235, 240, 163>>,
  public_key: <<3, 173, 251, 14, 108, 217, 224, 80, 133, 244, 200, 33, 191, 137, 80, 62, 141, 133, 166, 201, 224, 141, 101, 152, 144, 92, 237, 54, 220, 131, 58, 26, 4>>
}

iex> address = BSV.Address.to_string(keys)
"1MzYtHPymTjgxx9npR6Pu9ZCUhtU9hHYTL"

Mnemonic phrase and deterministic keys

For further details and examples refer to BSV.Mnemonic, BSV.Extended.PrivateKey, BSV.Extended.PublicKey and BSV.Extended.Children.

iex> mnemonic = BSV.Mnemonic.generate
"various attitude grain market food wheat arena disagree soccer dust wrestle auction fiber wrestle sort wonder vital gym ill word amazing sniff have biology"

iex> master = BSV.Mnemonic.to_seed(mnemonic)
...> |> BSV.Extended.PrivateKey.from_seed
%BSV.Extended.PrivateKey{
  chain_code: <<164, 12, 192, 154, 59, 209, 85, 172, 76, 7, 42, 138, 247, 125, 161, 30, 135, 25, 124, 160, 170, 234, 126, 162, 228, 146, 135, 232, 67, 181, 219, 91>>,
  child_number: 0,
  depth: 0,
  fingerprint: <<0, 0, 0, 0>>,
  key: <<111, 24, 247, 85, 107, 58, 162, 225, 135, 190, 185, 200, 226, 131, 68, 152, 159, 111, 232, 166, 21, 211, 235, 180, 140, 190, 109, 39, 31, 33, 107, 17>>,
  network: :main,
  version_number: <<4, 136, 173, 228>>
}

iex> child_address = master
...> |> BSV.Extended.Children.derive("m/44'/0'/0'/0/0")
...> |> BSV.Address.to_string
"1F6fuP7HrBY8aeUazXZitaAsgpsJQFfUun"

Creating transactions

For further details and examples refer to BSV.Transaction, BSV.Transaction.Input, BSV.Transaction.Output and BSV.Transaction.Script.

iex> script = %BSV.Transaction.Script{}
...> |> BSV.Transaction.Script.push(:OP_FALSE)
...> |> BSV.Transaction.Script.push(:OP_RETURN)
...> |> BSV.Transaction.Script.push("hello world")
%BSV.Transaction.Script{chunks: [:OP_FALSE, :OP_RETURN, "hello world"]}

iex> output = %BSV.Transaction.Output{script: script}
%BSV.Transaction.Output{
  amount: 0,
  satoshis: 0,
  script: %BSV.Transaction.Script{
    chunks: [:OP_FALSE, :OP_RETURN, "hello world"]
  }
}

iex> tx = %BSV.Transaction{outputs: [output]}
...> |> BSV.Transaction.serialize(encoding: :hex)
"01000000000100000000000000000e006a0b68656c6c6f20776f726c6400000000"