نظام الملفات بين الكواكب - تجزئة (هوية) تافهة ، كتلة DAG ومخازن البروتوكول

في الآونة الأخيرة ، أضاف IPFS دعمًا لتجزئة (هوية) تافهة . في مقالتي سأتحدث عنه وأظهر كيف يمكن استخدامه.


دعني أذكرك: InterPlanetary File System عبارة عن شبكة جديدة لامركزية لمشاركة الملفات (خادم HTTP ، شبكة توصيل المحتوى ). لقد بدأت القصة عن ذلك في مقال "نظام الملفات بين الكواكب IPFS" .

عادة ، عند التجزئة ، من خلال وظيفة التجزئة ، يتم "ضغط" البيانات بشكل لا رجعة فيه ونتيجة لذلك يتم الحصول على معرف قصير. يتيح لك هذا المعرف العثور على البيانات الموجودة على الشبكة والتحقق من سلامتها.


تجزئة تافهة هي البيانات نفسها. لا تتغير البيانات على الإطلاق ، وبالتالي ، فإن حجم "التجزئة" يساوي حجم البيانات.


تؤدي التجزئة العادية نفس وظيفة البيانات: URL . يحتوي معرف المحتوى في هذه الحالة على البيانات نفسها بدلاً من التجزئة. يسمح لك هذا بتداخل الكتل الفرعية في أحد الوالدين مما يجعلها متاحة فور تلقي الوالد. يمكنك أيضًا تضمين بيانات الموقع مباشرة في سجل DNS.


على سبيل المثال ، قم بتشفير السلسلة النصية "Hello World" في معرّف المحتوى (CID) بتجزئة بسيطة.
الصورة


هيكل الهوية:


[ ][varint  CID][varint  ][varint ID ][varint  ][] 

لنبدأ من النهاية.


[تجزئة]


التجزئة البسيطة في حالتنا هي السلسلة نفسها. دعنا نترجمها إلى HEX .


 " " = 0x"D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

هذا هو HEX لهذه السلسلة المشفرة utf-8 . ولكن لكي يعرف المستعرض على وجه اليقين أن هذا خط utf-8 ، قم بإضافته إليه في البداية: 0xEFBBBF . هذه علامة تسلسل بايت (BOM).


 0x"EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

[طول تجزئة varint]


الآن يمكننا حساب طول "التجزئة". كل حرفين HEX بايت واحد. وفقًا لذلك ، يبلغ طول السلسلة الناتجة 22 بايت. في HEX ، سيكون 0x16 .


أضف 0x16 إلى بداية السطر.


 0x"16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

[معرف تجزئة varint]


الآن نحن بحاجة إلى معرف التجزئة. تحتوي التجزئة أو الهوية التافهة في جدول التجزئة على المعرف 0x00 .


أضف 0x00 إلى بداية السطر.


 0x"00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

هذا بالفعل جزء متعدد التجزئة من المعرف ، يمكنك تحويل HEX إلى Base58 والتجزئة المتعددة جاهزة. لكن IPfs لا يتعرف عليه خارج معرف المحتوى (CID).


دعنا ننتقل.


[نوع محتوى varint]


الآن انظر إلى جدول multicodec للحصول على نوع المحتوى. في حالتنا ، هذه بيانات أولية 0x55 هو 0x55 على التوالي.


أضف 0x55 إلى بداية السطر.


 0x"55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

[نسخة varint من CID]


نقوم بتشفير تنسيق الإصدار الأول من معرف المحتوى . لذلك ، أضف 0x01.


أضف 0x01 إلى بداية السطر.


 0x"01 55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" 

وهكذا نحن بالفعل على خط النهاية.


[البادئة الأساسية]


يشير إلى خيار ترميز البيانات الثنائية إلى النص المستخدم.


HEX (F)


يمكننا استخدام المصطلح HEX مباشرة بإضافة الرمز "F" في بداية البادئة الأساسية HEX


 F01550016EFBBBFD09FD180D0B8D0B2D0B5D18220D0BCD0B8D180 

حصلنا على معرف HEX للمحتوى الذي يحتوي على سطر utf-8: "Hello world"


الاختبار: / ipfs / F01550016EFBBBFD09FD180D0B8D0B2D0B5D18220D0BCD0B8D180


Base58btc (ض)


وبالتالي فإن Base58btc سيكون أقصر


نترجم سلسلة HEX إلى base58btc. يمكنك استخدام المحول عبر الإنترنت .


 0x"01 55 00 16 EFBBBF D09F D180 D0B8 D0B2 D0B5 D182 20 D0BC D0B8 D180" = "3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P" (base58btc) 

أضف حرف البادئة الأساسية base58btc "z" إلى بداية السطر


 z3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P 

حصلنا على base58btc معرف محتوى يحتوي على سطر utf-8: "Hello world"


الاختبار: / ipfs / z3NDGAEgXCxbPucFFCQc9s5ScqZjqVFNr56P


كتلة DAG


النص جيد ، ولكن من أجل ترميز صفحة HTML ، نحتاج إلى تضمين بياناتها في كتلة دليل DAG.


إليك HTML الخاص بنا:


 <b><i><u> </u></i></b> 

وبالمثل ، وفقًا للتعليمات أعلاه ، نحصل على معرف المحتوى في base58btc لهذا النص:


 zeExnPvBXdTRwCBhfkJ1fHFDaXpdW4ghvQjfaCRHYxtQnd3H4w1MPbLczSqyCqVo 

الآن اكتب ملف JSON:


 { "links": [{ "Cid": { "/": "zeExnPvBXdTRwCBhfkJ1fHFDaXpdW4ghvQjfaCRHYxtQnd3H4w1MPbLczSqyCqVo" }, "Name": "index.html" }], "data": "CAE=" } 

  1. تشير "البيانات" إلى نوع كتلة DAG - الدليل.
  2. "الروابط" هي مجموعة من روابط الملفات.
  3. "الاسم" هو اسم الملف ، على التوالي.
  4. يحتوي "Cid" على معرف المحتوى

ipfs dag put -f"protobuf" بتحويل JSON إلى DAG block عبر IPFS.


حصلت على Multihash: QmXXixn4rCzGguhxQPjXQ8Mr5rdqwZfJTKkeB6DfZLt8EZ


في هذه المرحلة ، تلقينا كتلة يتم فيها تسجيل دليل بملف واحد في الكتلة.


بعد ذلك ، باستخدام هذا multicash ، قم بإلغاء تحميل الكتلة النهائية


 ipfs block get QmXXixn4rCzGguhxQPjXQ8Mr5rdqwZfJTKkeB6DfZLt8EZ > block.dag 

نترجم محتويات block.dag إلى HEX:


 0x"123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801" 

أضف:


  1. إصدار CID (0x01)
  2. نوع محتوى DAG (0x70)
  3. تجزئة تافهة (0x00)
  4. حجم البيانات 69 بايت (0x45)

 0x"01 70 00 45 123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801" 

حوّل إلى Base58btc وأضف البادئة "z"


 z6S3Z3W1zuRxio8AJC41jRTdyU9pZWnU6sNbvyGyypEdD8JVNdW42ZmGYWKWGbVDELLvJNWcMspaZMUPZKt7JQmhdyXCqq7j37GL 

وبالتالي ، حصلنا على معرف محتوى بدليل به صفحة html index.html مع النص "Hello World".


الاختبار: / ipfs / z6S3Z3W1zuRxio8AJC41jRTdyU9pZWnU6sNbvyGyypEdD8JVNdW42ZmGYWKWGbVDELLvJNWcMspaZMUPZKt7JQmhdyXCqqjj37gL


علاوة على ذلك ، يمكن أيضًا تضمين هذه التجزئة في كتلة أخرى أو تسجيلها في سجل DNS dnslink. لذلك في كتلة واحدة يمكنك احتواء موقع صغير بسيط.


DAG Block and Protocol Buffers


يمكن أيضًا تجميع كتلة DAG يدويًا. كتلة DAG هي بيانات مخازن البروتوكول . الطبقة العليا هي merkledag.proto والتي تحتوي على unixfs.proto في البيانات.


مخازن البروتوكول


يبدأ أي protobuffer بمعرف حقل varint. غالبًا ما يستهلك المعرف بايت واحد لأن قيمته الإجمالية أقل من 0x80. في حالتنا ، البايت الأول هو 0x12. البتات السفلية الثلاث لهذا الحقل هي النوع. والباقي هو المعرّف المحدد في ملف proto.


محدد الطول

نقوم بفك تشفير المعرف:


 0x12 & 0x07 = 2 (: Length-delimited) 0x12 >> 3 = 2 (ID: 2) 

يعني تحديد الطول أن المتغير متبوع بحجم الحقل بالبايت ومحتوياته مباشرة. يستخدم هذا النوع في كل من الهياكل المتداخلة والبيانات الأولية (السلسلة ، البايت ، الرسائل المضمنة ، الحقول المتكررة المعبأة). ما يحدده ملف البروتو فيه بالفعل.


Varint

فك معرف نوع آخر:


 0x18 & 0x07 = 0 (: Varint) 0x12 >> 3 = 3 (ID: 3) 

يعني Varint أن يتبع القيمة في varint على الفور. تُستخدم هذه الحاوية لكتابة العديد من أنواع القيم (int32 ، int64 ، uint32 ، uint64 ، sint32 ، sint64 ، bool ، enum). والذي يحدد فيه أيضًا ملف البروتو.


سنقوم بتحليل block.dag الذي ترجمناه إلى HEX أعلاه


لتحليل كتلة ، يمكنك استخدام موقع يقوم تلقائيًا بتحليل أي مخزن مؤقت للبروتوكول دون استخدام ملفات بروتو.


 0x"123F0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E120A696E6465782E68746D6C18000A020801" 

نقوم بتفكيك الكتلة وتعيين المعرّفات من الملفات الأولية.


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) 

وفقًا لذلك ، ستبدو الكتلة التي تحتوي على ملفين كما يلي:


 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) 

أي أن حقل PBNode.Links (0x12) يتكرر عدة مرات مثل عدد الملفات التي سيتم وضعها في الكتلة.


للتحقق ، أضف في بداية "F 01 70 00" (هوية HEX CIDv1 DAG) وحجم كتلة DAG "7E" (126 بايت)


 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 

تحقق: / اعتمدها الفريق الحكومي الدولي / F0170007E123B0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E1206312E68746D6C1800123B0A2F0155002BEFBBBF3C623E3C693E3C753ED09FD180D0B8D0B2D0B5D18220D0BCD0B8D1803C2F753E3C2F693E3C2F623E1206322E68746D6C18000A020801


الخلاصة


آمل أن تكون قد قدمت معلومات كافية حتى يتسنى تنفيذ إنشاء الكتل والمعرفات.

Source: https://habr.com/ru/post/ar423073/


All Articles