[bitcoin]自分のsignetを立てよう
はじめに
以前、自分で設定したsignetを立てようとして失敗した。Bitcoin Core v0.21.0のときだ。
原因は、v0.21.0ではブロック生成をするときにmainnetと同じルートを通ってしまうため実行できなかったためである。
先日v0.22.0がリリースされた。
このバージョンではtestチェーンかどうかの判定が行われるようになっている。つまり自分でブロック生成することができるようになった。
手順
おおよその手順はこうなる。
- Bitcoin Coreのコードをcloneしてv0.22.0をcheckoutする
- ビルドする(2021/09/26 22:52 ビルドは必須ではない)
- アドレスを生成して、秘密鍵、公開鍵を取得
- bitcoin.confにブロック生成のchallangeを追記
- bitcoindを立ち上げる
- contrib/signetにあるスクリプトを使ってブロック生成する
やり方は違うのだが、雰囲気としてはElementsに近い。
Bitcoin Coreのコードをcloneしてv0.22.0をcheckoutする
$ git clone https://github.com/bitcoin/bitcoin.git
$ cd bitcoin
$ git checkout -b v22.0 v22.0
v0.22.0からは最初の「0.」が省略されるようになったみたいだ。
ビルドする
(2021/09/26 22:52 ビルドは必須ではない)
私はVirtualBoxでUbuntu 20.04を立てているので、そこでビルドした。
$ sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3$ sudo apt install libevent-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev$ ./contrib/install_db4.sh `pwd`(ビルド後に export BDB_PREFIXの設定がコンソールに表示されるので、その通りにすること)$ ./autogen.sh$ ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include" --disable-tests --disable-bench --without-gui --without-miniupnpc --with-utils$ make
新規で作ったubuntu環境ではないので、これ以外にもインストールするものが必要かもしれない。
ビルドする理由は、 bitcoin-util
コマンドファイルをビルドするためだ。残念ながらこのコマンドはBitcoin Coreのビルド済み配布パッケージの中には入っていないのだ。
2021/09/26
ビルド済み配布パッケージに bitcoin-util
がない、と書いたが、見間違えだった。同梱されているのでビルドは必須ではない。
アドレスを生成して、秘密鍵、公開鍵を取得
bitcoin-cli
で getnewaddress
でアドレス生成して、 dumpprivkey
で秘密鍵を取得して、 getaddressinfo
で公開鍵を取得するだけである。signet上で行えば良いだけなので、このために新規のチェーンを作る必要は特にない。
bitcoin.confにブロック生成のchallangeを追記
server=1
txindex=1
signet=1[signet]
signetchallenge=51<公開鍵>51ae
bitcoindを立ち上げる
このbitcoin.confで bitcoind
を起動すると、ブロック生成待ち( getblockcount
が 0
のまま)になる。
contrib/signetにあるスクリプトを使ってブロック生成する
ここから先はcontrib/signetのスクリプトを使いながら行っていく。
よく使うコマンドを環境変数に入れておく。
Bitcoin Coreを make
したディレクトリにいるとしたらこんな感じだ。
$ cd src
$ CLI="./bitcoin-cli -datadir=$HOME/signetdata -signet"
$ MINER="../contrib/signet/miner"
$ GRIND="./bitcoin-util grind"
$HOME/signetdata
は先ほど起動した bitcoind
のデータディレクトリになるので、好きに変更するように。
walletを作成する。名前はなんでもよい。
$ $CLI createwallet mywallet
{
"name": "mywallet",
"warning": ""
}
ブロック生成のnbitsを計測する。これはREADMEに書かれているままだ。私のPCだとこうなった。そんなに深刻になる値ではないだろう。
$ $MINER calibrate --grind-cmd="$GRIND"
nbits=1d398622 for 25s average mining time
秘密鍵をimportする。WIF形式なので c
で始まるはず。
$ $CLI importprivkey <dumpprivkeyで取得した文字列>
環境変数に、importした秘密鍵の元になったアドレスと、先ほど計測したnbitsを設定しておく。
$ ADDR=<getnewaddressで取得した文字列>
$ NBITS=1d398622
これでブロック生成ができる。
$ $MINER --cli="$CLI" generate --grind-cmd="$GRIND" --address="$ADDR" --nbits=$NBITS2021-09-25 14:16:23 INFO Backdating time for first block to 250 minutes ago
2021-09-25 14:16:26 INFO Mined block at height 1; next in -4h7m40s (mine)$ $CLI getblockcount
1
このときオプションに --ongoing
を付けると続けてブロック生成してくれる。
別ノードを立てたい
同じ設定のsignetチェーンを作りたい場合、bitcoin.confの signetchallenge
を同じにすれば良い。
それだけだと相手ノードが分からないので bitcoin-cli addnode
で接続すると良い。デフォルトだとポート番号は38333番になる。
確認は、接続後に bitcoin-cli getblockcount
で同じブロック高になればよいだろう。
おわりに
自分のsignetを作る目的ですが、自由にブロック生成のタイミングを変更できるということだと思っています。
開発中に「いま確認中なのでブロック進まないで!」とか「さっさとブロック生成してくれよ~」と感じることが多いのです。そういう時にかぎってブロックが進んだり、待ち時間が惜しいので別のことをしていたら通り過ぎていたりということもしばしばです。
構築する手間がかかるので万人向けではありませんが、一助になれば幸いです。
株式会社Nayuta
Bitcoinの2nd Layer技術-ライトニングネットワークのプロトコルとアプリケーションの開発を両輪で行う。この分野において当社は世界的認知を得、コントリビュータとしてグローバルなコミュニティで活動を継続中。最新のリリースの中にはLightningウォレットのNayuta Coreがある。
また、様々なタイプのブロックチェーンが共存する時代が近づいていることから、エンタープライズ向けブロックチェーンに関するビジネスも行っている。