
مرحبا عزيزي مستخدمي هبر! هذا المقال حول الويب 3.0 - الإنترنت اللامركزي. يقدم الويب 3.0 مفهوم اللامركزية كأساس للإنترنت الحديث. تتطلب العديد من أنظمة الكمبيوتر والشبكات ميزات الأمان واللامركزية لتلبية احتياجاتهم. يوفر السجل الموزع باستخدام تقنية blockchain حلولًا فعالة لتحقيق اللامركزية.
Blockchain هو سجل موزعة. يمكنك التفكير في الأمر كقاعدة بيانات ضخمة تعيش إلى الأبد ، ولا تتغير أبدًا على مدار الوقت. يوفر blockchain الأساس لتطبيقات وخدمات الويب اللامركزية.
ومع ذلك ، فإن blockchain هو أكثر من مجرد قاعدة بيانات. إنه يعمل على زيادة الأمان والثقة بين أعضاء الشبكة ، مما يعزز المعاملات التجارية عبر الإنترنت.
الإجماع البيزنطي يزيد من موثوقية الشبكة ويحل مشكلة الاتساق.
قابلية التوسع التي توفرها DLT يغير شبكات الأعمال الحالية.
تقدم Blockchain فوائد جديدة ومهمة للغاية:
- يمنع الأخطاء المكلفة.
- يضمن المعاملات شفافة.
- رقمنة البضائع الحقيقية.
- يفرض العقود الذكية.
- يزيد من سرعة وأمن المدفوعات.
لقد قمنا بتطوير PoE خاص للبحث في بروتوكولات التشفير وتحسين حلول DLT و blockchain الحالية.
تفتقر معظم أنظمة السجل العام إلى خاصية قابلية التوسع ، مما يجعل إنتاجيتها منخفضة إلى حد ما. على سبيل المثال ، Ethereum يعالج فقط ~ 20 tx / s.
تم تطوير العديد من الحلول لزيادة قابلية التوسع مع الحفاظ على اللامركزية. ومع ذلك ، لا يمكن تحقيق سوى 2 من بين 3 مزايا - قابلية التوسع والأمان واللامركزية - في وقت واحد.
يوفر استخدام الأشكال الجانبية أحد أكثر الحلول فعالية.
مفهوم البلازما
يتلخص مفهوم البلازما في فكرة أن السلسلة الجذرية تعالج عددًا صغيرًا من الإلتزامات من سلاسل الأطفال ، وبالتالي تكون بمثابة الطبقة الأكثر أمانًا والأخيرة لتخزين جميع الحالات الوسيطة. تعمل كل سلسلة تابعة على شكل سلسلة المفاتيح الخاصة بها مع خوارزمية الإجماع الخاصة بها ، ولكن هناك بعض المحاذير المهمة.
- يتم إنشاء العقود الذكية في سلسلة الجذر وتكون بمثابة نقاط تفتيش لسلاسل الأطفال داخل سلسلة الجذر.
- يتم إنشاء سلسلة تابعة وتعمل كقطعة رئيسية خاصة بها مع إجماعها الخاص. جميع الدول في سلسلة الأطفال محمية ببراهين الاحتيال التي تضمن أن جميع عمليات الانتقال بين الولايات صالحة وتطبق بروتوكول السحب.
- يمكن نشر العقود الذكية الخاصة بـ DApp أو منطق تطبيق السلسلة الفرعية في السلسلة الفرعية.
- يمكن تحويل الأموال من سلسلة الجذر إلى سلسلة الأطفال.
يتم منح المدققين حوافز اقتصادية للتصرف بأمانة وإرسال التزامات إلى سلسلة الجذر - طبقة تسوية المعاملات النهائية.
نتيجة لذلك ، لا يتعين على مستخدمي DApp العاملين في السلسلة الفرعية التفاعل مع سلسلة الجذر على الإطلاق. بالإضافة إلى ذلك ، يمكنهم وضع أموالهم في سلسلة الجذر وقتما يريدون ، حتى لو تم اختراق سلسلة الأطفال. تتيح هذه المخارج من السلسلة الفرعية للمستخدمين تخزين أموالهم بأمان مع أدلة Merkle ، مما يؤكد ملكية مبلغ معين من الأموال.
ترتبط المزايا الرئيسية للبلازما بقدرتها على تسهيل العمليات الحسابية التي تفرط السلسلة الرئيسية بشكل كبير. بالإضافة إلى ذلك ، يمكن لـ Ethereum blockchain التعامل مع مجموعات بيانات أكثر اتساعًا ومتوازية. يتم أيضًا نقل الوقت الذي تم إزالته من سلسلة الجذر إلى عقد Ethereum ، والتي تتطلب متطلبات معالجة وتخزين أقل.
يقوم Plasma Cash بتعيين أرقام مسلسلة فريدة للرموز عبر الإنترنت. تشمل مزايا هذا المخطط عدم الحاجة إلى التأكيدات ، ودعم أبسط لجميع أنواع الرموز (بما في ذلك الرموز غير القابلة للفطريات) ، والتخفيف من المخارج الجماعية من سلسلة الأطفال.
يعد مفهوم "المخارج الجماعية" من سلسلة الأطفال مشكلة تواجه البلازما. في هذا السيناريو ، قد تؤدي عمليات السحب المتزامنة المنسقة من سلسلة فرعية إلى عدم كفاية القدرة الحاسوبية لسحب جميع الأموال. نتيجة لذلك ، قد يخسر المستخدمون الأموال.
خيارات لتنفيذ البلازما

البلازما الأساسية لديها الكثير من خيارات التنفيذ.
تشير الاختلافات الرئيسية إلى:
- أرشفة المعلومات حول طرق التخزين والعرض في الولاية ؛
- أنواع الرموز (القسمة ، غير قابلة للتجزئة) ؛
- أمن المعاملات ؛
- نوع خوارزمية الإجماع.
تشمل الاختلافات الرئيسية في البلازما ما يلي:
- البلازما القائمة على UTXO - تتكون كل معاملة من المدخلات والمخرجات. يمكن إجراء المعاملة وإنفاقها. قائمة المعاملات غير المنفقة هي حالة السلسلة الفرعية نفسها.
- بلازما قائمة على الحساب - تحتوي هذه البنية على انعكاس وتوازن كل حساب. يتم استخدامه في Ethereum ، حيث يمكن أن يكون كل حساب من نوعين: حساب مستخدم وحساب عقد ذكي. البساطة هي ميزة هامة للبلازما القائمة على الحساب. في الوقت نفسه ، فإن عدم قابلية التوسع هو عيب. يتم استخدام خاصية خاصة ، "nonce" ، لمنع تنفيذ المعاملة مرتين.
من أجل فهم هياكل البيانات المستخدمة في blockchain Cash blockchain وكيف تعمل الالتزامات ، من الضروري توضيح مفهوم Merkle Tree.
أشجار ميركل واستخدامها في البلازما
يعد Merkle Tree بنية بيانات مهمة للغاية في عالم blockchain. يتيح لنا التقاط مجموعة معينة من البيانات وإخفاء البيانات ، ومع ذلك نثبت أن بعض المعلومات كانت موجودة في المجموعة. على سبيل المثال ، إذا كان لدينا عشرة أرقام ، فيمكننا إنشاء دليل لهذه الأرقام ومن ثم إثبات وجود عدد معين في هذه المجموعة. سيكون لهذا الدليل حجم ثابت صغير ، مما يجعل نشره في Ethereum غير مكلف.
يمكنك استخدام هذا المبدأ لمجموعة من المعاملات ، وإثبات أن معاملة معينة موجودة في هذه المجموعة. هذا هو بالضبط ما يفعله المشغل. يتكون كل كتلة من مجموعة معاملات تتحول إلى Merkle Tree. جذر هذه الشجرة هو دليل يتم نشره في Ethereum مع كل كتلة بلازما.
يجب أن يكون المستخدمون قادرين على سحب أموالهم من سلسلة البلازما. لهذا ، يرسلون معاملة "خروج" إلى Ethereum.
يستخدم Plasma Cash شجرة Merkle خاصة تلغي الحاجة إلى التحقق من صحة كتلة كاملة. يكفي التحقق من صحة الفروع التي تتوافق مع الرمز المميز للمستخدم فقط.
لنقل رمز ، من الضروري تحليل تاريخه ومسح الرموز المميزة التي يحتاجها مستخدم معين فقط. عند نقل رمز مميز ، يقوم المستخدم ببساطة بإرسال السجل بأكمله إلى مستخدم آخر ، يمكنه بعد ذلك المصادقة على السجل بأكمله ، والأهم من ذلك ، القيام بذلك بسرعة كبيرة.

هياكل البيانات النقدية البلازما لتخزين الدولة والتاريخ
يُنصح باستخدام أشجار Merkle Trees المحددة فقط ، لأنه من الضروري الحصول على أدلة التضمين وعدم التضمين لمعاملة في كتلة. على سبيل المثال:
- شجرة ميركل متناثرة
- شجرة باتريشيا
لقد قمنا بتطوير تطبيقات Sparse Merkle Tree و Patricia Tree الخاصة بنا لعملائنا.
تشبه شجرة Sparse Merkle شجرة Merkle Tree القياسية ، باستثناء أن بياناتها مفهرسة ، وتوضع كل نقطة بيانات على ورقة تتوافق مع فهرس نقطة البيانات هذه.
لنفترض أن لدينا شجرة ميركل من أربع أوراق. دعونا ملء هذه الشجرة مع الحروف A و D ، للمظاهرة. الحرف A هو أول حرف أبجدي ، لذلك سنضعه على الورقة الأولى. وبالمثل ، سنضع D على الورقة الرابعة.
إذن ما الذي يحدث في الأوراق الثانية والثالثة؟ يجب أن تترك فارغة. بتعبير أدق ، يتم استخدام قيمة خاصة (على سبيل المثال ، صفر) بدلاً من حرف.
الشجرة تبدو في النهاية هكذا:

يعمل دليل التضمين بنفس طريقة عمل شجرة ميركل العادية. ماذا يحدث إذا أردنا إثبات أن C ليس جزءًا من شجرة ميركل هذه؟ ! الابتدائية نعلم أنه إذا كانت C جزءًا من شجرة ، فستكون على الورقة الثالثة. إذا لم يكن C جزءًا من الشجرة ، فيجب أن تكون الورقة الثالثة صفرية.
كل ما هو مطلوب هو دليل إدراج Merkle قياسي يوضح أن الورقة الثالثة هي صفر.
أفضل ميزة لشجرة Sparse Merkle هو أنها توفر مستودعات لقيم المفاتيح داخل شجرة Merkle!
جزء من كود بروتوكول PoE يبني شجرة Merkle Sparse:
class SparseTree { //... buildTree() { if (Object.keys(this.leaves).length > 0) { this.levels = [] this.levels.unshift(this.leaves) for (let level = 0; level < this.depth; level++) { let currentLevel = this.levels[0] let nextLevel = {} Object.keys(currentLevel).forEach((leafKey) => { let leafHash = currentLevel[leafKey] let isEvenLeaf = this.isEvenLeaf(leafKey) let parentLeafKey = leafKey.slice(0, -1) let neighborLeafKey = parentLeafKey + (isEvenLeaf ? '1' : '0') let neighborLeafHash = currentLevel[neighborLeafKey] if (!neighborLeafHash) { neighborLeafHash = this.defaultHashes[level] } if (!nextLevel[parentLeafKey]) { let parentLeafHash = isEvenLeaf ? ethUtil.sha3(Buffer.concat([leafHash, neighborLeafHash])) : ethUtil.sha3(Buffer.concat([neighborLeafHash, leafHash])) if (level == this.depth - 1) { nextLevel['merkleRoot'] = parentLeafHash } else { nextLevel[parentLeafKey] = parentLeafHash } } }) this.levels.unshift(nextLevel) } } } }
هذا الرمز هو تافهة جدا. لدينا مستودع القيمة الرئيسية مع دليل التضمين / عدم التضمين.
في كل تكرار ، يتم ملء مستوى معين من الشجرة النهائية ، بدءًا من آخرها. اعتمادًا على ما إذا كان مفتاح الورقة الحالية زوجيًا أو غريبًا ، نأخذ ورقتين متجاورتين ونعد علامة التجزئة للمستوى الحالي. إذا وصلنا إلى النهاية ، فسنكتب merkleRoot واحد - تجزئة مشتركة.
عليك أن تفهم أن هذه الشجرة مليئة بقيم فارغة مبدئية. إذا قمنا بتخزين كمية كبيرة من معرفات الرمز المميز ، فسيكون لدينا حجم شجرة كبير ، وسيكون طويلاً!
هناك العديد من العلاجات لعدم التحسين ، لكننا قررنا تغيير هذه الشجرة إلى شجرة باتريشيا.
A Patricia Tree هي عبارة عن مزيج من Radix Tree و Merkle Tree.
يقوم مفتاح بيانات شجرة Radix بتخزين المسار إلى البيانات نفسها ، مما يسمح لنا بإنشاء بنية بيانات محسّنة للذاكرة.

هنا تم تطوير تطبيق لعملائنا:
buildNode(childNodes, key = '', level = 0) { let node = {key} this.iterations++ if (childNodes.length == 1) { let nodeKey = level == 0 ? childNodes[0].key : childNodes[0].key.slice(level - 1) node.key = nodeKey let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(nodeKey)), childNodes[0].hash]) node.hash = ethUtil.sha3(nodeHashes) return node } let leftChilds = [] let rightChilds = [] childNodes.forEach((node) => { if (node.key[level] == '1') { rightChilds.push(node) } else { leftChilds.push(node) } }) if (leftChilds.length && rightChilds.length) { node.leftChild = this.buildNode(leftChilds, '0', level + 1) node.rightChild = this.buildNode(rightChilds, '1', level + 1) let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(node.key)), node.leftChild.hash, node.rightChild.hash]) node.hash = ethUtil.sha3(nodeHashes) } else if (leftChilds.length && !rightChilds.length) { node = this.buildNode(leftChilds, key + '0', level + 1) } else if (!leftChilds.length && rightChilds.length) { node = this.buildNode(rightChilds, key + '1', level + 1) } else if (!leftChilds.length && !rightChilds.length) { throw new Error('invalid tree') } return node }
انتقلنا بشكل متكرر وبنينا الشجرة الفرعية اليسار واليمين منفصلة. تم بناء مفتاح كمسار في هذه الشجرة.
هذا الحل هو أكثر تافهة. هو الأمثل جيدا ويعمل بشكل أسرع. في الواقع ، يمكن تحسين شجرة Patricia بشكل أكبر عن طريق إدخال أنواع عقدة جديدة - عقدة التمديد ، العقدة الفرعية ، وهكذا ، كما هو الحال في بروتوكول Ethereum. لكن التنفيذ الحالي يلبي جميع متطلباتنا - لدينا بنية بيانات سريعة ومحسنة للذاكرة.
من خلال تنفيذ هياكل البيانات هذه في مشروع عميلنا ، فقد جعلنا عملية تحويل Plasma Cash ممكنة. هذا يسمح لنا بالتحقق من تاريخ الرمز وإدراج / عدم إدراج الرمز في شجرة ، مما يسرع إلى حد كبير من التحقق من صحة الكتل وسلسلة الطفل البلازما نفسها.
الروابط:
- البلازما ورقة بيضاء
- بوابة جيت
- استخدام الحالات ووصف العمارة
- ورقة شبكة البرق