bootstrap.datがある条件を満たすと読み込めなくなる #89

Closed
opened 2021-04-25 13:20:07 +00:00 by takana-v · 2 comments
takana-v commented 2021-04-25 13:20:07 +00:00 (Migrated from github.com)

bootstrap.datのブロックの順序が正しくない場合、そこで読み込みを停止してしまいます。

blk.dat内のブロックは正しくない順序になる可能性があるそうです。
https://learnmeabitcoin.com/technical/blkdat
一般的にbootstrap.datblk.datを連結して作成するので、読み込みが途中で止まる可能性があります。

以下のbootstrap.pyを実行し検証しました。

import requests
import json

magicbyte = "fbc0b6db"
apiurl = "https://insight.electrum-mona.org/insight-api-monacoin/rawblock/"
# block 0-10
blockhash = [
"ff9f1c0116d19de7c9963845e129f9ed1bfc0b376eb54fd7afa42e0d418c8bb6",
"a378b7a601e00a877160357137c72befc6c06c22c5997eedb30ce9976710d28b",
"8c28b5233fc0023d9ed26cb1f7fcbff57a062cfd823d7b8b33f5a0534e054682",
"36a3b7235aa7a05d654a2afe7b3b3faade820e99a70db0262b5afd2d624412e9",
"afc9e42b4ab917ccf9f7c7ab5b98a817a61d91e8da8c18c53ff748ea12976363",
"f88c455d4d9c22654868ad8bdbead18d5decc3d4b4f105c5f9e2b4391297d600",
"e1b2fb921ff4f15ce5b2573595f2a835ab9cd109624c4e3d4324a97ca4d3380d",
"6916c6ccdfc826a0aab14faaa7f6c7fc419d118f5ab17607219c59e1de1754d4",
"4f429775bb724c033d4a2c3e982c08918d31e5766de94b7d7e6656ceacd5fef2",
"d9aef59eb07dc561f099d0e62babe5a4dac431ceed121b3a605e577ccd19c400",
"e69143d5e252aff8d4013ea7487e52670905eac5edd5e75708526b3c20addd7d"
]

blockdata = []

for i in blockhash:
    block = json.loads(requests.get(apiurl+i).text)["rawblock"]
    blockdata.append(magicbyte + bytes.fromhex(hex(len(block)//2)[2:].zfill(8))[::-1].hex() + block)

correct_order_bootstrap = "".join(blockdata)

# block_5とblock_6を入れ替える
blockdata[4], blockdata[5] = blockdata[5], blockdata[4]
wrong_order_bootstrap = "".join(blockdata)

with open("bootstrap_correct.dat", mode="wb") as f:
    f.write(bytes.fromhex(correct_order_bootstrap))
with open("bootstrap_wrong.dat", mode="wb") as f:
    f.write(bytes.fromhex(wrong_order_bootstrap))

bootstrap_correct.datを使用した場合、debug.logを確認すると10ブロックまで読み込んでいましたが、bootstrap_wrong.datを使用した場合は4ブロックまでしか読み込みませんでした。

bootstrap.datのブロックの順序が正しくない場合、そこで読み込みを停止してしまいます。 blk.dat内のブロックは正しくない順序になる可能性があるそうです。 https://learnmeabitcoin.com/technical/blkdat 一般的に`bootstrap.dat`は`blk.dat`を連結して作成するので、読み込みが途中で止まる可能性があります。 以下の`bootstrap.py`を実行し検証しました。 ``` import requests import json magicbyte = "fbc0b6db" apiurl = "https://insight.electrum-mona.org/insight-api-monacoin/rawblock/" # block 0-10 blockhash = [ "ff9f1c0116d19de7c9963845e129f9ed1bfc0b376eb54fd7afa42e0d418c8bb6", "a378b7a601e00a877160357137c72befc6c06c22c5997eedb30ce9976710d28b", "8c28b5233fc0023d9ed26cb1f7fcbff57a062cfd823d7b8b33f5a0534e054682", "36a3b7235aa7a05d654a2afe7b3b3faade820e99a70db0262b5afd2d624412e9", "afc9e42b4ab917ccf9f7c7ab5b98a817a61d91e8da8c18c53ff748ea12976363", "f88c455d4d9c22654868ad8bdbead18d5decc3d4b4f105c5f9e2b4391297d600", "e1b2fb921ff4f15ce5b2573595f2a835ab9cd109624c4e3d4324a97ca4d3380d", "6916c6ccdfc826a0aab14faaa7f6c7fc419d118f5ab17607219c59e1de1754d4", "4f429775bb724c033d4a2c3e982c08918d31e5766de94b7d7e6656ceacd5fef2", "d9aef59eb07dc561f099d0e62babe5a4dac431ceed121b3a605e577ccd19c400", "e69143d5e252aff8d4013ea7487e52670905eac5edd5e75708526b3c20addd7d" ] blockdata = [] for i in blockhash: block = json.loads(requests.get(apiurl+i).text)["rawblock"] blockdata.append(magicbyte + bytes.fromhex(hex(len(block)//2)[2:].zfill(8))[::-1].hex() + block) correct_order_bootstrap = "".join(blockdata) # block_5とblock_6を入れ替える blockdata[4], blockdata[5] = blockdata[5], blockdata[4] wrong_order_bootstrap = "".join(blockdata) with open("bootstrap_correct.dat", mode="wb") as f: f.write(bytes.fromhex(correct_order_bootstrap)) with open("bootstrap_wrong.dat", mode="wb") as f: f.write(bytes.fromhex(wrong_order_bootstrap)) ``` `bootstrap_correct.dat`を使用した場合、`debug.log`を確認すると10ブロックまで読み込んでいましたが、`bootstrap_wrong.dat`を使用した場合は4ブロックまでしか読み込みませんでした。
wakiyamap commented 2021-04-25 13:27:23 +00:00 (Migrated from github.com)

検証ありがとうございます。

bootstrap.datを用いた同期は0.10.x以降は推奨されておりません。
seederやblockheaderを先にダウンロードする形式などで十分に高速化及び分散化された同期がなされるという考えからです。
こちら辺りが分かりやすいかと思います。
https://bitcoin.stackexchange.com/questions/37927/what-happened-to-the-bootstrap-dat-provided-by-bitcoin-org

検証ありがとうございます。 bootstrap.datを用いた同期は0.10.x以降は推奨されておりません。 seederやblockheaderを先にダウンロードする形式などで十分に高速化及び分散化された同期がなされるという考えからです。 こちら辺りが分かりやすいかと思います。 https://bitcoin.stackexchange.com/questions/37927/what-happened-to-the-bootstrap-dat-provided-by-bitcoin-org
wakiyamap commented 2021-04-25 19:39:25 +00:00 (Migrated from github.com)

一旦closeしますが、また質問等ありましたらreopenか別issueを開いていただけると幸いです。

一旦closeしますが、また質問等ありましたらreopenか別issueを開いていただけると幸いです。
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Core-Wallets/monacoin#89
No description provided.