Segwit
Segwit とは Segregated Witness の短縮語で、トランザクション ID の算出対象からトランザクションに対する署名を削除し、トランザクションから独立した署名領域 (Witness) を用いて署名をおこなうことを指します。Segwit に対応することにより 1 ブロックに含められるトランザクションが多くなります。また、署名に特別な細工を施した場合であってもトランザクション ID が変化することがなくなり、トランザクション展性を防止します。
Segwit は、ブロックの大きさに関する制限も緩和します。具体的には、次の式によって定義されるブロックの重み (Block weight) を新たに導入し、これを 4MB までに制限します。
Block weight = Base size * 3 + Total size
ここで Base size は、署名領域を含めずにトランザクションをシリアライズした場合のバイト数、すなわち従来のシリアライズ方式によるブロックの大きさとし、Total size は、署名領域を含めてシリアライズした場合のバイト数とします。
これにより、理論上のブロックの最大の大きさは 4MB 近くになりますが、実際にはブロックの平均の大きさは 1.7MB 程度になるだろうと推測されています。
Segwit の対応方式は主に下記の種類があります。
P2WPKH:Pay to Witness Public Key Hash/ P2WSH:Pay to Witness Script Hash
Segwit に対応したビットコイン・ウォレットでは、bech32というエンコード方式を用い、アドレスの頭3文字が bc1 で始まる形式でビットコイン・アドレスが生成されます。当該アドレスへは Segwit に対応してないウォレットからは送金することができません。当社は安全性の高い P2WSH に対応しています。
P2SH:Pay To Script Hash(P2WPKH)/ P2SH:Pay To Script Hash(P2WSH)
Segwit に対応したビットコイン・アドレスを 既存のP2SH でネストしたものです。マルチシグ対応と同様ビットコイン・アドレスの頭文字が 3 で始まり、従来(Segwit 未対応)のウォレットソフトから送金することができます。ビットコイン・アドレスから Segwit に対応しているかどうか見分けがつきません。
以下、Segwit についてよくあるご質問に回答いたします。
Q1 なぜbitFlyerはビットコイン預入アドレスには Segwit 対応しないのですか?
お客様の資産保護及び利便性を考慮したからです。お客様が誤ってビットコインキャッシュを Segwit 対応しているビットコイン預入アドレスに送った場合、ビットコインキャッシュを失う可能性があります。ビットコインキャッシュでは、Segwit が アクティベートされておらず、witness 内の署名の検証が行われないため、送ったビットコインキャッシュを署名なしで取り出すことができてしまいます。
Q2 Segwit に対応することでどんなメリットがありますか?
トランザクション展性の防止とビットコインネットワークの混雑解消、トランザクション手数料の低減等のメリットがあります。