用語集 / マイニングとコンセンサス
ブロック重量
- ブロック重量とは?
- ブロック重量は、ビットコインのブロックを、ウィットネスデータの1バイトが1単位、それ以外のすべてのバイトが4単位という尺度で測ったもので、上限は4,000,000単位です。
BIP-141で規定されています。
重量という概念があるのは、バイトによってノードにかかるコストが同じではないからです。署名データはトランザクションが十分に深く埋まると破棄できるため、BIP141はそれに他のすべての4分の1の価格を付け、予算を1ブロックあたり4,000,000単位と定めました。あなたの出金はその予算を巡って競合し、この割引があるために、新しい種類のアドレスからの送金は古いアドレスからの送金より安く済みます。
仕組み
BIP141の式は次のとおりです。重量はベースサイズに3を掛け、総サイズを足したものに等しくなります。ベースサイズはウィットネスを取り除いた旧方式のブロックのシリアライズサイズ、総サイズは完全なシリアライズサイズです。逆に書けば、同じ規則はウィットネス以外の1バイトにつき4単位、ウィットネス1バイトにつき1単位となり、覚える価値があるのはこちらの版です。
重量を4で割って切り上げると、仮想バイト(vB)が得られます。これはすべての手数料見積もりツールとすべてのウォレットが使う単位です。2つのインプットを使い2つのアウトプットを作る支払いで、すべてネイティブSegWitであれば、おおよそ208仮想バイト、つまり約832重量単位になります。ブロックをそうした支払いだけで埋めると、4,800件近くが収まります。同じ支払いをレガシーのpay to public key hashアドレスで作ると約374バイトになり、割引の対象が一切ないため1,496重量単位となり、収まるのは約2,670件だけです。
この差こそが設計の狙いです。ウィットネスを割引したことで、SegWitの採用はそれ自体で元が取れるようになりました。アップグレードしたウォレットは、ブロックを大きくしても安全だと誰かを説得することなく、すべてのトランザクションでより低い手数料を得られました。また、古いアウトプットを使い、それらを新しいアウトプットに統合するほうが、以前よりインプットあたり安くなったため、ネットワークが望む方向へ行動を促す効果もあります。
つまずきやすい点が2つあります。重量はトランザクションごとに計算してから合計されるため、ブロックの重量はそのトランザクション群の合計にヘッダーとカウンターを加えたものになり、ブロックを詰めるマイナーはバイト数ではなく4,000,000単位の予算に対してナップサック問題を解くことになります。そして重量は価値と何の関係もありません。40ビットコインを動かす900重量単位のトランザクションと、40,000サトシを動かすトランザクションは同じ手数料を支払います。ネットワークは空間に対して課金し、金額に対しては決して課金しないからです。
目にする場所
すべてのブロックエクスプローラーはサイズの隣に重量を表示し、Bitcoin CoreのRPC getblockはweight、size、strippedsizeを3つの別々のフィールドとして返します。メモリプールの可視化も重量に基づいており、確認待ちのトランザクションを示す棒グラフは、分母が重量を4で割った値であるsat/vB単位の手数料率で積み上げられます。
また重量は、取引所が出金手数料で実際に請求しているものの正体でもあります。ビットコイン建ての定額手数料を提示するプラットフォームは、構築を見込むトランザクションの重量の平均を取っており、メモリプールが空いているときは利益を得て、混雑しているときは損をします。数多くの顧客の出金を1つのトランザクションのアウトプットとしてまとめて送るバッチ処理を行うプラットフォームは、数十組ではなく1組のインプットの分だけ支払うため、バッチ処理を行う取引所は、出金を1件ずつ個別にブロードキャストする取引所よりはるかに低い手数料を提供できるのです。
ブロック重量vs仮想バイト
ブロック重量は生の測定値で、仮想バイトは同じ測定値を4で割ったものです。どちらも同じデータを表し、異なるのは尺度だけです。重量はコンセンサスルールに書き込まれた単位であるため、4,000,000という数字はコード上でも重量として現れます。仮想バイトはウォレットの画面に書き込まれた単位で、2sat/重量単位より8sat/vBの手数料率のほうが考えやすいからです。ウォレットがあなたのトランザクションは141vbytesだと表示するとき、それが入るブロックの余裕は564単位だけ少なくなります。