Skip to content

lihanli/bitcoin_active_record

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bitcoin_active_record

Keep records of sent and received bitcoin transactions in your database using activerecord.

Quick start guide

  • Start bitcoin-qt or bitcoind with these options set in bitcoin.conf
server=1
rpcuser=change_this
rpcpassword=change_this
txindex=1 # needed for getting transaction sender keys
  • Add to gemfile, bundle install
  • Run generator
rails g bitcoin_active_record:install
  • Run db:migrate
  • Create a bitcoin client
client = BitcoinActiveRecord::Client.new(
  server: {
    url: 'http://127.0.0.1:8332',
    username: '',
    password: '',
  },
)
  • Run client.create_received_bitcoin_transactions to create records of received transactions
  • Run client.pay(public_key: public_key, amount: BigDecimal.new(1), comment: 'hello') to send a transaction and save a record of it in the database

Usage

This gem creates 4 models:

btc_address.rb

column_name type description
public_key string public key of a bitcoin address

bitcoin_transaction.rb

column_name type description
btc_address_id integer foreign key
amount decimal transaction amount
txid string bitcoin transaction id

received_bitcoin_transaction.rb

column_name type description
bitcoin_transaction_id integer The btc address associated with this bitcoin transaction id is the address of the person who sent the transaction
btc_address_id integer This is the address in your wallet that the transaction was sent to

sent_bitcoin_transaction.rb

column_name type description
bitcoin_transaction_id integer foreign key

Sent transactions are only recorded if you send them using the gem's api.

BitcoinActiveRecord::Client

Initialize options

client = BitcoinActiveRecord::Client.new(
  # required, bitcoind server credentials
  server: {
    url: 'http://127.0.0.1:8332',
    username: '',
    password: '',
  },
  # optional, amounts less than this will be ignored when running create_received_bitcoin_transactions
  minimum_amount: BigDecimal.new('0.001'),
  # optional, the wallet account you want to look for received transactions in
  account: :foo,
)
  • client.request(method, *args)

Send a request to the bitcoind server.

client.request(:getinfo)
client.request(:sendtoaddress, '1N2ZWQszjGDjaW5y3jAStuJQW23MbG1r4N', BigDecimal.new(1))
  • client.get_new_address

Get a new public key from the server

  • client.get_sender_address(txid)

Get the public key of the transaction sender for a transaction with id txid

  • client.pay

Pay someone and save a record of it as a SentBitcoinTransaction

client.pay(
  # required, public key you want to send BTC to
  public_key: '1N2ZWQszjGDjaW5y3jAStuJQW23MbG1r4N',
  # required, amount in BTC you want to send
  amount: BigDecimal.new('1.23'),
  # optional, transaction comment
  comment: 'foo',
) do |sent_bitcoin_transaction|
  # adding a block is optional
  # modify the sent_bitcoin_transaction record before it gets saved
  sent_bitcoin_transaction.custom_attribute = 'foo'
end
  • client.create_received_bitcoin_transactions

Create a ReceivedBitcoinTransaction model for every transaction from client.account that's >= client.minimum_amount. If the latest transaction is already in the database it will assume all earlier transactions have already been saved.