3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Bitcoin Indexer with Extended btcd

Posted at

Bitcoin Indexer

BTCのトランザクションで、特定のアドレスに対して入金があったかどうかを調べるために
Bitcoinのブロックデータをパースして mysql に入れられないか調査して見ました。

Golangで実装されているBitcoinのライブラリがうまく拡張できるように実装されていたので、
そちらを利用して追加実装して見ました。

内容

Bitcoinのブロックデータを保存する先を mysql にします。
以下のテーブルにデータを貯めることにします。

-- blocks
drop table if exists `blocks`;
create table `blocks` (
  `id` int(11) not null auto_increment,
  `network` int(11) not null,
  `block_len` int(11) not null,
  `checksum` varchar(8) character set utf8 not null default '',
  `raw_bytes` mediumblob not null,
  `hash` varchar(64) character set utf8 not null default '',
  `height` int(11) not null default 0,
  `block_time` timestamp not null default current_timestamp,
  `created` timestamp not null default current_timestamp,
  `updated` timestamp not null default current_timestamp on update current_timestamp,
  primary key (`id`),
  index idx_blocks_01 (`hash`),
  index idx_blocks_02 (`height`)
) engine=innodb default character set utf8;

-- transaction_outputs
drop table if exists `transaction_outputs`;
create table `transaction_outputs` (
  `id` int(11) not null auto_increment,
  `block_id` int(11) not null,
  `transaction_id` varchar(64) character set utf8 not null default '',
  `amount` bigint not null,
  `pk_script_bytes` mediumblob not null,
  `pk_script_class` tinyint unsigned not null,
  `created` timestamp not null default current_timestamp,
  `updated` timestamp not null default current_timestamp on update current_timestamp,
  primary key (`id`),
  index idx_transaction_outputs_01 (`block_id`),
  index idx_transaction_outputs_02 (`transaction_id`)
) engine=innodb default character set utf8;

-- transaction_output_addresses
drop table if exists `transaction_output_addresses`;
create table `transaction_output_addresses` (
  `id` int(11) not null auto_increment,
  `block_id` int(11) not null,
  `tx_out_id` int(11) not null,
  `address` varchar(255) character set utf8 not null default '',
  `created` timestamp not null default current_timestamp,
  `updated` timestamp not null default current_timestamp on update current_timestamp,
  primary key (`id`),
  index idx_transaction_output_addresses_01 (`address`)
) engine=innodb default character set utf8;

transaction_output_addresses に入金されたアドレスの情報が溜まって行き、そこを監視することで、
入金を確認することができるようになります。

ここに実装した内容が格納されています。

動作確認

build & install

$ go install github.com/btcsuite/btcd

run

docker で mysqlを構築し、user/pass/dbnameなどを適時設定しておく。
その後、btcd.conf を作成して、それをコマンドラインから指定して btcd を起動する

data_dir=`pwd`/data
./btcd --configfile=${data_dir}/btcd.conf --datadir=${data_dir} --logdir=${data_dir}/logs
[Application Options]
testnet=1
dbtype="mysqlldb"
dbrwconnection="user:pass@tcp(127.0.0.1:3306)/dbname"
dbroconnection="user:pass@tcp(127.0.0.1:3306)/dbname"

; ------------------------------------------------------------------------------
; Debug
; ------------------------------------------------------------------------------
debuglevel="debug"

こんな感じで実行すると・・
以下のような感じでデータが取得できる

2018-05-14 22 59 20 2018-05-14 22 59 52 2018-05-14 22 59 39

注意事項

まだテスト段階のソースで、運用実績がありません。 利用は自己責任 でお願いします。また、バグ等の指摘は歓迎しますが、サポートは致しかねる場合があります。

以上になります。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?