Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AssumeUTXOを利用したブロックチェーンの同期

 AssumeUTXOを利用したブロックチェーンの同期

GBEC解説動画の資料です。
https://goblockchain.network/2025/07/assumeutxo/

Avatar for shigeyuki azuchi

shigeyuki azuchi

July 02, 2025
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. 1 ブロックチェーンの初期同期
 Node 
 Node 
 Node 
 Node 


    Node 
 Local chain 
 Local chain 
 Local chain 
 Local chain 
 Local chain 
 ネットワークに参加したばかりのノードは、 
 接続したピアからブロックをダウンロードし、 
 ローカルのブロックチェーンのコピーを構築する。 
 
 他のノードが持つ全ブロックのコピーが終わると 
 ブロックチェーンの同期が完了する。 
 • Bitcoin の場合
 チェーンの同期=UTXOセットの同期(数日かかる) 
 • Ethereum の場合
 チェーンの同期=ステートツリーの同期 
 GBEC動画:Ethereumのチェーン同期方法 Full / Fast / Snap 
 https://goblockchain.network/2021/04/geth_sync_mode/ 

  2. 2 AssumeUTXO 
 新規フルノードをブートストラップするための戦略
 
 
 
 
 
 


    
 
 
 
 
 m_assumeutxo_data = {
 {
 .height = 840'000 ,
 .hash_serialized = AssumeutxoHash {uint256 {"a2a5521b1b5ab65f67818e5e8eccabb7171a517f9e2382208f77687310768f96" }},
 .m_chain_tx_count = 991032194 ,
 .blockhash = consteval_ctor(uint256 {"0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5" }),
 },
 {
 .height = 880'000 ,
 .hash_serialized = AssumeutxoHash {uint256 {"dbd190983eaf433ef7c15f78a278ae42c00ef52e0fd2a54953782175fbadcea9" }},
 .m_chain_tx_count = 1145604538 ,
 .blockhash = consteval_ctor(uint256 {"000000000000000000010b17283c3c400507969a9c2afd1dcf2082ec5cca2880" }),
 }
 };
 # src/kernel/chainparams.cppより 
 Bitcoin Core 
 v28以降でサポート
 Bitcoin Core内にハードコードされた、あるブロック高時点のUTXOセットのハッシュデータを信頼し、 
 そのブロック高時点のUTXOセットをロードし、そこから同期をスタートする 

  3. 3 AssumeUTXO ベースの同期
 1. スナップショットの入手
 コア開発者が提供しているBitTorrentのマグネットリンクで入手(10GBちょっと) 
 • ブロック 840000:


    magnet:?xt=urn:btih:596c26cc709e213fdfec997183ff67067241440c&dn=utxo-840000.dat&tr=udp%3A%2F%2Ftracker.bitc oin.sprovoost.nl%3A6969
 • ブロック 880000:
 magnet:?xt=urn:btih:559bd78170502971e15e97d7572e4c824f033492&dn=utxo-880000.dat&tr=udp%3A%2F%2Ftracker.bit coin.sprovoost.nl%3A6969
 ※ dumptxoutset RPCは任意のブロック高を指定して実行できない
 
 2. loadtxoutset RPCでスナップショットをロード 
 $ bitcoin-cli -rpcclienttimeout=0 loadtxoutset <スナップショットファイルのパス>  
 • 事前にブロックヘッダーの同期は終わっていること 
 • 結構時間がかかる(2時間ちょっと)ので、RPCがタイムアウトしないよう-rpcclienttimeout=0を設定 
 • 進行状況はdebug.log で確認可能 
 2025-01-27T02:32:00Z [snapshot] 156000000 coins loaded (88.16%, 210 MB) 
 

  4. 4 AssumeUTXO ベースの同期
 3. スナップショットがロードされたら、そこから先のブロックの同期が始まる 
 
 4. 同期が終わったら、同期済みノードとして機能するようになる 


    a. バックグラウンドでジェネシスブロックからスナップショットのブロックまでの 
 ブロックのダウンロード、検証は行われる(つまり使用帯域の削減にはならない) 
 b. 制限事項
 i. txindex=1を有効にしている場合、Txインデックスはジェネシスブロックから 
 順に作られるため、aの同期が終わるまで利用できない 
 ii. プルーニング環境でも利用できるが、 -pruneで最小値(550MB)を
 設定していても最小値がその倍は必要になる 
 iii. バックグラウンドの同期中、一時的にchainstateディレクトリが2つ存在し、 
 ディスク使用量がその分、増加する 
 
 自分の環境では4時間ちょっとで同期完了