[bitcoin]自分のsignetを立てよう

uenohiro4
Nayuta エンジニアブログ
8 min readSep 25, 2021

はじめに

以前、自分で設定したsignetを立てようとして失敗した。Bitcoin Core v0.21.0のときだ。

原因は、v0.21.0ではブロック生成をするときにmainnetと同じルートを通ってしまうため実行できなかったためである。

先日v0.22.0がリリースされた。
このバージョンではtestチェーンかどうかの判定が行われるようになっている。つまり自分でブロック生成することができるようになった。

手順

おおよその手順はこうなる。

  1. Bitcoin Coreのコードをcloneしてv0.22.0をcheckoutする
  2. ビルドする(2021/09/26 22:52 ビルドは必須ではない)
  3. アドレスを生成して、秘密鍵、公開鍵を取得
  4. bitcoin.confにブロック生成のchallangeを追記
  5. bitcoindを立ち上げる
  6. 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-cligetnewaddress でアドレス生成して、 dumpprivkey で秘密鍵を取得して、 getaddressinfo で公開鍵を取得するだけである。signet上で行えば良いだけなので、このために新規のチェーンを作る必要は特にない。

bitcoin.confにブロック生成のchallangeを追記

server=1
txindex=1
signet=1
[signet]
signetchallenge=51<公開鍵>51ae

bitcoindを立ち上げる

このbitcoin.confで bitcoind を起動すると、ブロック生成待ち( getblockcount0 のまま)になる。

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を作る目的ですが、自由にブロック生成のタイミングを変更できるということだと思っています。

開発中に「いま確認中なのでブロック進まないで!」とか「さっさとブロック生成してくれよ~」と感じることが多いのです。そういう時にかぎってブロックが進んだり、待ち時間が惜しいので別のことをしていたら通り過ぎていたりということもしばしばです。

構築する手間がかかるので万人向けではありませんが、一助になれば幸いです。

https://github.com/bitcoin/bitcoin/blob/master/share/pixmaps/bitcoin256.png

株式会社Nayuta

Bitcoinの2nd Layer技術-ライトニングネットワークのプロトコルとアプリケーションの開発を両輪で行う。この分野において当社は世界的認知を得、コントリビュータとしてグローバルなコミュニティで活動を継続中。最新のリリースの中にはLightningウォレットのNayuta Coreがある。
また、様々なタイプのブロックチェーンが共存する時代が近づいていることから、エンタープライズ向けブロックチェーンに関するビジネスも行っている。

--

--