bitcoin-ruby 0,0 travis-ci ruby Rubygems

bitcoin utils and protocol in ruby.

= Bitcoin-ruby {}[] {Inline docs}[] {tip for next commit}[]

This is a ruby library for interacting with the bitcoin protocol/network.

Some of the main features are:

  • Bitcoin::Util provides the basic bitcoin utility functions for base58, ECC, etc.
  • Bitcoin::Protocol can parse/create all protocol messages
  • Bitcoin::Script implementation, create/run scripts and verify signatures
  • Bitcoin::Key provides a high-level API for creating and handling keys/addresses
  • Bitcoin::Builder provides a high-level API for creating transactions (and blocks)
  • Bitcoin::Litecoin implements all the litecoin-specific differences

== Related Projects

== Compatible with…

  • ruby 1.9.3
  • ruby 2.0.0
  • ruby 2.1.2
  • ruby 2.2.0
  • ruby 2.2.2

== Installation

We assume you already have a ruby 1.9 or 2.0 compatible interpreter and rubygems environment.

git clone; cd bitcoin-ruby

if you want to have it available system-wide, just build the gem and install it:

gem build bitcoin-ruby.gemspec && gem install bitcoin-ruby-0.0.5.gem

Note that some aspects of the library (such as networking, storage, etc.) need additional dependencies which are not specified in the gemspec. The core requirements are intentionally kept to a minimum, so nobody has to install unneeded dependencies.

  • +bacon+ to run the specs
  • +scrypt+ to use a much faster scrypt hash implementation for Litecoin

If you would like to install using Bundler, put it in your Gemfile and run bundle install gem ‘bitcoin-ruby’, git: ‘’, branch: ‘master’, require: ‘bitcoin’

== Library Usage

There are different aspects to the library which can be used separately or in combination. Here are some ideas of what you could do. There are also some demo scripts in examples/, see EXAMPLES.

=== Keys/Addresses

Generate a Bitcoin::Key

key = Bitcoin::generate_key key #=> [, ]

Get the address from a public key

address = Bitcoin::pubkey_to_address(key[1]) address #=>

Check if an address is valid

Bitcoin::valid_address?(address) #=> true

=== Blocks / Transactions parsing

Parse a Bitcoin::Protocol::Block

raw_block =‘spec/bitcoin/fixtures/rawblock-0.bin’, ‘rb’) {|f|} blk = blk.hash #=> 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 blk.tx.count #=> 1 blk.to_hash #=> … Bitcoin::Protocol::Block.from_json( blk.to_json )

Parse a Bitcoin::Protocol::Tx

raw_tx =‘spec/bitcoin/fixtures/rawtx-01.bin’, ‘rb’) {|f|} tx = tx.hash #=> 6e9dd16625b62cfcd4bf02edb89ca1f5a8c30c4b1601507090fb28e59f2d02b4 #=> 1 tx.out.size #=> 2 tx.to_hash #=> … Bitcoin::Protocol::Tx.from_json( tx.to_json )[0].pk_script).to_string #=> “OP_DUP OP_HASH160 b2e21c1db922e3bdc529de7b38b4c401399e9afd OP_EQUALVERIFY OP_CHECKSIG”

=== Transaction verification / Scripts

Get the matching transactions (in this example tx1 is the spending transaction)

rawtx1 =“spec/bitcoin/fixtures/rawtx-f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16.bin”, ‘rb’) {|f|} rawtx2 =“spec/bitcoin/fixtures/rawtx-0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9.bin”, ‘rb’) {|f|} tx1 = tx2 =

Then simply ask the transaction to verify an input

tx1.verify_input_signature(0, tx2) #=> true

=== Scripts

If you want to control the Bitcoin::Script yourself, you can do so

txin = txout = tx2.out[txin.prev_out_index] script = + txout.pk_script)

result = do |pubkey, sig, hash_type| hash = tx1.signature_hash_for_input(0, nil, txout.pk_script) Bitcoin.verify_signature(hash, sig, pubkey.unpack(“H*”)[0]) end result #=> true

=== Create Transactions

You need to know the previous output you want to spend (tx hash and output index), as well as the private key for the address required to sign for it.

# use testnet so you don’t accidentally blow your whole money! = :testnet3

# make the DSL methods available in your scope include Bitcoin::Builder

# the previous transaction that has an output to your address prev_hash = “6c44b284c20fa22bd69c57a9dbff91fb71deddc8c54fb2f5aa41fc78c96c1ad1”

# the number of the output you want to use prev_out_index = 0

# fetch the tx from whereever you like and parse it prev_tx = Bitcoin::P::Tx.from_json(open(”{prev_hash}.json”))

# the key needed to sign an input that spends the previous output key = Bitcoin::Key.from_base58(“92ZRu28m2GHSKaaF2W7RswJ2iJYpTzVhBaN6ZLs7TENCs4b7ML8”)

# create a new transaction (and sign the inputs) new_tx = build_tx do |t|

# add the input you picked out earlier t.input do |i| i.prev_out prev_tx i.prev_out_index prev_out_index i.signature_key key end

# add an output that sends some bitcoins to another address t.output do |o| o.value 50000000 # 0.5 BTC in satoshis o.script {|s| s.recipient “mugwYJ1sKyr8EDDgXtoh8sdDQuNWKYNf88” } end

# add another output spending the remaining amount back to yourself # if you want to pay a tx fee, reduce the value of this output accordingly # if you want to keep your financial history private, use a different address t.output do |o| o.value 49000000 # 0.49 BTC, leave 0.01 BTC as fee o.script {|s| s.recipient key.addr } end


# examine your transaction. you can relay it through # that will also give you a hint on the error if something goes wrong puts new_tx.to_json

== Documentation

Always trying to improve, any help appreciated! If anything is unclear to you, let us know!

Documentation is generated using yardoc:

rake doc

The specs are also a good place to see how something works.

== Specs

The specs can be run with

rake bacon

or, if you want to run a single spec

ruby spec/bitcoin/bitcoin_spec.rb

If you make changes to the code or add functionality, please also add specs.

== Development

Any help or feedback is greatly appreciated! From getting knee-deep into elliptic-curve acrobatics, to cleaning up high-level naming conventions, there is something for everyone to do. Even if you are completely lost, just pointing out what is unclear helps a lot!

If you are curious or like to participate in development, drop by #bitcoin-ruby on!

== License

Available here: [link:COPYING]

Related Repositories



bitcoin utils and protocol in ruby. ...



Provides a Ruby library to the complete Bitcoin JSON-RPC API. Implements all methods listed at . ...



A Ruby implementation of Bitcoin HD Wallets (Hierarchical Deterministic) BIP32 ...



Powerful, flexible, lightweight SDK for the BitPay Bitcoin Payment Gateway API. ...



A Ruby-On-Rails-based Bitcoin Item listing and marketplace system ...

Top Contributors

mhanne lian comboy oleganza rnicoll tarix coblee shaulkf isaacwaldron aalness AlexChien aduffeck wtogami jbaudanza kubicek sowbug benhc123 obale kevincb maran fanquake altamic PeterDaveHello tmsrjs weilu pienkowb sgarciac halorgium indirect assafshomer


-   v0.0.7 zip tar
-   v0.0.6 zip tar
-   v0.0.5 zip tar
-   v0.0.4 zip tar
-   v0.0.3 zip tar
-   v0.0.2 zip tar
-   v0.0.1 zip tar