شرح خوارزمية دليل الحصة POS – Proof of Stake -الجزء الثاني

تطرقنا في الجزء الاول إلى تعريفات و ماهو دليل العمل ونظم/خوارزميات الاتفاق للبلوكتشين و كذا قواعد و بنية دليل الحصة , و الان سنكمل موضوعنا

الـ Kernel Hash لـ Proof of Stake:

الـ Kernel Hash يتألف على وجه التحديد من المعلومات التالية، بالترتيب:
1- الـ Stack modifier مُعَدِل° الحصة للبلوك السابق (المزيد عنه لاحقاً).
2- الطابع الزمني لمعاملة prevout (أي خرج المعاملة التي يتم صرفها في الـ vin الأول لمعاملة الحصة).
3- هاش معاملة الـ prevout.
4- رقم الخرج لـ prevout (بمعنى آخر، أي خرج للمعاملة يتم صرفه بمعاملة الحصة؟).
5- الوقت الحالي للبلوك، مع البتات ال4 الأخيرة تساوي ال0 لتقليل تقسيماته. هذه هو الشي الوحيد الذي يتغير ضمن معاملة الحصة او التكديس.
الـ Stake Modifier لبلوك POS هو هاش لـِ:
1- هاش معاملة الـ prevout ضمن بلوكات POS, أو هاش البلوك ضمن بلوك POW.
2- الـ Stake Modifier للبلوك السابق (معدل الحصة لبلوك الانشاء او التهيئة Genesis Block يساوي الصفر).
الطريقة الوحيدة لتغيير الـ Kernel Hash الحالي (من أجل انتاج بلوك)، هي اما بتغيير الـ prevout الخاص بك، أو بتغيير وقت البلوك الحالي.
محفظة واحدة تحتوي بالعادة على عدد من الـ UTXO. رصيد المحفظة هو في الأساس مجموع قيم جميع الـ UTXOs التي يمكن انفاقها من قبل المحفظة. هذا طبعا مطابق لمحفظة POS. هذا مهم رغم ذلك، لان أي خرج يمكن استخدامه للتكديس او التحصيص Staking. واحد من هذه المخرجات يمكن ان يصبح الـ prevout ضمن معاملة الحصة لتشكيل أو انتاج بلوك POS صالح.
أخيراً، يوجد جانب إضافي واحد يختلف في عملية تعدين بلوك POS. حيث صعوبة التعدين تقاس مقابل عدد العملات الموجودة ضمن معاملة الحصة. صعوبة التعدين في POS ينتهي بها الأمر لتكون أسهل بمقدار الضعف عند تكديس عملتين، بالمقارنة بتكديس عملة واحدة. إذا لم تكن الحالة كذلك، فذلك سوف يشجع على انشاء عدد كبير من الـ UTXOs الصغيرة للتكديس، والذي بدوره سيملئ او يزيد حجم البلوكتشين وبالتالي ستحتاج الشبكة ككل لتسخير المزيد من الموارد للمحافظة عليها، كذلك يحتمل تهديد أمن البلوكتشين ككل.
إذا أردنا كتابة كود شبه برمجي pseudo-code لإظهار كيفية إيجاد هاش النواة Kernel Hash صالح، ستكون كالتالي:

While(true) {
  Foreach(utxo in wallet) {
    blockTime = currentTime – currentTime % 16
    posDifficulty = difficulty * utxo.value
    hash = hash(previousStakeModifier + utxo.time + utxo.hash + utxo.n + blockTime)
    if (hash < posDifficulty) {
      done
    }
  }
  wait 16s
}

قد لا يكون النص شبه البرمجي السابق مفهوما مثل كود POW لذلك سأحاول شرحه كتابيا:

قم بعمل التالي مرارا وتكرارا الى الأبد:
احسب الـ BlockTime ليساوي الوقت الحالي ناقص باقي قسمة الوقت الحالي نفسه على 16.
احسب الـ posDifficulty على أنه صعوبة التعدين في الشبكة مضروب بعدد العملات الموجودة في الـ UTXO.
تنقل خلال كل UTXO في المحفظة. عند كل UTXO, قم بحساب هاش SHA256 باستخدام مُعَدِل التكديس/الحصة للبلوك السابق، بالإضافة الى بعض البيانات من الـ UTXO وأخيرا الـ BlockTime. ثم قارن هذا الهاش مع posDifficulty. إذا كان الهاش أقل من posDifficulty, عندها يكون هاش النواة Kernel Hash صالح ويمكنك من انشاء بلوك جديد.
بعد المرور على جميع الـ UTXOs, إذا لم يتم انتاج أي هاش أقل من الـ posDifficulty, عندها انتظر 16 ثانية وقم بتكرار كل شيء مرة أخرى.

الآن بعد إيجاد هاش نواة صالح باستخدام واحد من الـ UTXOs التي يمكننا إنفاقها، يمكننا انشاء معاملة الحصة.
هذه المعاملة سيكون لها vin واحدة، التي تنفق الـ UTXO التي وجدنا ان لديها هاش نواة صالح.
وسيكون لديها (على الأقل) اثنان vouts. الـ voutالأول سيكون فارغ، مُعَرِفَاً الـ Blockchain ان المعاملة هي معاملة تكديس/حصة Stake Transaction. الـ vout الثاني سيحتوي إما على معاملة بيانات OP_RETURN تحتوي على مفتاح عمومي واحد، او ستحتوي على نص برمجي pay-to-pubkey.

أخيراً، تتم إضافة أي معاملات من الـ mempool إلى البلوك. الشيء الواحد الباقي لعمله الآن هو انشاء توقيع رقمي، إثباتً أننا وافقنا على كتلة POS صالحة. التوقيع الرقمي يجب ان يستخدم المفتاح العام المضمن في الـ vout الثاني لمعاملة الحصة/التكديس Stake Transaction. بعد إضافة التوقيع، يمكن ان يتم بث البلوك الى الشبكة. العقد في الشبكة ستقوم بعد ذلك بتأكيد صحة البلوك، فاذا وجدته صالح ستقوم بقبوله واضافته الى البلوكتشين وإعادة بث البلوك الجديد الى العقد المتصلة معها.

إلى هنا ينتهي الموضوع, نشكر الاخ icy3 على هذا المجهود الجبار

المصدر:

أضف تعليق

موقع ويب تم إنشاؤه بواسطة ووردبريس.كوم. قالب: Baskerville 2 بواسطة Anders Noren.

أعلى ↑

تصميم موقع كهذا باستخدام ووردبريس.كوم
ابدأ