Baru-baru ini, IPFS menambahkan dukungan untuk hash yang sepele (identitas) . Dalam artikel saya, saya akan membicarakannya dan menunjukkan bagaimana itu dapat digunakan.
Biarkan saya mengingatkan Anda: Sistem File InterPlanetary adalah jaringan berbagi file terdesentralisasi baru (server HTTP, Jaringan Pengiriman Konten ). Saya mulai cerita tentang hal itu dalam artikel "Sistem File Antarplanet IPFS" .
Biasanya, ketika hashing, melewati fungsi hash, data tidak dapat dikembalikan "dikompresi" dan sebagai hasilnya diperoleh pengidentifikasi pendek. Pengidentifikasi ini memungkinkan Anda menemukan data di jaringan dan memeriksa integritasnya.
Hash yang sepele adalah data itu sendiri. Data tidak berubah sama sekali dan, karenanya, ukuran "hash" sama dengan ukuran data.
Hash yang sepele melakukan fungsi yang sama dengan Data: URL . Pengidentifikasi konten dalam hal ini berisi data itu sendiri, bukan hash. Ini memungkinkan Anda untuk membuat sarang anak di induk sehingga segera tersedia setelah menerima induk. Anda juga dapat memasukkan data situs secara langsung dalam catatan DNS.
Misalnya, menyandikan string teks "Hello World" di pengidentifikasi konten (CID) dengan hash sepele.

Struktur ID:
[ ][varint CID][varint ][varint ID ][varint ][]
Mari kita mulai dari akhir.
[hash]
Hash yang sepele dalam kasus kami adalah string itu sendiri. Mari kita terjemahkan ke HEX .
" " = 0x"D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
Ini adalah HEX dari string yang disandikan utf-8 ini . Tetapi agar browser mengetahui dengan pasti bahwa ini adalah utf-8, tambahkan di awal: 0xEFBBBF
. Ini adalah penanda urutan byte (BOM).
0x"EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
[panjang hash varint]
Sekarang kita bisa menghitung panjang "hash". Setiap dua karakter HEX adalah satu byte. Dengan demikian, string yang dihasilkan adalah 22 byte. Di HEX, itu akan menjadi 0x16
.
Tambahkan 0x16
ke awal baris.
0x"16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
[id hash varint]
Sekarang kita membutuhkan id hash. Hash atau identitas trivial dalam tabel hash memiliki pengenal 0x00
.
Tambahkan 0x00
ke awal baris.
0x"00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
Ini sudah merupakan bagian multi-hash dari pengidentifikasi, Anda dapat transcode HEX ke Base58 dan multi-hash siap. Tapi ipfs tidak mengenalinya di luar pengidentifikasi konten (CID).
Mari kita lanjutkan.
[tipe konten varint]
Sekarang lihat tabel multicodec untuk mendapatkan tipe konten. Dalam kasus kami, ini adalah data mentah dan pengidentifikasi masing-masing adalah 0x55
.
Tambahkan 0x55
ke awal baris.
0x"55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
[varint versi CID]
Kami menyandikan format versi pertama pengenal konten . Karena itu, tambahkan 0x01.
Tambahkan 0x01
ke awal baris.
0x"01 55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180"
Dan kita sudah berada di garis finish.
[awalan dasar]
Ini menunjukkan opsi pengkodean data biner ke teks yang digunakan.
HEX (F)
Kita dapat menggunakan istilah HEX secara langsung dengan menambahkan simbol "F" di awal awalan basis HEX
F01550016EFBBBFD09FD180D0B8D0B2D0B5D18220D0BCD0B8D180
Kami mendapat pengidentifikasi HEX untuk konten yang berisi baris utf-8: "Halo dunia"
Pengujian: / ipfs / F01550016EFBBBFD09FD180D0B8D0B2D0B5D18220D0BCD0B8D180
Base58btc (z)
Base58btc akan lebih pendek karena itu
Kami menerjemahkan string HEX kami ke base58btc. Anda dapat menggunakan konverter online .
0x"01 55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" = "3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P" (base58btc)
Tambahkan karakter dasar awalan base58btc "z" ke awal baris
z3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P
Kami mendapatkan base58btc pengidentifikasi konten yang berisi baris utf-8: "Hello world"
Pengujian: / ipfs / z3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P
Blok DAG
Teksnya bagus, tetapi untuk menyandikan halaman HTML kita perlu menanamkan datanya di blok direktori DAG.
Inilah HTML kami:
<b><i><u> </u></i></b>
Demikian pula, sesuai dengan instruksi di atas, kami mendapatkan pengidentifikasi konten di base58btc untuk teks ini:
zeExnPvBXdTRwCBhfkJ1fHFDaXpdW4ghvQjfaCRHYxtQnd3H4w1MPbLczSqyCqVo
Sekarang tulis file JSON:
{ "links": [{ "Cid": { "/": "zeExnPvBXdTRwCBhfkJ1fHFDaXpdW4ghvQjfaCRHYxtQnd3H4w1MPbLczSqyCqVo" }, "Name": "index.html" }], "data": "CAE=" }
- "Data" menunjukkan jenis blok DAG - direktori.
- "Tautan" adalah larik tautan file.
- "Nama" adalah nama file, masing-masing.
- "Cid" berisi pengidentifikasi konten
ipfs dag put -f"protobuf"
konversikan blok JSON ke DAG melalui IPFS.
Saya mendapat multihash: QmXXixn4rCzGguhxQPjXQ8Mr5rdqwZfJTKkeB6DfZLt8EZ
Pada tahap ini, kami menerima blok di mana direktori dengan satu file tertulis di blok tersebut.
Selanjutnya, menggunakan multicash ini, bongkar blok yang sudah selesai
ipfs block get QmXXixn4rCzGguhxQPjXQ8Mr5rdqwZfJTKkeB6DfZLt8EZ > block.dag
Kami menerjemahkan konten block.dag ke HEX:
0x"123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801"
Tambahkan:
- Versi CID (0x01)
- Jenis Konten DAG (0x70)
- hash trivial (0x00)
- ukuran data 69 byte (0x45)
0x"01 70 00 45 123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801"
Konversikan ke Base58btc dan tambahkan awalan "z"
z6S3Z3W1zuRxio8AJC41jRTdyU9pZWnU6sNbvyGyypEdD8JVNdW42ZmGYWKWGbVDELLvJNWcMspaZMUPZKt7JQmhdyXCqq7j37GL
Dengan demikian, kami mendapat pengidentifikasi konten dengan direktori di mana halaman html index.html dengan teks "Hello World".
Pengujian: / ipfs / z6S3Z3W1zuRxio8AJC41jRTdyU9pZWnU6sNbvyGyypEdD8JVNdW42ZmGYWKWGbVDELLvJNWcMspaZMUPZKt7JQmhdyXCqjjg
Selanjutnya, hash ini juga dapat disematkan di blok lain atau direkam dalam catatan DNS dnslink. Jadi dalam satu blok Anda dapat memasukkan situs kecil yang sederhana.
Blok DAG dan Protokol Buffer
Blok DAG juga dapat dirakit secara manual. Blok DAG adalah data Protokol Buffer . Lapisan atas adalah merkledag.proto yang memiliki unixfs.proto di Data.
Buffer protokol
Protobuffer apa pun dimulai dengan pengidentifikasi bidang varint. Seringkali pengidentifikasi memakan satu byte karena nilai totalnya kurang dari 0x80. Dalam kasus kami, byte pertama adalah 0x12. 3 bit bawah dari bidang ini adalah tipe. Sisanya adalah ID yang ditentukan dalam file proto.
Berbatas panjang
Kami mendekripsi pengidentifikasi:
0x12 & 0x07 = 2 (: Length-delimited) 0x12 >> 3 = 2 (ID: 2)
Berbatas panjang berarti varint diikuti oleh ukuran bidang dalam byte dan isinya secara langsung. Tipe ini digunakan baik untuk berbagai struktur bersarang dan data mentah (string, byte, pesan yang disematkan, bidang berulang yang diemas). Apa yang sudah didefinisikan oleh file proto di dalamnya.
Varint
Menguraikan pengidentifikasi dari tipe lain:
0x18 & 0x07 = 0 (: Varint) 0x12 >> 3 = 3 (ID: 3)
Varint berarti yang segera mengikuti nilai dalam varint. Wadah ini digunakan untuk menulis banyak jenis nilai (int32, int64, uint32, uint64, sint32, sint64, bool, enum). Yang di dalamnya juga mendefinisikan file proto.
Kami akan menganalisis block.dag yang kami terjemahkan ke HEX di atas
Untuk mengurai blok, Anda dapat menggunakan situs yang akan secara otomatis mengurai Buffer Protokol apa pun tanpa menggunakan file proto.
0x"123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801"
Kami membongkar blok dan memetakan pengidentifikasi dari file proto.
merkledag.proto // An IPFS MerkleDAG Link message PBLink { // multihash of the target object optional bytes Hash = 1; // utf string name. should be unique per object optional string Name = 2; // cumulative size of target object optional uint64 Tsize = 3; } // An IPFS MerkleDAG Node message PBNode { // refs to other objects repeated PBLink Links = 2; // opaque user data optional bytes Data = 1; }
unixfs.proto message Data { enum DataType { Raw = 0; Directory = 1; File = 2; Metadata = 3; Symlink = 4; HAMTShard = 5; } required DataType Type = 1; optional bytes Data = 2; optional uint64 filesize = 3; repeated uint64 blocksizes = 4; optional uint64 hashType = 5; optional uint64 fanout = 6; }
12 (: 2 (Length-delimited). ID: 2 (PBLink PBNode.Links (merkledag.proto))) 3F (: 63 ) 0A (: 2 (Length-delimited). ID: 1 (PBLink.Hash)) 2F (: 47 ) 01 55 00 2B (CIDv1 Raw Identity 43 ) EFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E = "<b><i><u> </u></i></b>" 12 (: 2 (Length-delimited). ID: 2 (PBLink.Name)) 0A (: 10 ) 696E6465782E68746D6C = "index.html" 18 (: 0 (Varint). ID: 3 (PBLink.Size)) 00 (: 0) 0A (: 2 (Length-delimited). ID: 1 (PBNode.Data = Data (unixfs.proto))) 02 (: 2 ) 08 (: 0 (Varint). ID: 1 (Data.Type)) 01 (1 == Data.DataType.Directory)
Dengan demikian, sebuah blok dengan dua file akan terlihat seperti ini:
12 (: 2 (Length-delimited). ID: 2 (PBLink PBNode.Links (merkledag.proto))) 3B (: 59 ) 0A (: 2 (Length-delimited). ID: 1 (PBLink.Hash)) 2F (: 47 ) 01 55 00 2B (CIDv1 Raw Identity 43 ) EFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E = "<b><i><u> </u></i></b>" 12 (: 2 (Length-delimited). ID: 2 (PBLink.Name)) 06 (: 6 ) 312E68746D6C = "1.html" 18 (: 0 (Varint). ID: 3 (PBLink.Size)) 00 (: 0) 12 (: 2 (Length-delimited). ID: 2 (PBLink PBNode.Links)) 3B (: 59 ) 0A (: 2 (Length-delimited). ID: 1 (PBLink.Hash)) 2F (: 47 ) 01 55 00 2B (CIDv1 Raw Identity 43 ) EFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E = "<b><i><u> </u></i></b>" 12 (: 2 (Length-delimited). ID: 2 (PBLink.Name)) 06 (: 6 ) 322E68746D6C = "2.html" 18 (: 0 (Varint). ID: 3 (PBLink.Size)) 00 (: 0) 0A (: 2 (Length-delimited). ID: 1 (PBNode.Data = Data(unixfs.proto))) 02 (: 2 ) 08 (: 0 (Varint). ID: 1 (Data.Type)) 01 (1 == Data.DataType.Directory)
Yaitu, bidang PBNode.Links (0x12) diulang sebanyak jumlah file yang akan ditempatkan di blok.
Untuk memeriksa, tambahkan di awal "F 01 70 00" (HEX CIDv1 DAG Identity) dan ukuran blok DAG "7E" (126 byte)
F 01 70 00 7E 12 3B 0A 2F 01 55 00 2B EFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E 12 06 312E68746D6C 18 00 12 3B 0A 2F 01 55 00 2B EFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E 12 06 322E68746D6C 18 00 0A 02 08 01
Periksa: / ipfs / F0170007E123B0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E1206312E68746D6C1800123B0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E1206322E68746D6C18000A020801
Kesimpulan
Saya harap saya telah memberikan informasi yang cukup sehingga memungkinkan untuk mengimplementasikan pembuatan blok dan pengidentifikasi.