2017/04/03

[bc]segwitのこと

Bitcoinで、segwitというのがある。
segwitは"Segregated Witness"の略なのだが、まあ語源はどうでもよい。
Bitcoinがハードフォークするとかしないとか話が出ているが、そういうのもどうでもよい。
私はsegwitの話をしたいだけだ。


取引の内容を表す「トランザクション」は単なるバイナリデータなのだが、いくつかの部分に分かれている。
部分の正式名称は、こんな感じだったと思う。

  • version
  • [marker]
  • [flag]
  • txin
  • txout
  • [witness]
  • locktime

カギ括弧を付けているものが、segwitで追加された部分だ。

 

そして、話が面倒なことに、作り方によってトランザクションに入れ込むデータが変わってくる。
ここではscriptPubKeyと書いたが、これはたぶんP2PKH向けの名前で、locking scriptという呼び方の方が正しいかも。
txout(txは"transaction"の略で、inが入力、outが出力)に書くスクリプトの部分だ。

  • segwitではないscriptPubKey
  • segwitで、データがちょっと長めのscriptPubKey
  • segwitで、データがちょっと短めのscriptPubKey

「ちょっと長め」ってなんだよ、となるが、これはsegwit対応していないウォレットアプリからでも送金先として指定できるタイプである。
見た目はP2SHなのだけど、中身はsegwit向けというやつだ。
通常がP2PKHとしたら、そのちょっと長めバージョンはP2WPKH nested in BIP16と呼ばれる。
データだけじゃなくて、名前も長い。。。

 

「ちょっと短め」ってなんだよ、ともなるが、これはsegwitに対応したウォレットじゃないと送金先に指定できない。
こっちは単にP2WPKHと呼ばれている。
nested inしている方のscriptPubKey(0xA914{20-byte-script-hash}87=23byte)に比べると、1byte小さい(0x0014{20-byte-key-hash}=22byte)ことがわかる。

これだけだと大差ないのだが、このトランザクションをInputとするトランザクションを作ると差が出やすい。
witnessに「<signature> <pubkey>」を置くのはどちらも同じなのだが、nested inの方はscriptSigに23byteのデータを置くことになっている。

 

ただ、ふつうのP2PKHと比べると、ちょっと短めの方でsegwitのトランザクションを作ったとしても、そっちの方がわずかにサイズが大きい。
nested inになれば、なおさらだ。
大ざっぱにsegwitのP2WPKHトランザクションを作ろうとすると、

  • ふつうのP2PKHみたいな構造を作る
  • [marker]と[flag]を追加する(+2byte)
  • scriptSigに置いていた<signature>と<pubkey>をsegwitに移動
  • nested in BIP16なら、scriptSigに代わりのデータを置く(+23byte ?)

というところか。
lengthの付け方がどうだったか忘れたので、1,2byteくらいは違うかも。
あと、署名の計算方法も変わるのだけど、サイズはほぼ同じだからいいや(サイズの範囲は非segwitと同じ)。

 

じゃあsegwitの何がうれしいかというと、トランザクション展性を抜きにすれば、ブロックに入れるときのデータ量が減らせる、ということだろう。
witnessの部分、P2WPKHなら<signature>と<pubkey>を取り外すらしい。<marker>と<flag>もかな?
これだけで110byteくらいあるから、トランザクションは大きくなるけどブロックに入れるサイズはだいたい小さくなる。
MultiSigみたいに署名が複数あると、効果が大きい。

 

ただ、segwitのトランザクションを作るには、INPUTのところがsegwitになってないとダメだ。
だからP2PKHアドレスの場合は、一度P2WPKHのアドレスを作ってそこに送金し、その次からがsegwitのトランザクションを作ることになる。

nested inだとscriptSigもブロックに入れないといけないので、もったいない。
そうなると、ウォレットアプリも対応しないとなぁ、となってくる。
署名の計算も、前のトランザクションを一部使うことになり、その検証も同じようなことになるので、P2PKHなどよりも面倒だ。


今回書いた内容も、BIPを見れば分かる範囲なのだが、私がsegwitのことを調べ始めたときは、

  • 署名を分離してcoinbaseに置く
  • サイズが小さくなる

くらいで、技術的なところは結局BIPを読むしかなかった。
そしてBIPがわかりづらいのよね。。。英語だし。。。

 

今ではsegwitに対応したBitcoinライブラリもあると思うので、これから始める人はそれを読んでいった方がよいのかも。

0 件のコメント:

コメントを投稿

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

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