3年ちょっと前、私がBitGoに入社した当時、ビットコインキャッシュはまだ分岐しておらず、セグウィットも有効化されていませんでした。ウォレットはよりシンプルで、取引の統合は主に理論上の話に過ぎず、決済バッチ処理に対する認識も今ほど高くなかったのです。時折ネットワークが混雑する時期もありましたが、年末にかけて価格が2万ドルまで急騰したことで、ビットコインネットワーク史上最大規模の取引待ち行列が発生することになりました。

Mempool UTXO

2017年10月~2018年1月のメンプールサイズ(MB)。色は手数料帯を示しています。このデータを取得したフルノードは、メンプールのサイズ制限を課していません。このグラフは、300 MBを超えるトランザクションのバックログ(2日分以上のブロックに相当)を示しています。出典: https://jochen-hoenicke.de/queue

12月初旬から1月下旬にかけて、手数料レートは1バイトあたり40サトシを下回ることは一度もありませんでした。この期間のほとんどは、1バイトあたり100サトシを大幅に上回る水準で推移し、大晦日の前後数日間だけわずかに落ち着きを見せた程度でした。 ネットワークのトランザクションキューがデフォルトのメモリプール(mempool)サイズを何度も超え、その結果、ほとんどのノードがフィーレートが最も低いトランザクションを排除することになりました。時には、1バイトあたり100サトシ未満のトランザクションがすべて排除される事態にもなりました。2017年12月22日には、次ブロックのフィーレートが1バイトあたり1,000サトシを超えるピークを記録しました。

Mempool UTXO

2017年12月のメンプールサイズ(MB)。フルノードのデータは、デフォルトのメンプール上限である300 MBを使用しています。このグラフは、2017年12月22日に、このノードのメンプールから100サトシ/vB未満のすべてのトランザクションが排除された様子を示しています。出典: https://jochen-hoenicke.de/queue

SegWitの導入は始まったばかりであり、多くのウォレットは依然として単純なコイン選択方式でトランザクションを構築していました。また、CPFP(Child Pays for Parent)方式の手数料引き上げをネイティブでサポートしているものはほとんどなく、多くのウォレットの未使用トランザクション出力(UTXO)プールは極めて細分化されていました。トランザクションが数週間も滞留したため、利用者は多額の手数料を支払っているにもかかわらず、各サービスにはサポート依頼が殺到しました。一部の企業向けウォレットでは、確認済みのUTXOが完全に枯渇してしまったほどでした。 多くのウォレットにおいて、UTXOの大部分は事実上使用不能な状態にあった。つまり、UTXOを使用するためのコストが、その価値を上回っていたのである。要するに、UTXO管理は未だ十分に確立されていなかった。ウォレットソフトウェアもウォレット運営者も、これほど大規模な手数料急騰に備えていなかった。

UTXOセットは、2017年10月の5,000万UTXOから、2018年1月中旬には6,400万UTXO以上に膨れ上がった。処理の滞りが解消された後、ウォレット運用のベストプラクティスに対する認識が高まった。多くのウォレット運営者は、この比較的落ち着いた時期を利用してウォレットの整理を行い、2018年3月までにUTXOセットを5,100万UTXOまで縮小させた。

改善の余地は残されているものの、エンタープライズ向けウォレットは2017年以降、大きく進化してきました。以下のケーススタディでは、エンタープライズ運用における2つの一般的なウォレット構成を紹介し、BitGoがクライアントとどのように連携して手数料の支出を削減したかについて解説します。

設定:送金専用ホットウォレット

Send only hot wallet

送信専用ホットウォレット:外部の受取人への出金は、このホットウォレットから行われます。外部からの入金は、ホットウォレット(または図示されていないオプションのコールドストレージ)への送信のみに制限されたウォームウォレットで受け付けられます。

この種の構成では、少なくとも2つ、通常は3つのウォレットが必要です。

  • 送金専用ホットウォレット

  • 入金を受け取るために使用されるウォレット

  • 組織の資金の大部分を保管するために使用される、オプションのコールドウォレット

ホットウォレットの残高が少なくなると、ウォームウォレットから資金が補充されます。ウォームウォレットの余剰資金はコールドストレージに移されます。ウォームウォレットとホットウォレットの両方の残高が少なくなった場合、コールドウォレットからホットウォレットへ資金を注入することができます。主な利用者:証券会社、貸付サービス

メリット

  • 多額の預金に対する強固なセキュリティ


    入金は直接ホットウォレットに入金され、このウォレットは、ホットウォレットやコールドウォレットへの送金のみを許可するように設定できるほか、送金には承認を必要とするように設定することも可能です。

  • ホットウォレットでのシンプルな未使用残高管理


    ホットウォレットは送金のみを行うため、未使用残高の管理は、十分な資金と十分な数の未使用トランザクションを確保しておくだけで済みます。一方、ウォームウォレット内の資金は、時間的選好が低い場合でも統合することが可能です。

デメリット

  • Sendウォレットの均一なUTXOプール


    送信元ウォレット内の資金はすべて、過去の送信によるお釣り出力か、チャージによってウォレットに送金されたものに限られるため、このウォレットにはUTXOの値に大きなばらつきがありません。これは、お釣りの発生を回避することが難しくなるという点で、トランザクションの構築において不利となります。事実上、すべての支払いにおいてお釣り出力が生成されてしまいます。この欠点は、支払いをまとめて処理することで、1回の支払いあたりのお釣り出力の数を減らすことにより、大幅に軽減することができます。

  • 送金に必要な資金を確保するための追加取引


    資金はすべてまずウォームウォレットで受け取られるため、利用可能になる前に、すべての資金をホットウォレットへ転送する必要があります。送金のために資金をまとめていても、資金が直接ホットウォレットに受け取られるモデルと比較して、追加のトランザクション出力が生じます。

課題

  • 支払件数が非常に多い


    送金元のウォレットは通常、未使用残高が比較的少ないため、1回のトランザクションで1件の支払いしか行わないと、ウォレット内の確認済み資金がすぐに枯渇してしまう可能性があります。このような場合、過去にウォレットが未確認トランザクションの非常に長いチェーンを生成してしまう事例が見受けられました。未確認トランザクションの長いチェーンが生じると、ある時点でそれ以降のトランザクションがネットワークに送信されなくなります。これは、ビットコインノードがデフォルトで25件を超える未確認トランザクションのチェーンを中継しないためです。

  • ブロックの処理が遅い、または流出量が急増する


    ホットウォレットには必要な資金しか保管されていないため、ブロック処理が遅れることが数回あったり、出金量が急増したりすると、ウォレット内の確認済み資金があっという間に底をついてしまうことがあります。

推奨事項

  • 十分な資金を確保する


    ホットウォレットには、トラフィックのピーク時を少なくとも3時間乗り切れるだけの十分な資金を確保しておいてください。統計的に、ビットコインでは1日に1回、1時間単位のブロックが生成されます。これにより、しばしば少量の処理遅延が発生し、一部の取引の承認が遅れることがあります。そのため、混雑期を乗り切れるよう、早めにウォレットに資金を追加し、十分な残高を維持しておくことが重要です。

  • バッチ処理


    1回の取引で複数の支払いを送金することで、ウォレットの取引回数が平準化され、減少します。入力セット、取引ヘッダー、および返金出力のオーバーヘッドが各支払いで共有され、生成される返金出力の数が減るため、これにより 1回の支払いあたりの手数料は最大80%.

    バッチ処理を利用する送信専用ウォレットであれば、UTXOが数百個程度であっても、軽微なネットワークの混雑を容易に乗り越えることができます。バッチ処理の効果を最大限に引き出すためには、1回のトランザクションで少なくとも5~10件の支払いをまとめて処理することを目指すべきです。ウォレットによる支払いの件数や、ネットワークへの送信の緊急度に応じて、1分から15分程度のバッチ間隔が有効であることが確認されています。まずは5分間隔から始めて、状況に応じて調整することをお勧めします。

  • 分割の変更


    送金専用ウォレットのUTXOプールは、入金出力と釣り銭出力のみで構成されているため、円滑な運用には、大きなUTXOを速やかに分割してUTXOの数を増やすことが不可欠です。BitGoでは、取引量の多いウォレットに対してこれを自動的に行っています。ただし、支払いを一括処理する際は、UTXOの分割が過剰にならないよう、UTXOの数を少なく抑える必要があります。

  • ウォームウォレットを統合する


    ホットウォレット内の資金はすべて即座に利用可能である必要がないため、定期的に手数料の安い集約取引を実行して、小さなUTXOを大きなものにまとめ、それによって将来ホットウォレットに資金を補充する際のコストを抑えることが可能です。

  • ネイティブSegWit変更アドレス

    送信専用ウォレットは自組織からの資金のみを受け取るため、たとえ取引の受信側でそれが不可能であっても、直ちにネイティブSegWitアドレスへの切り替えが可能です。 ネイティブSegWitマルチシグアドレス(p2wsh)への送金手数料はp2shよりも若干高くなりますが、そのアドレスからの送金手数料は安くなります。BitGoが採用している2-of-3マルチシグの場合、ラップドアドレスからネイティブSegWitアドレスに切り替えることで、ウォレットの手数料を約15%削減できます。

BitGoの特典

  • 手数料に敏感な未使用の選択


    BitGoの未使用残高の選択は、現在の手数料水準を考慮に入れています。手数料が低い場合、BitGoの未使用残高の選択機能は、より大きな入力セットを使用して小さなUTXOを統合することを許可しますが、手数料が高い場合は、小さな入力セットを優先します。手数料に敏感な未使用残高の選択による影響は、送信専用ウォレットではそれほど顕著ではありません。なぜなら、こうしたウォレットはすでに比較的均質なUTXOプールを保有している傾向があるからです。

  • 変更の分割機能の改善


    BitGoの自動お釣り分割機能は、お釣りの金額を一定の範囲内に分散させます。これにより、ウォレットの追加UTXO生成においてお釣り分割がより保守的になり、ウォレット内のUTXO間の金額のばらつきが大きくなります。ウォレット内のUTXO間のばらつきが大きくなることで、お釣りを最小限に抑える小さな入力セットが見つかる可能性が高まります。

事例紹介:送金専用ウォレット「SatSource」

SatSourceは送金専用のウォレットを採用しています。事業開始当初は取引量が少なく、受取人ごとに個別の取引を送信していました。しかし、決済量が増加するにつれ、ブロック生成に時間がかかる場合や出金需要が急増した場合に、ウォレット内の確認済み資金が不足することがあることが判明しました。

SatSourceは一括決済方式に移行しました。一括決済導入前は、受取人ごとの出力ごとに、少なくとも1つの取引入力、1つの釣り銭出力、および取引ヘッダーというオーバーヘッドが発生していました。これにより、1回の支払いあたりの取引ウェイトは215となります。 仮想バイト (vB)以上。 ここで、3件の支払いを1つのトランザクションにまとめて処理することで、このオーバーヘッドコストは1件あたり約93 vBに分割され、1件あたりのコストは約57%削減されます。同社のユーザーベースが拡大するにつれ、バッチ処理の規模は時間とともに拡大し、1トランザクションあたり約9件の支払いまで増加します。これにより、トランザクションのウェイトは1件あたり約52 vBまで低下し、1トランザクションあたり1件の支払いだった当初と比較して、1件あたりのコストは約76%削減されます。

一定間隔でのバッチ処理によりトランザクションの発生頻度が大幅に予測しやすくなったため、SatSourceはウォレット内に保持する未使用残高を減らすことが可能になりました。これにより、平均入力セットサイズが縮小し、トランザクション手数料がさらにわずかに削減されます。

BitGoはSatSourceの取引履歴を精査した結果、ネイティブのSegWit残高アドレスを使用するよう推奨しています。出力サイズが32バイトから43バイトに増加する代償として、取引の入力サイズは140バイトから105バイトに抑えられるため、手数料がさらに13%削減されます。送金専用ウォレットであっても、SatSourceの取引の約3.5%では、残高出力の生成を回避できています。 1日あたり1,000件の取引を行う場合、これは1日あたり約5kBの取引データを節約できることを意味し、取引手数料の約1%の削減につながります。

全体として、送信専用ウォレットは、バッチ処理や、おつりの出力先アドレスをより効率的な形式に変更することで、大きなメリットを得ることができます。SatSourceは、取引手数料を合計で約80%削減することに成功しました。

設定:送受信用ホットウォレット

Setup- Send-and-Receive Hot Wallet

送受信用ホットウォレット:このホットウォレットは、入金の受け取りと出金の処理の両方を行います。残高が少なくなると、ホットウォレットはウォームウォレットから補充され、同様に、ホットウォレットの余剰資金はウォームウォレットに移されます。この構成には、少なくとも2つ、通常は3つのウォレットが必要です。

  • 送受信に使用されるホットウォレット

  • ホットウォレット用に追加の資金を確保しておくウォレット

  • 資金の大部分を保管するためのオプションのコールドウォレット

ホットウォレットの残高が過剰になると、その資金はウォームウォレットに移され、ホットウォレットの残高が少なくなると、ウォームウォレットから補充されます。ウォームウォレットの余剰資金は、コールドストレージに移されます。

主なユーザー:取引プラットフォーム、カストディアル・ウォレット・サービス

メリット

  • 自動補充


    入金はホットウォレットに直接振り込まれるため、出金とほぼ相殺されます。これにより、多くの場合手動での承認を必要とする資金補充の回数が減り、内部での資金管理のために発生する追加取引の件数も減少します。

  • 不均一な未使用プール


    ホットウォレットは直接入金を受け取るため、UTXOプールの構成には、より多様な未使用残高が含まれる傾向があります。これにより、入力セットを選択するための組み合わせの幅が広がり、お釣りの発生しない取引の数が増加します。

デメリット

  • より困難を伴う可能性のある未使用資金の管理


    この種のウォレットでは、送金よりも受信取引の数が多くなりがちであるため、未使用残高を最適に管理するためには、より広範な要素を考慮する必要があります。

  • 平均して入力セットが大きくなる


    一括引き出しの入力セットに必要な金額に比べて、受け取る平均金額ははるかに少ない傾向にあるため、手数料率が高い場合、送受信ウォレットは、統合された資金で補充される送金専用ウォレットよりも、より大きな平均入力セットを使用する傾向があります。

課題

  • 大量のインバウンド取引


    送受信用のホットウォレットは、取引量の多い小売シーンで頻繁に利用されるため、受信取引が受信取引を大幅に上回るケースがよく見られます。例えば、BitGoのウォレットでは、受信取引と送信取引の比率が最大20対1に達する事例も確認されています。受信取引1件につき少なくとも1つの未使用取引出力(UTXO)が生成されるため、このような取引量が続くと、ウォレット内のUTXOが瞬く間に数十万件にまで膨れ上がってしまう可能性があります。

  • 高額な手数料


    送受信を行うウォレットでは、資金が多数の未使用取引出力(UTXO)に分割されていることが多いため、それらの出力を支払うには複数の入力が必要となります。取引は時間的制約を受けることが多いため、ウォレットは低いブロックターゲットを設定し、次の数ブロック以内に取引が組み込まれるよう操作します。取引手数料は収益の相当な部分を占めることがあります。

推奨事項

  • 定期的な統合

    特に、受信トランザクションが過剰なウォレットについては、未使用残高の肥大化を防ぐため、定期的に未使用残高を統合することをお勧めします。未使用残高の金額に多少の幅があることは、トランザクション送信時の選択の幅を広げる利点がありますが、手数料を最も大幅に節約するには、1 mBTC(100,000サトシ)未満の小さな未使用残高をすべて統合することが有効です。 定期的な統合は、1 mBTC(100,000サトシ)未満の未使用残高が200件以上ある場合に統合トランザクションを作成する、1時間ごとのcronジョブとして実装できます。統合トランザクションは、現在のデフォルトの最低リレートランザクション手数料である1 kBあたり1,000サトシで作成できます。過去数ヶ月間、この手数料では通常、少なくとも1日1回は処理が完了しています。 混雑時には、その手数料率のわずかな倍数でも、1kBあたり1,000~2,000サトシのトランザクション帯域が数十MBまで拡大するため、統合トランザクションの承認が数日早まる可能性があります。

    自動統合プロセスは、処理中の統合トランザクション数が一定数に達した時点で一時停止すべきです。統合トランザクションに過度の資金を拘束することは、わずかな利益しか得られない一方で、ウォレットの柔軟性を低下させます。トランザクションのバックログが長引いた場合、ウォレット運営者はより高い手数料率で統合を行うことを選択するかもしれませんが、資金がすでに拘束されている状態ではそれは不可能です。 予算が限られている一部のウォレットでは、バックログ化した統合トランザクションに資金を過剰に拘束した結果、流動性資金が枯渇する事例が見受けられます。資金枯渇を防ぐ一つの方法は、統合を最大未使用残高だけでなく、最低年齢(例:1 mBTC未満かつ少なくとも2,000確認)にも制限することです。

    最適なパラメータはウォレットの支出パターンに大きく依存し、未使用残高の上限を最大0.1 BTCまで、有効期間の下限を2,000確認以上とするなど、幅広い設定が可能です。また、異なる未使用残高の区分ごとに異なる手数料率を設定することで、より迅速に流動性を確保することも可能です。

  • 維持額との差異


    未使用残高のバリエーションが豊富であることは、より良い未使用残高の選択結果を得るために役立ちます。ウォレットのトラフィック状況にもよりますが、適切な未使用残高プールの規模は、通常200~5,000 UTXO程度です。 資金が過度に集中していると、ブロックの生成が遅延し、かつトラフィックのピークが重なった際に、未確認の資金が不足してしまう可能性があります。あるいは、入力セットを正確に一致させることで回避できたはずの、余分な変更出力(change output)を生成することになってしまいます。

  • バッチ処理


    前述の送信専用ウォレットと同様に、複数の支払いを1つのトランザクションにまとめて処理することで、送信トランザクションの件数、お釣りの出力として移動中の資金の量、および総取引手数料を最大80%削減できます。当然ながら、バッチ処理を行うと受信トランザクションと送信トランザクションの比率が上昇するため、UTXOプールの肥大化を防ぐためには、送信・受信兼用ウォレットで定期的に取引を整理することを併せて行う必要があります。

BitGoの特典

  • 効率的なアドレス


    BitGoウォレットでは、ネイティブSegWitアドレスの利用が可能です。ネイティブSegWitアドレスで受け取った資金を送金する場合、手数料は25%安くなります(140 vBではなく105 vB)。すべての受信取引を直ちにネイティブSegWitアドレスに切り替えることが難しい場合でも、少なくともお釣り出力についてネイティブSegWitアドレスに切り替えることで、お釣り出金のコストを最大15%削減できる可能性があります。

  • 手数料に敏感な未使用の選択


    BitGoの未使用選択アルゴリズムは、現在の手数料水準を考慮するように改良されました。手数料が低い場合、BitGoウォレットはより多くの入力数を許可し、効率の低いアドレス形式のUTXOを優先します。 一方、手数料が高くなる場合は、ソフトウェアは高額な未使用残高(UTXO)を少なくした入力セットを構築し、ウェイト効率の高いアドレス形式を優先するよう動作します。ビットコインネットワークの手数料率は常に変動しているため、これによりブロックスペースの使用の一部が、ブロックスペースがより豊富で安価な時期へとシフトします。全体として、これにより総手数料が大幅に削減され、UTXOプールのサイズも継続的に縮小されます。

  • 変化への抵抗


    BitGoの「未使用選択(unspent selection)」は、トランザクションの受取金額と完全に一致する入力セットを選択しようとするものです。この方法で構築されたトランザクションは、お釣り出力の生成を回避することで取引規模が小さくなり、さらに将来お釣り出力を使用する際のコストも回避できるため、全体的な取引手数料を削減できます。

  • 分割の変更


    BitGoのトランザクション構築において、お釣りが複数の部分に分割されると、出力は幅広い値の範囲に分散されます。各出力の金額が大きくなるため、これによりお釣りの分割処理は、ウォレット内の未使用残高(unspents)を新たに生成する際により保守的になり、ウォレット内の未使用残高間の価値のばらつきを拡大させる要因となります。ウォレット内の未使用残高間のばらつきが大きくなることで、お釣りを回避する入力セットがより頻繁に選択されるようになります。

事例:ホットウォレットの送受信:「TradeCorp」

TradeCorpは、送受信用のホットウォレットを運用している企業です。定評のある取引プラットフォームとして、1日あたり約500件の入金と400件の出金取引が発生しています。このシナリオの開始時点で、ウォレットには約63,000件の未使用残高が蓄積されており、週に約500件のペースでさらに増加しています。TradeCorpは出金を1分ごとにバッチ処理しており、取引の統合は一切行わない方針をとっています。

BitGoの「未使用残高選択」機能がウォレットで有効化された結果、最初の4週間でウォレットが生成した取引の93%が「お釣りなし」取引となりました。お釣りの発生を回避しただけで、週あたり約0.45ビットコインブロック分のデータがブロックチェーンに記録されるのを防ぐことができました。同期間において、ウォレットの未使用残高プールは、これまでの増加傾向から一転し、20%減少しました。

数ヶ月後、ウォレットの未使用残高は500件を下回りました。これにより、ウォレットの平均UTXO価値は大幅に上昇しました。これは、同程度の資金が、未使用残高のほんの一部に分散して保有されているためであり、その結果、TradeCorpの取引における平均入力セットサイズが大幅に縮小したからです。UTXOプールのデフラグメント化だけで、取引手数料総額が50%以上削減されると推定しています。

資金が統合された後も、このウォレットは3か月間で平均58.5%の固定手数料取引を維持し、3万5千件の取引において約20%の手数料削減を実現しています。手数料率に応じた未使用残高の選択により、低手数料率時の平均入力セットのサイズは、高手数料率時の入力セットの約1.4倍となっています。 取引の約32%が低手数料環境で発生していることを踏まえると、ウォレットの入力データのほぼ45%が低手数料環境で発生しています。より多くのUTXOを低手数料で支出するようシフトしたことで、ウォレットの総手数料支出は少なくとも13%削減されました。この時点で、TradeCorpはネイティブSegWit預入アドレスへの移行を開始します。 ウォレットは現在、ネイティブSegWit入力を約19.4%使用しており、これによりブロックスペースをさらに5%節約しています。

全体として、この特定の送受信用ホットウォレットに最も大きな影響を与えたのは、資金の集約でした。さらに、お釣りの発生を回避する戦略や、手数料を重視した未使用コインの選択により大きな効果が得られ、より効率的なアドレス形式の採用も若干寄与し、その結果、取引手数料は合計で65%以上削減されました。また、TradeCorpはBitGoに対し、手数料率が高騰した時期であっても、取引手数料の支出がはるかに安定していたと報告しています。 これらの取り組みを、より長いバッチ処理間隔(例:5分)に拡大することで、1回あたりの支払コストをさらに削減できると推測されます。

見通し

これらの事例研究は、BitGoのウォレットの有用性を示すものであり、業界全体でブロックスペースの効率性を高めるためのウォレット運用手法の試行錯誤の一助となれば幸いです。

Upper bound for input and output sizes

Taprootはマルチシグの取引コストを大幅に改善すると同時に、キー・スペンディング・パスが使用される場合、入力と出力をシングルシグの支出と見分けがつかないようにします。BitGoはウォレットの設計を継続的に改良しています。 例えば、Taprootの提案には大きな期待を寄せています。これはウォレットの機能に全く新しい可能性を開き、多くのケースでマルチシグの入力サイズをシングルシグと同等まで縮小するでしょう。ラップドSegWitやネイティブSegWitの入力からであっても、キーパス経由で支出されるPay-to-Taprootの入力は、2-of-3マルチシグの場合、45~58%小さくなります。

レビューをしてくださったデブラ・バー、デビッド・ハーディング、アダム・ジョナスに感謝します。

その デジタル資産のインフラ企業。

Connect with us

Thousands of businesses around the world run on BitGo

BitGoについて

BitGoはデジタル資産のインフラストラクチャー企業であり、カストディ、ウォレット、ステーキング、トレーディング、ファイナンス、決済サービスを規制されたコールドストレージから提供しています。2013年の設立以来、当社は金融システムのデジタル資産経済への移行を加速させることに注力してきました。グローバルな事業展開と複数の規制対象事業体により、BitGoは業界のトップブランド、取引所、プラットフォームの多くを含む数千の機関投資家、および世界中の数百万人の個人投資家にサービスを提供しています。