本文へスキップ
buybitcoinsmart

用語集 / ノードとソフトウェア

Assumeutxo

Assumeutxoとは?
Assumeutxoを使用すると、Bitcoin Coreのノードはコードに埋め込まれたブロック高で取得された未使用のトランザクション出力の集合のスナップショットから起動し、その後、省略された履歴をバックグラウンドで検証できます。

このスナップショットは、あるブロック高で使用可能なすべてのコインを列挙しており、そのハッシュはソフトウェアと一緒にダウンロードされるのではなく、ソフトウェアにコンパイルされています。Bitcoin Core 28.0では、高さ840,000に対するメインネットのパラメーターが追加されました。これは、実際のネットワーク上でスナップショットを読み込める最初の高さです。ウォレットは、全履歴の検証が終わるよりはるか前に使えるようになり、その間ノードはスキップされたブロックを背後で静かに検証します。

仕組み

Assumeutxoは1つのノードを2つのチェーンステートに分割し、それらを同時に実行します。

スナップショットファイルをloadtxoutset RPCに渡します。Bitcoin Coreはそれを読み込むための2つ目のチェーンステートを作成し、内容が読み込まれて検証される間、元のチェーンステートをアクティブなままに保ちます。スナップショットのチェーンステートが読み込まれ、検証されると、それがアクティブなチェーンステートになり、データディレクトリにchainstate_snapshotというディレクトリが現れ、ノードはスナップショットの基準ブロックからネットワークの先端に向けて同期を開始します。そのディレクトリの中にはbase_blockhashという小さなファイルがあり、スナップショットがどのブロックで取得されたかを記録しているため、この構成は再起動後も維持されます。

信頼の話はすべてハッシュに集約されます。Core自身のドキュメントは、スナップショットの正規の配布元は存在しないこと、そしてダウンロードしたスナップショットはソースコードにハードコードされた値と照合して検証されることを明記しています。したがって、ファイルをホストした相手を信頼しているのではありません。すでに実行を選んだのと同じリリースを信頼しているのであり、コンパイルされた値とハッシュが一致しないファイルは、チェーンステートになる前に拒否されます。

その間、元のチェーンステートはすべてのルールを適用しながらジェネシスブロックから着実に進み続けます。スナップショットの基準ブロックに到達すると、自身の未使用アウトプットセットをハッシュ化し、その結果をコンパイルされたパラメーターと比較します。キャッシュはより必要とするチェーンに渡されます。スナップショットのチェーンは先端を目指して進む間は優先され、その後はバックグラウンドのチェーンがより多くの割合を受け取ります。getchainstates RPCは両方を表示します。

クリーンアップは即座ではなく、次の再起動時に行われます。Coreはchainstate_snapshotをchainstateに名前変更し、バックグラウンドのデータを削除し、その時点以降、ノードは従来の方法で構築されたノードと区別がつきません。base_blockhashファイルは、どこから始まったかの記録として残ります。

ビットコインを購入するときにこれが重要な理由

Assumeutxoは、ほとんどの購入者が自分のコインを検証しない理由となっている唯一の欠点に切り込みます。

当サイトでレビューしている41個のウォレットのうち、チェーン全体を自らダウンロードして検証するのはBitcoin Coreだけであり、だからこそ当サイトのレビューでは4.7と評価しつつ、最初の同期でチェーン全体をダウンロードして検証するため何時間もかかり大量のディスク容量を消費することを、依然として最初の欠点として挙げています。この一文こそが、ほとんどの人が決して試さない理由です。スナップショットはコストを消すのではなく、移動させます。何時間もかかること自体は変わりませんが、ウォレットが使えるようになる前ではなく、使えるようになった後に起きます。

これが効果を発揮するのは出金のときです。当サイトに掲載している取引所63社の1つで購入し、コインを自分が管理する鍵に送り、そして届いたことを確認したくなります。自分のノードがなければ、尋ねられる相手は、たった今送った取引所と、今ではあなたのアドレスを知っている公開ブロックエクスプローラーの二者です。ノードがあれば、答えは自分のマシンが行った計算から得られます。

これは本格的な構成を始めるコストも変えます。同じく4.7と評価した当サイトのSparrowのレビューでは、Bitcoin Coreにバックエンドとして直接接続することを説明しており、その組み合わせは以前、Sparrowが通信できる相手を持つ前に完全同期を待つことを意味していました。スナップショットはセットアップの一日を、使える一晩に圧縮し、先延ばしにした検証は眠っている間に自然に完了します。

実例:dumptxoutsetでスナップショットを生成する

assumeutxoのスナップショットの生成は、すでに信頼しているノード上で意図的に行う操作であり、ファイルを取りに行くことではありません。

dumptxoutset RPCがそれを生成します。タイプ"latest"を使えば現在の先端で、タイプ"rollback"を使えば最近の高さで生成できます。実行時間の大半、ノードは現実を反映しない一時的な状態に置かれ、問題ないと分かっているブロックを無効としてマークし、その状態のためにネットワーク活動は停止され、すべてのピアが切断されます。Coreのドキュメントは、ハードウェアが何であれ、どのタイプを選んだとしてもダンプにはかなり時間がかかるため-rpcclienttimeout=0を推奨し、その間は他のことにノードを触らないよう勧めています。

2つの点が人々を戸惑わせます。スナップショットは、その高さのハッシュがすでにチェーンパラメーターに記載されている場合にのみ使用できるため、他の高さを選ぶにはそのコードを編集して再コンパイルする必要があり、"rollback"タイプはスナップショットを再生成して比較することでハードコードされたハッシュを確認する方法も兼ねています。そしてBitcoin Core 28.0はシリアライズを変更しました。旧形式のダンプはもはや受け付けられず、loadtxoutsetが受け入れる前に28.0以降のノードで再作成する必要があります。

Bitcoin Core 29.0は関連ツールcontrib/utxo-tools/utxo_to_sqlite.pyを追加しました。これはコンパクトにシリアライズされたスナップショットをSQLite3データベースに変換します。それはノードの同期とは何の関係もなく、スナップショットが実際に何であるかということと関係があります。つまり、ある高さで誰が何を所有するかの完全で自己完結した姿であり、これは問い合わせるのに便利なものであることが分かります。

Assumeutxo vs初期ブロックダウンロード

Assumeutxoは初期ブロックダウンロードを置き換えるのではなく、作業が行われる順序を変えます。

スナップショットを読み込んだノードは、バックグラウンドのチェーンステートでジェネシスブロックから完全な初期ブロックダウンロードを依然として実行します。バックグラウンドのチェーンステートは、スナップショットが前提とすることを許したチェーンの区間の完全な検証を担うチェーンステートです。永続的にスキップされるものはありません。スナップショットがもたらすのは、アクティブなチェーンステートがすでに、あなたが関心を持つすべてのアドレスの現在の状態を知っているため、待っている間にウォレットが役に立たないままでいなくなることです。ジェネシスからスナップショットの高さまでの領域は、検証済みとして静かに数えられるのではなく、assumed-validとして追跡されます。だからこそCoreは、1つのチェーンステートに1つのフラグを立てるのではなく、2つのチェーンステートを保持します。スナップショットを読み込み、バックグラウンドの同期を終えなかったノードは、隠された状態ではなく、実在し名前の付いた状態にあります。

Assumeutxo vsプルーニングされたノード

Assumeutxoとプルーニングはどちらもノードが対処しなければならないものを減らし、そして互いに反対のものを減らします。

プルーニングは検証後のディスクに関するものです。プルーニングされたノードはすべてのブロックを検証し、その後不要になった生のファイルを削除します。Assumeutxoは検証前の時間に関するものです。依然として実行する検証を先延ばしにします。この2つは組み合わせることができ、Coreはそれを可能にするために自身のルールの1つを曲げています。-pruneの通常の下限は550 MiBであり、スナップショットを読み込むノードはその最小値を無視し、代わりに少なくとも1100 MiBを使用します。問題は容量だけではありません。バックグラウンドの同期が実行されている間は一時的に2つのチェーンステートディレクトリがあり、それぞれ数ギガバイトで、ダウンロードしたスナップショットより大きくなる可能性が高いです。

インデックスは、この2つが最も大きく分かれるところです。インデックスはスナップショットから何も得ません。インデックスは常にジェネシスブロックから構築を開始し、ブロックを順番にしか適用できないため、インデックスが先端に到達するのは、バックグラウンドの検証がノードをスナップショットのブロックより先に進めたときだけです。プルーニングはそれをさらに際立たせます。プルーニングに対応しているインデックスは、ノードがすでにインデックスを作成したブロックだけを削除できるようにするため、古いスナップショットは、インデックス作成が追いつくまで、ダウンロード済みでインデックスがなく削除もできないブロックの山をディスク上に残します。

混同しやすい用語

よくある質問

assumeutxoとは、ノードがスナップショットを作成した相手を信頼するという意味ですか?

いいえ。スナップショットは、実行しているBitcoin Coreのリリースにコンパイルされたハッシュと照合されます。ファイルに同梱されたものとは照合されません。そのため、改ざんされたスナップショットはチェーンステートになる前に拒否されます。信頼するのはリリースであり、それはすでに信頼していたものです。

メインネットでassumeutxoを使用するには、どのBitcoin Coreのバージョンが必要ですか?

バージョン28.0以降です。ブロック高840,000のメインネットパラメーターが追加され、これにより実際のネットワークでloadtxoutsetを使用できるようになりました。同じリリースでスナップショットのシリアライゼーションが変更されたため、古いノードが生成したダンプは、読み込む前に再生成する必要があります。

スキップされた履歴は実際に検証されるのですか?

はい。バックグラウンドでジェネシスブロックから同期する2つ目のチェーンステートによって検証されます。スナップショットの基準ブロックに達すると、自身の未使用出力セットのハッシュを計算し、その結果をコンパイルされた値と比較します。そしてその後に初めて、ノードは次回の再起動時にバックグラウンドデータを削除します。

取引所でビットコインを購入するだけなら、assumeutxoは必要ですか?

購入には必要ありませんが、自身の出金を確認するコストが下がります。ノードがなければ、コインが届いたと教えられるのは送金した取引所と公開ブロックエクスプローラーだけであり、スナップショットがあれば、その代替手段の実行が当日で終わる作業になります。

次に読む

関連用語

ノードとソフトウェアのその他の用語

このページを英語で読む