ビットコイン備忘録
今月は色々ビットコインの復習をしているので、そのメモです。
きっかけは次期ソフトフォークのTaprootで、まずTaprootアドレスの生成やそのアドレスへの送金、出金をSignet上で試してみました。btcdebというツールがあるので、これをSignet用にちょっとだけ書き換えてコンパイルすればP2TRアドレスが作れます。P2TR(Pay to Taproot)アドレスは通常のSegwitアドレスとことなり、以下のようにセパレータ1の次がq
ではなくp
となります。このアドレスは実際にbtcdebを使って生成したP2TRアドレスです。
tb1p7y52329xxmse7q9gq9542rldlsntdawaqnvntmz99z224kfcauxq9d0y4u
以下の図が分かり易いですね(引用元はこちら)。
・・・
次に、TaprootはSegwitアドレスと比べてどのくらいデータ容量の削減が可能かを調べてみました。以下の図(引用元はこちら)がとても分かり易いです。Taprootアドレスでは基本的にはkey pathを使うことが大半だと思うので、Native Segwitの2-of-3アドレスと比べると約68%もの削減になります。但しシングルアドレスと比べると1%ほどサイズが大きくなってしまいます。bitFlyerなどの取引所の入出金では2-of-3アドレスが使われているので、Taprootへ移行するとビットコイン・ブロックチェーンにとってはデータサイズ削減に貢献するのでエコですね。
そこでこの2-of-3のP2TRアドレスを作ろうと思ったのですが、それにはMuSigというシュノア署名を使った署名の集約が必要になります。このサンプルコードを探してみましたが見つからず、BIPなどを読んでいたらちょっと複雑ということがわかり断念しました。
・・・
四年前Segwitソフトフォークが実現しました。ソフトフォークなので下位互換があります。では古いビットコインノード、所謂レガシーノードはどのようにSegwitトランザクションを認識するのかが疑問でした。よく聞くのはレガシーノードはSegwitトランザクションをanyone-can-spendトランザクションと見なすということです。そこで調べてみたら、レガシーノードがトランザクションを受信する際は、Segwit対応ノードがSegwitトランザクションを改変しレガシーフォーマットで受信しているということでした。それではTxIDが変わりブロック検証で不整合が起きるのでは?と思いましたが、そもそもSegwit導入の理由として「トランザクション展性を防ぐ」ことでした。これはトランザクションIDは不変で、署名データやスクリプトをWitnessと呼ばれる別領域へ移すことで達成するものです。そのためレガシーノード用にトランザクションを改変してもTxIdは不変なので、不整合は起きないのです。
・・・
さて、ここでSegwitソフトフォークの話がでてきたので、「The Blocksize War」を購入して読んでみました。この本では、ブロックサイズを小さいままにするか大きくするかで対立する開発者やマイナー、投資家のそれぞれの側面について物語り調で書かれておりとても面白いです。この本を読んで改めて感じたことは、「ノード(ユーザー)がビットコインをコントロールしている」ということです。ハッシュパワーは二重支払いを防ぐためのものであり、例えば51%以上のパワーをもつマイナーが現れても、それは一時的な不正支払いができるだけであり、ビットコインのコンセンサスをそのマイナーが操作することはできないと思います。但し、そのパワーを脅しにつかいユーザーの意思決定へ影響を与えることはできるかもしれません。ただUASF(User Active Soft Fork)に見られるように、ユーザーのほうがマイナーよりも強い(とい表現してよいのか?)ように思われます。
・・・
The Blocksize Warを読んでみると、次にマイニングプールとマイニングの仕組みが気になりました。昔ASICでマイニングをしたことはありますが、マイニングプールの仕組みは皆無なので調べてみました。
現在の主流はStratum v1というプロトコルで、このサイトが詳しいです。Stratum v1では空のブロックがマイニングされることがしばしばありますが、それを無くし、よりブロックチェーンを効率的に積み上げる仕組みがStratum v2です。また、プール管理者がトランザクションを選びブロックテンプレートを作る代わりに、各マイナーがトランザクションを選べるようにするBetterHashというプロトコルも存在します。最近では、ビットコインは環境に良くないという話も聞きますが、再生可能エネルギーの利用や超過エネルギーの有効活用も含め、マイナーの効率化もどんどん進化しています。マイナー事情はあまり表に出てこないですが、もっと調べてみるのも面白そうですね。以下にSpotllightに投稿されたマイナー関連の記事を張っておきます。どれも神記事です。
- 11年ぶりに動いたビットコインはサトシのものか? | btc_dakara
- 新疆で停電という噂をポワソン回帰分析にかける | btc_dakara
- 中国でのモナコインの最新事情 | 田中
- 太陽電池でビットコイン・マイニング | Culi-zusi
・・・
ここで、マイナーの話からマイングについて調べてみました。マイニングとは、ターゲット難易度以下のハッシュ値を見つける作業ですね。そのハッシュ値を生成するために必要なのは以下のブロックヘッダを構成するアイテムです。
このアイテムのうちのNonceと呼ばれる4バイトの領域を使い、1から順にカウントアップしていき、総当りでハッシュ値を生成して、ターゲット難易度以下であるかを調べます。4バイトなので2の32乗=約40億通りです。これは4GH/s相当な仕事量なので、現在のASIC(100TH/s)だと0.1秒以内に計算が終わります。このNonceだけではエントロピーが足りないので、Timestampも使います。これはNTime rollingと呼ばれる手法です。最近ではこの手法は使われなくなってきて、代わりに
- ExtraNonceと呼ばれる領域をエントロピーとして使う
- トランザクションを別なものへ変更する
という手法が使われているみたいです。ExtraNonceは上記のbtc_dakaraさんの記事にも登場するPatoshiパターンの根拠にも使われている値ですが、このコインベースの領域をカウントアップするか、トランザクションを更新・変更することでマークルツリーの値を変更することで、ハッシュ値の値を変えていきます。
・・・
今回はこの辺で区切りをつけたいと思います。これ以外にもゼロ知識証明を使ったGmaxwellのZKCPやGraftroot、anyprevoutなども調査していたので、以降の備忘録編として書いていければと思います。