Taproot導入というビットコイン史においても大型のアップデートが目前に迫りました。

既にブロック高709,632に達すると有効化されるよう仕込まれており、あと2週間弱で導入されることになります。

Taprootにより、シュノア署名、MASTといった新しい技術が導入されることになり、プライバシー向上であったりより柔軟なスマートコントラクトをビットコインでも実装できるようになったりと、色々と応用し甲斐があると期待されています。

新しいサービスがでてきたりと皆さんの身近なところでも目に見える変化が起きるのが楽しみですね(と期待しています)。

また、シンプルに分かりやすい変化もあります。新たなアドレス形式P2TR (Pay to Taproot)が導入されますので、ブロックチェーンエクスプローラを眺めるだけでも変化に気づけるかと思います(とはいっても既存のbcから始まるアドレスとの区別はぱっと見つかず、詳細を表示するエクスプローラでだけ判別できる)。

さて、今回はこのP2TRアドレス形式についてご紹介します。

アドレス形式のおさらい

ビットコインには不思議なものでアドレスの形式が複数存在します。

皆さんがよく目にするのは、

1P5ZEDWTKTFGxQjZphgWPQUpe554WKDfHQ

といった1からはじまるものでしょうか。

でも、他にも形式があるのはなんとなくご存じな方が多いかと思います。

例えば、Bitcoin Rich List (https://btc.com/stats/rich-list)を見てみるとこんなかんじです。

3からはじまったり、bcからはじまったりしているアドレスがありますね。

このように、現在では大きく3つの形式が利用されているようです。

  • 1からはじまるアドレス形式
  • 3からはじまるアドレス形式
  • bcからはじまるアドレス形式

ビットコインは、10月末でサトシのホワイトペーパー公開から13年たち、この間に様々な改良が加えられてきました。

その過程でアドレス形式についてもいくつかアップデートが行われ、互換性を保つ都合上それらが共存して生き残っているのが現状です。

上で紹介した1から始まるアドレスはP2PKH形式のものでレガシーアドレスと呼ばれることもあります。サトシがまだ活躍していた頃から存在しています。対応する取引所やウォレットが一番多い形式であるため、確実に送金したいといった互換性を意識する場合にはこのアドレス形式が今もよく利用されています。

3から始まるアドレスはP2SH形式のものでマルチシグアドレスとしてよく使われています。取引所などより強固なセキュリティを意識する所は大抵この形式を利用しています。また、2017年にビットコインに導入されたSegwitとよばれる方式の一部もこの形式を利用します(P2SH-wrapped P2WPKH)。

bcから始まるアドレスは同じくSegwit方式の一形式で、P2WPKH形式、P2WSH形式のものとなります。

ここまでを整理すると、今までは

  • P2PKH - 1からはじまる
  • P2SH (一部Segwit) - 3からはじまる
  • P2WPKH (Segwit) - bcからはじまる
  • P2WSH (Segwit) - bcからはじまる

といった形式が存在していました。

さて、冒頭でご紹介したTaproot用のP2TR形式ですが、結論から書くと下記のような形になります。

bc1qgdjqv0av3q56jvd82tkdjpy7gdp9ut8tlqmgrpmv24sq90ecnvqqjwvw97

方式としては、

  • P2TR (Segwit witness version 1) - bcからはじまる

となり、ぱっと見、P2WPKHやP2WSHと区別がつかないアドレス形式ですね。

内部的にはSegwitという署名の格納形式規格の仕様バージョンがP2WPKH,P2WSHでの0から1に更新されています(詳しくはBIP350という仕様書を参照のこと)。

ややこしいのですが、Segwitが2017年に導入された際にはアドレスのエンコード方式としてBech32という規格が採用されていました。今回のP2TRでも基本的にはこれに準拠したエンコード方式が採用されているのですが、少しだけ改良が加えられたBech32mというものに切り替わっています。

処理方式としては殆ど差は無く、人が読める先頭部分もbcで一緒です。

では、Bech32とBech32mの違いはなにかというと、より厳密なタイプミス防止機構が導入された点に違いがあります。

Bech32の問題点

Bech32を利用したアドレス形式では、タイプミスなどを起因とするアドレスを構成する文字列の間違いを検出する仕組みが導入されています。

そのため、打ち間違いによる送金先の指定ミスを予防できます。

有効なアドレスを間違って指定してしまった場合は防げませんが、それでもかなり心強い仕組みです。

そんなBech32ですが、Segwitと共に導入された当初は気付かれていなかった強烈な欠陥がその後見付かってしまいました。

https://github.com/sipa/bech32/issues/51

pで終わる有効なBech32文字列について、その前にqを挿入したり、qpで終了する場合はqを取り除いても問題無いよ、と誤判断してしまうとのこと。

例えば、

  • ii2134hk2xmat79tqp
  • ii2134hk2xmat79tqqp
  • ii2134hk2xmat79tqqqp

は全部有効と判断されます。

これはいかんと修正されたものがBech32mであり、P2TRではこちらを使うことになりました。


私たちはP2TRを利用すべきか

新しいアドレス形式が増えたところで、ウォレット利用者がそれを利用しないことには意味がありません。

では、利用者目線で例えばウォレットセットアップ時にP2TR形式が選択肢の一つとして存在した場合に、それを選ぶメリットはなんだろう、というところを最後に触れたいと思います。

通常の送金時に利用される、典型的な2-in, 2-outトランザクションを構成する場合の送金手数料について考えてみます。また、話をシンプルにするため、トランザクションにおけるINPUT・OUTPUTのどちらも同じアドレス形式であった場合を考えます。

送金手数料は送金時に利用するトランザクションのサイズに比例しますので、ここではトランザクションサイズを見積もってみましょう。

Bitcoin Optechのニュースレター#155 (https://bitcoinops.org/en/newsletters/2021/06/30/)より各種形式間のサイズ比較を引用しますと次のようになります。

  • P2PKH  → 375vbytes
  • P2WPKH → 208.5vbytes
  • P2TR → 211.5vbytes

P2TR形式が一番小さい(=安い)かと思うと実はそうではなく、現状のSegwitアドレスなP2WPKH形式が送金手数料的には一番小さくなりそうです。

ちょっと微妙な結果に感じますが、実はもう少し掘り下げると面白いことが分かります。

上記の結果をうけ、自分自身は頑なにP2WPKH形式を利用し続けたとします。でも、世間の自分以外の人がP2TR形式なアドレスを使うようになった場合を考えてみます。

このとき、ややこしいのですが落ち着いて整理すると、自分以外の誰かのアドレスに出金する際につくられるトランザクションは、

  • INPUT → P2WPH (自分のアドレス)
  • OUTPUT → P2TR (自分のではないアドレス)

となり、この場合のトランザクションサイズは232.5vbytesとなります。

P2TR形式のみで構成されるトランザクションでは211.5vbytesでしたのでちょっとだけサイズが大きくなってしまいました。

ということで、少しでも送金手数料を抑えるのであれば自身もP2TR形式を利用したくなりますね。

送金手数料の面は分かりやすい影響ですが、他にも

  • プライバシーが向上する(P2TRではシングルシグ・マルチシグ、特殊なスマコン利用などの区別がなくなる)
  • 送金手数料が正確に見積もれる(これも結果として余計なマージンを考慮しない分手数料が安くなります)
  • フルノードへの負荷が減る(ブロックチェーンの安定性向上につながります)

といったメリットがあります。

利用している取引所、ウォレットがP2TR形式に対応するのが楽しみですね。