2017/10/13

[btc]bitFlyerのP2WSHアドレス

さっき、bitFlyerからメールが来た。
私はbitFlyerにアカウントを作っているので、アナウンスがあるとメールが送られてくるのだ。


いつも bitFlyer をご利用いただきありがとうございます。 P2WSH 方式の Segwit に対応いたしましたのでお知らせいたします。
 
【P2WSH 方式の Segwit に対応】
お客様が bitFlyer アカウントからビットコインを外部のビットコイン・アドレスへ送付する際のトランザクションを P2WSH(Pay to Witness Script Hash)方式の Segwit に対応しました。当社が世界初*で採用した P2WSH は数ある Segwit の実装方式で安全性及び技術的難易度が高いもので、アドレスが「bc1」で始まることが特徴です。


ほー。


この話は、BIP141と、BIP173に関連したものだ。


まず、「P2WSH方式のSegwit」から。

今のところ、Segwitの表現方法は4つある。
https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#examples

  • P2WPKH
  • P2WPKH nested in BIP16 P2SH
  • P2WSH
  • P2WSH nested in BIP16 P2SH

P2PKHのSegwit版がP2WPKH、P2SHのSegwit版がP2WSHと、名前に「W」が入る。
それに「nested in BIP16 P2SH」が付くかどうかだ。

P2SHというのは、「マルチシグ」が代表格で、複数の人が署名するようなタイプのアドレスだったり、個人じゃなくてスクリプトに署名したり、するタイプのアドレスだ。
個人向けの非SegwitアドレスがP2PKHで、そうじゃなく非SegwitアドレスがP2SHと思っておけばよいかな。


Segwitは、アドレスの方式ではなく、トランザクションの構成などを表すもの。
トランザクションの構成が違うから、アドレスも区別できるようにした、というところかな。

しかし、いきなり「明日からSegwitのアドレスだけにします」と言われても、他のアプリは急に対応できない。
だから、まずは純粋なSegwitのトランザクションではなく、P2SHの皮をかぶせたSegwitトランザクションを作ろう、ということになったんじゃなかろうか。
経緯は知らないが、構成としてはそうなっている。
それが「nested in BIP16 P2SH」とついているタイプのアドレスだ。

アドレスを見ただけでは、それがP2SHなのか、Segwitのnested in BIP16 P2SHなのかは区別が付かない。
区別が付かないから、従来のアプリもP2SHとして処理できる、というわけだ。


ただ、皮をかぶせている分、トランザクションのサイズは大きくなっている。
トランザクションのサイズが大きくなると、手数料に反映されてしまう(基本的に、トランザクションのバイト数で手数料が決まるので)。
だから、どこかでnested inじゃないアドレスを作って普及させねば、という課題があったのだろう。
そこで出てきたのが、BIP173だ。


今までのP2PKHやP2SHのアドレスは、秘密鍵にハッシュ計算を何回か行って作り出すものだ。
BIP173で使うBech32という方式?はそれとは異なる。
どう異なるかは、ここで書くにはとても足りないので、BIPを読んでほしい。
けっして、けっして私が理解できなかったわけではないぞ。。。。

BIPに、アドレスの例が載っている。
https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#examples

価値がある方のblockchainであるmainnetで使えるアドレスは「bc1」で始まっているのが分かるだろう。
bitFlyerのメールだけでは詳細が書かれていなかったのだが、たぶん、これを指しているのだと思う。

BitcoinのMainnetは「bc」、Testnetは「tb」で始まる。
これが「Human Readable Part」と呼ばれる部分だ。
まあ、直訳すれば、人間が読める部分、だな。

その次の「1」は単なるセパレータで、それから後ろが実際のデータ部になる。


Bech32になると、QRコードなんかで表現しやすいらしい。
だからというわけでもないけど、そのうちアドレスはBech32がメインになっていくのかもしれんね。

私ももうちょっと勉強しよう。
リファレンス実装があったので、仕様をよく読まずにC言語でmainnetとtestnetに限定したバージョンを作ったのだけど、regtestのことは考慮になくてね・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。