BTCRuby
BTCRuby aims at clarity, security and flexibility. The API is designed simultenously with CoreBitcoin (Objective-C library) and polished on real-life applications.
Documentation and Examples
Please see BTCRuby Reference for API documentation and examples.
Basic Features
- Encoding/decoding of addresses, WIF private keys (
BTC::Address
). - APIs to construct and inspect blocks, transactions and scripts.
- Native BIP32 and BIP44 ("HW Wallets") support (see
BTC::Keychain
). - Explicit APIs to handle compressed and uncompressed public keys.
- Explicit APIs to handle mainnet/testnet (see
BTC::Network
) - Consistent API for data encoding used throughout the library itself (see
BTC::Data
andBTC::WireFormat
). - Flexible transaction builder that can work with arbitrary data sources that provide unspent outputs.
- Handy extensions on built-in classes (e.g.
String#to_hex
) are optional (seeextensions.rb
). - Optional attributes on Transaction, TransactionOutput and TransactionInput to hold additional data provided by 3rd party APIs.
Advanced Features
- ECDSA signatures are deterministic and normalized according to RFC6979 and BIP62.
- Automatic normalization of existing ECDSA signatures (see
BTC::Key#normalized_signature
). - Rich script analysis and compositing support (see
BTC::Script
). - Full script interpreter with P2SH and CLTV features.
- Powerful diagnostics API covering the entire library (see
BTC::Diagnostics
). - Canonicality checks for transactions, public keys and script elements.
- Fee computation and signature script simulation for building transactions without signing them.
- Complete OpenAssets implementation: validating OpenAssets transactions, easy to use transaction builder, API for handling Asset Definition.
Philosophy
- We use clear, expressive names for all methods and classes.
- Self-contained implementation. Only external dependency is
ffi
gem that helps linking directly with OpenSSL and libsecp256k1. - For efficiency and consistency we use binary strings throughout the library (not the hex strings as in other libraries).
- We do not pollute standard classes with our methods. To use utility extensions like
String#to_hex
you should explicitlyrequire 'btcruby/extensions'
. - We use OpenSSL
BIGNUM
implementation where compatibility is critical (instead of the built-in Ruby Bignum). - We enforces canonical and determinstic ECDSA signatures for maximum compatibility and security using native OpenSSL functions.
- We treat endianness explicitly. Even though most systems are little-endian, it never hurts to show where endianness is important.
The goal is to provide a complete Bitcoin toolkit in Ruby.
How to run tests
$ bundle install
$ brew install ./vendor/homebrew/secp256k1.rb
$ rake
How to publish a gem
- Edit version.rb to bump the version.
- Update
RELEASE_NOTES.md
. - Commit changes and tag it with new version.
- Generate and publish the gem:
$ git tag VERSION
$ git push origin --tags
$ gem build btcruby.gemspec
$ gem push btcruby-VERSION.gem