
「nullブロック」とは、nullバイトで埋められたブロック(ファイルの一部)を意味します。 ハッシュを事前計算し、ソースからこれらのブロックを要求せずに、すぐにロード済みとしてマークすることができます。
ゼロブロックをディスクに保存する必要はありません。 スパースフラグのおかげで、オペレーティングシステムはファイルのこのセクションをゼロで埋めるようにマークし、これらのゼロをディスクに保存しません。
また、ダウンロードしたファイルのセクションがゼロで埋められていることを示すと、破損したファイルのダウンロードと配布を拒否するようにユーザーを動機付けることができます。 私のバージョンのShareazaでは、これらのセクションはファイルのアップロードの進行状況バーの上に赤いバーでマークされています。
ファイル内のnullブロックはどこから来たのですか?
- ディストリビューターは、ファイルの完全なダウンロードと検証を待たずに、部分的なファイルをアップロードしました。
- ディストリビューターのディスクセクターの損傷の結果。
これらは頭に浮かんだオプションです。
これらのファイルが広がり続ける理由
- ビデオ/オーディオファイルは、真ん中にヌルブロックを持つことができ、ヌルブロックがキャッチされる場所をスキップするだけで静かに再生できます。 したがって、全体に見えるかもしれません。
- ディスクイメージのさまざまな場所にnullブロックを含めることもできます。これは、これらのブロックからファイルを読み取ろうとしたときにのみ現れます。
仕組み
- p2pファイルをダウンロードする前に、クライアントはソースからブロックハッシュのリストを受け取ります。
- リストの各ハッシュは、事前に計算されたヌルブロックのハッシュと比較されます。
- ハッシュがnullブロックのハッシュと一致するブロックは、既にロード済みとしてマークされています。 さらに、この場所にはゼロしかないことがユーザーに示されます。
nullブロックを計算するためのツール
- RHash-ハッシュを直接カウントします。
- Lua-必要な数のゼロをRHashにロードし、結果を表示します。
一般的なスクリプト関数:
local lua = "lua5.1"
EDonkey2000ネットワークからゼロをダウンロードしないでください
md4(block_data)
ED2Kハッシュが最も簡単です。 ブロックサイズは9728000バイトに固定されています。 ブロックはmd4関数によって処理されます。 1つのハッシュ値のみを計算する必要があります。
md4ハッシュを検討します。
以下を開始します。
lua5.1 -l "zero-block-hash" -e"gen_md4_hash()"
結果:
// md4_hash // Hash: D7DEF262A127CD79096A108E7A9FC138 Size: 9728000
9,728,000ヌルバイトからのMD4: D7DEF262A127CD79096A108E7A9FC138
Shareazaゼロブロック検出器ED2K:
BOOL CED2K::IsZeroBlock(uint32 nBlock) const {
GitHub: ED2K.cpp#L334
BitTorrentネットワークからゼロをダウンロードしないでください
BitTorrentはもっと複雑です。 BitTorrentの最小ブロックサイズは16384バイトです。 次に、ブロックサイズが2倍になります。
ブロックハッシュは、ブロックデータで動作するSHA1関数の結果です。
sha1(block_data)
sha1ハッシュを考慮します。
以下を開始します。
lua5.1 -l "zero-block-hash" -e"gen_sha1_hashes()"
22個のゼロブロックの計算を待つのに十分な忍耐がありました。 しかし、これは豊富です。 34GBブロックのトレントはほとんど想像できません。
// sha1_hashes // Hash: 897256B6709E1A4DA9DABA92B6BDE39CCFCCD8C1 Size: 16384 // Hash: 5188431849B4613152FD7BDBA6A3FF0A4FD6424B Size: 32768 // Hash: 1ADC95BEBE9EEA8C112D40CD04AB7A8D75C4F961 Size: 65536 // Hash: 67DFD19F3EB3649D6F3F6631E44D0BD36B8D8D19 Size: 131072 // Hash: 2E000FA7E85759C7F4C254D4D9C33EF481E459A7 Size: 262144 // Hash: 6A521E1D2A632C26E53B83D2CC4B0EDECFC1E68C Size: 524288 // Hash: 3B71F43FF30F4B15B5CD85DD9E95EBC7E84EB5A3 Size: 1048576 // Hash: 7D76D48D64D7AC5411D714A4BB83F37E3E5B8DF6 Size: 2097152 // Hash: 2BCCBD2F38F15C13EB7D5A89FD9D85F595E23BC3 Size: 4194304 // Hash: 5FDE1CCE603E6566D20DA811C9C8BCCCB044D4AE Size: 8388608 // Hash: 3B4417FC421CEE30A9AD0FD9319220A8DAE32DA2 Size: 16777216 // Hash: 57B587E1BF2D09335BDAC6DB18902D43DFE76449 Size: 33554432 // Hash: 44FAC4BEDDE4DF04B9572AC665D3AC2C5CD00C7D Size: 67108864 // Hash: BA713B819C1202DCB0D178DF9D2B3222BA1BBA44 Size: 134217728 // Hash: 7B91DBDC56C5781EDF6C8847B4AA6965566C5C75 Size: 268435456 // Hash: 5B088492C9F4778F409B7AE61477DEC124C99033 Size: 536870912 // Hash: 2A492F15396A6768BCBCA016993F4B4C8B0B5307 Size: 1073741824 // Hash: 91D50642DD930E9542C39D36F0516D45F4E1AF0D Size: 2147483648 // Hash: 1BF99EE9F374E58E201E4DDA4F474E570EB77229 Size: 4294967296 // Hash: BCC8C0CA9E402EEE924A6046966D18B1F66EB577 Size: 8589934592 // Hash: DC44DD38511BD6D1233701D63C15B87D0BD9F3A5 Size: 17179869184 // Hash: 7FFB233B3B2806328171FB8B5C209F48DC095B72 Size: 34359738368
ShareazaのShareaza BitTorrent Detector BOOL CBTInfo::IsZeroBlock(uint32 nBlock) const { static const uint32 ZeroHash[22][5] = {
GitHub: BTInfo.cpp#L1611
DirectConnect、Gnutella、およびGnutella2ネットワークからゼロをダウンロードしないでください
これら3つのネットワークは、Tree Tiger Hash(TTH)を使用します。 名前に基づいて、これはハッシュツリーであり、 Tiger関数が計算に使用されます。 これらの種類のハッシュを「木製」と呼びます。 私の意見では、TTHは最も単純なツリーであり、その特性のおかげで、さまざまなブロックサイズのハッシュを非常に迅速に計算できます。
TTHの最小ブロックサイズは1024バイトです。 次に、ブロックレベルは各レベルで2倍になります。
次のように計算されます。
Tiger(0x00 + block_data)
0x00
バイトリーフブロックプレフィックス
block_data
ブロックデータ(この場合、1024ゼロバイト)
+
-連結
Tiger
ハッシュ関数
さらに、大きなヌルブロックを計算するために、小さなヌルブロックからのハッシュを使用します。
Tiger(0x01 + hash + hash)
0x01
ハッシュのペアのバイトプレフィックス
hash
前のレベルで受け取ったnullブロックのハッシュ。
Tiger
ハッシュ関数
計算用の関数を作成します。
以下を開始します。
lua5.1 -l "zero-block-hash" -e"gen_tth_hashes()"
その結果、37個のゼロブロックを非常に迅速に取得しました。 さらに、スクリプトのブロックサイズの表示に問題がありました。 しかし、これらの値は豊富です。 最後のブロックのサイズは70TBです。
// tth_hashes // Hash: 13143C45D95485EACD9C47D72630EF0139436CB77DF2632B Size: 1024 // Hash: 855DCE7FE3E963F50295A673120E6259165CED9F086DB031 Size: 2048 // Hash: 38FB763B44ECA3B13F40182C75694360AC8DA0865DDB29D6 Size: 4096 // Hash: 721BEF53CBBDA47BE44BD26C43EC048F136D371E918200CF Size: 8192 // Hash: AFDDF505C1E1D5AF8FAE007BBE4E64578F34D912345E23D8 Size: 16384 // Hash: 53CC478ED14FF7FB671F94ECE0FD7C8C5DCB2FE611ACAC6B Size: 32768 // Hash: 098B212D6EE0398D319D4F1807E87235A0B8665BA46EF77F Size: 65536 // Hash: 69940A3C20C43576D258BD210339565711D696E94A3511EB Size: 131072 // Hash: FA4317C074C2D7CD9BBFD7F4C8BD3F9F79F330F0C27B61B8 Size: 262144 // Hash: AF8E46E049A800C2339E863AF390C5CFF02BCC39025D44AA Size: 524288 // Hash: 650022207EA4EB454E24D3279539F3CCD92F034E2F83CCB7 Size: 1048576 // Hash: 0BED4DF002309E7D33D52ED0D5C3C24B1ECAA330CBAFB723 Size: 2097152 // Hash: 2FFF449E538E158CD346C5BF7778F2FF67383707955C72C1 Size: 4194304 // Hash: F2D3852A12C25C0C1EE124C07144C6CFA3CD0E72DB9364F8 Size: 8388608 // Hash: 8E6FD02F7F9A0D5233E9287C6D139D44DE76BB80BCBD8BEC Size: 16777216 // Hash: F98C3CB14C4B501DCEF346D6FB92E56AC3F96102B17468F4 Size: 33554432 // Hash: 1830D2019F1A54C7A8A3947E36D34A4E676523FF0735E0FC Size: 67108864 // Hash: 3D002613BA2F88DA7D7E1AB165677FC939B5EC6FFD5D2E73 Size: 134217728 // Hash: BC0466EE7A0C30E31EFD803598BE8F69400B96AE3126AF70 Size: 268435456 // Hash: 31D3A13D9F1BD0D2E16FF2BF6749F830D81693D63E4C1903 Size: 536870912 // Hash: 6EF9A41AEC7C0C0B821D3A845994E6F18E5268E37BC982C1 Size: 1073741824 // Hash: 13132A77BAB0B8A0130FC2B5BF6C36701C622A36AFFBD175 Size: 2147483648 // Hash: E684CA0E3D759457F3F2B4183A0889B25C49F70AB5B5AD8E Size: 4294967296 // Hash: 8C4AEAB1D5A2E3ABBD19848EBC9813121A83D196320EFE54 Size: 8589934592 // Hash: 2CB4627DB09C230212258BAD4120AA0A1C4A185BD2CC4C57 Size: 17179869184 // Hash: B58DE81DC064E964720A0C181AE6EF415F865BAA18E9F019 Size: 34359738368 // Hash: EC0B596EFA9EDBEFE275539914F30757E2E3EB82C30B6FB8 Size: 68719476736 // Hash: BA0078DAD436099159ADA9CFA1457806EB581730364084E0 Size: 137438953472 // Hash: D96DA2416DBF7DAC663872838F8F4E7D8E7C4D2D2A2051AB Size: 274877906944 // Hash: 74816B22B67E4E6995FECAEB84302D01E489BCD76845444B Size: 549755813888 // Hash: 307DB672C03531EB0E9B19FC2ED134ACCEFFB4E04D8EB62D Size: 1099511627776 // Hash: 43CD6009D7931ECC1FFC484D8156A92EC673DEF3D6AE7CF9 Size: 2199023255552 // Hash: 84814323435A450426EECC6700349387D61BD5027F6E7085 Size: 4398046511104 // Hash: 05275B3D69A996B1E8ABDA6EACE8605D5BB7DD8964AC4C79 Size: 8796093022208 // Hash: 434934E2D0EFDEE9864982221FB8A0A872D842B4DA6C59E7 Size: 17592186044416 // Hash: 435396F0F684A6B3E5B5940A79800EE384915CCAD7C52385 Size: 35184372088832 // Hash: 7F377469FB6883D13331667F52CF23194846311094A363C4 Size: 70368744177664
ShareazaのTigerTreeゼロブロック検出器 BOOL CTigerTree::IsZeroBlock(uint32 nBlock) const { static const uint64 ZeroHash[37][3] = {
GitHub: TigerTree.cpp#L1298
尾
尾は、ファイルの最後の不完全なブロックです。 ファイルにはテールが1つあり、ゼロで埋められている場合は個別にハッシュを計算できます。 そして、テールハッシュと計算されたハッシュが一致する場合、それもロード済みとしてマークします。
この機能はまだ実装されていません。
おわりに
これらの指示が採用され、この機能がピアツーピアクライアントに追加され、より有用なデータがネットワークを循環することを願っています。
参照資料
スクリプト: zero-block-hash.lua
ゼロで満たされたファイルを使用したトレント: testfile.torrent