exbtc v0.1.2 Exbtc

Exbtc

This project has a set of ECC utils that are ported from the Pybitcointools. The port is complete over the core functions, but lacks the transaction and electrum utils.

Example usage in IEx

Key encoding and decoding

iex(1)> alias Exbtc.Core, as: BtcCore
Exbtc.Core
iex(2)> private_key_hex = "3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa6"
"3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa6"
iex(3)> decoded_private_key = BtcCore.decode_privkey(private_key_hex)
26563230048437957592232553826663696440606756685920117476832299673293013768870
iex(4)> private_key = BtcCore.decode_privkey(private_key_hex)
26563230048437957592232553826663696440606756685920117476832299673293013768870
iex(5)> private_key_wif = BtcCore.encode_privkey(private_key, "wif")
"5JG9hT3beGTJuUAmCQEmNaxAuMacCTfXuw1R3FCXig23RQHMr4K"
iex(6)> private_key_wif_compressed = BtcCore.encode_privkey(private_key, "wif_compressed")
"KyBsPXxTuVD82av65KZkrGrWi5qLMah5SdNq6uftawDbgKa2wv6S"
iex(7)> private_key_hex_compressed = BtcCore.encode_privkey(private_key, "hex_compressed")
"3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa601"
iex(8)> pub_key = BtcCore.privkey_to_pubkey(private_key)
{41637322786646325214887832269588396900663353932545912953362782457239403430124,
 16388935128781238405526710466724741593761085120864331449066658622400339362166}
iex(9)> pub_key = BtcCore.privkey_to_address(private_key)
"1thMirt546nngXqyPEz532S8fLwbozud8"
iex(10)> pub_key = BtcCore.privkey_to_pubkey(private_key_wif)
"045c0de3b9c8ab18dd04e3511243ec2952002dbfadc864b9628910169d9b9b00ec243bcefdd4347074d44bd7356d6a53c495737dd96295e2a9374bf5f02ebfc176"
iex(11)> BtcCore.pubkey_to_address(pub_key)
"1thMirt546nngXqyPEz532S8fLwbozud8"

ECDSA

iex(2)> alias Exbtc.Core, as: BtcCore
Exbtc.Core
iex(3)> priv_key = BtcCore.random_key()
"5697fc127aec13cf59f971c3acac154e6f949468a7b45be555c7068b333907c9"
iex(4)> pub_key = BtcCore.privkey_to_pubkey(priv_key)
"040037c95bae0ecd368d0b9dcc47f0f6d17c008443be3c77dfc62af7b49b8271d22fb6d302519c550cffd69e5922f7408ae00d3cc0051021efaa8c814a596c6315"
iex(5)> msg = "hello world!"
"hello world!"
iex(6)> signature = BtcCore.ecdsa_sign(msg, priv_key)
"G4Xf2Y5mozpgPGua1KHqeCUeNFjhmFn6NOlanC+X0l/vFDxKYy3oz/So4F6BPmjMDitjrOAKt3dtlEJa5G9+Kbo="
iex(7)> address = BtcCore.privkey_to_address(priv_key)
"1Q44VRuHh1eK6eSjXL4cr6FuZE6SNHM3th"
iex(8)> BtcCore.ecdsa_verify(msg, signature, address)
true
iex(9)> BtcCore.ecdsa_verify(msg, signature, pub_key)
true

For more usage, please refer to the test cases in test/core_test.exs.

Example usage for your project

# mix.exs
defmodule ExbtcEg.Mixfile do
  use Mix.Project

  def project do
    [
      app: :exbtc_eg,
      version: "0.1.0",
      elixir: "~> 1.5",
      start_permanent: Mix.env == :prod,
      deps: deps()
    ]
  end

  # ...
  defp deps do
    [
      { :exbtc, "~> 0.1.0" }
    ]
  end
end

In the application code somewhere, e.g. lib/ExbtcEg.ex

defmodule ExbtcEg do
  alias Exbtc.Core, as: ExbtcCore

  def hello do
    p1 = "14ba671a90d51bbe75fe23f4e91bd63ced567adf68e9802fb16d7cbfca1f5f05"
    msg = "it is cool"
    sig = ExbtcCore.ecdsa_sign(msg, p1)
  end
end

Installation

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

def deps do
  [
    {:exbtc, "~> 0.1.1"}
  ]
end

The docs can be found at https://hexdocs.pm/exbtc.