المعاملات تمكنك من إنفاق الساتوشيز Satoshis الخاص بك. كل معاملة مبنية من عدة أجزاء، التي بدورها تُمَكنْ من إجراء مدفوعات مباشرة بسيطة أو معاملات معقدة (قد تحتوي شروط).
تالياً سنشرح كل جزء من أجزاء المعاملات وكيفية استخدامهم وتجميعهم لبناء معاملة كاملة، بالإضافة الى إدارة الموارد المالية باستخدام نموذج UTXO.
تظهر الصورة السابقة الأجزاء الرئيسية لمعاملة Bitcoin. كل معاملة لها على الأقل دخل واحد (Input) وخرج واحد (Output). كل دخل (Input) يُنفق الساتوشيز المدفوعة لخرج سابق (Output). عندها كل خرج (Output) من المعاملة يسمى "خرج معاملة غير منفق" Unspent Transaction Output (UTXO) ينتظر الى ان يتم انفاقه من خلال جعله كدخل لمعاملة أخرى. عندما تُريك محفظة الـبتكوين الخاصة بك أن رصيدك مثلاً 10,000 ساتوشي، فالمقصود هنا فعلياً أنك تملك 10,000 ساتوشي ضمن خرج واحد غير منفق UTXO أو أكثر.
المعاملات في الـ Bitcoin تشبه الشيك الى حد ما في بعض الجوانب. عندما تريد إنفاق خرج معاملة Output يجب عليك إنفاق كل شيء. هذا يشبه كيف أنه لا يمكنك الذهاب الى البنك والقول إنك تريد إنفاق أو صرف نصف الشيك. مع ذلك، ففي هذا النموذج لا يوجد ما يقابل الأوراق المالية أو الحسابات البنكية. لذلك من أجل ارسال المال يجب عليك أن تصرف الشيك مكتوب لك، وتُخرِج/ترسل Output من عملية صرف الشيك تلك ما تريده الى وجهتك المقصودة والباقي تكتبه بشيك آخر لك.
عملية صرف الشيك هذه هي في الواقع معاملة في الـ Bitcoin. في المعاملة تقوم بإنفاق شيك واحد أو أكثر (المعروف فعلا بـِ UTXO) وتنشئ UTXO واحد أو أكثر الى وجهة جديدة من هذه الأموال المنفقة. الـ UTXOs المنفقة في معاملة تسمى (vins)، والـ UTXOs الجديدة التي أنشأتها تسمى (vouts). بمجرد أن يتم إنفاق UTXO من خلال معاملة يمكن اعتبارها منتهية وقد تم تدميرها. يمكنك مشاهدة تاريخها ضمن البلوكتشين، لكن لا يمكن عمل أي شيء بها.
في العملات الإلكترونية، خرج معاملة غير المنفق UTXO – Unspent Transaction Output هو تجريد لـِ أو مجموع النقود الكترونية، أي يتم تعريف النقود الالكترونية من خلال الـ UTXO, كل UTXO يمثل سلسلة من الملكية (Chain of Ownership) مُطَبَقة كسلسلة من التواقيع الرقيمة (Chain of Digital Signatures) بحيث يوقع المالك المعاملة لنقل ملكية الـ UTXO الخاص به الى المفتاح العام للمستقبل.
كل معاملة تبدأ بـ 4 Bitsتُحدد رقم الإصدار للمعاملة، والتي بدورها تُعلِم النظراء والمعدنيين في الشبكة: أيّ مجموعة من القواعد يجب استخدامها للتحقق من صحة المعاملة. وهذا البناء يتيح فرصة لمطوري بتكوين لإنشاء قواعد جديدة لتأكيد صحة المعاملات المستقبلية دون إبطال المعاملات السابقة.
خرج المعاملة له رقم فهرسة ضمني Index Number اعتمادا على موقعه ضمن المعاملة، مثلا رقم الفهرسة لأول خرج هو 0. الخرج يملك أيضاً كمية من الساتوشيز التي يتم دفعها او انفاقها لنص برمجي (pubkey مثلاً) مشروط. بالتالي أي شخص يمكن ان يلبي او يحقق الشروط لذلك النص البرمجي (pubkey مثلاً) يمكنه أن ينفق الساتوشيز التي دفعت له.
دخل المعاملة يَستَخدم مُعَرفْ المعاملة (txid) ورقم فهرسة خرج المعاملة (غالبا يدعى vout اختصارا لـ Output vector) لتعريف خرج معاملة محدد ليتم انفاقه. الدخل يملك أيضا نص برمجي (Signatur مثلاً) الذي بدوره يسمح للدخل بتوفير بيانات المُعَامِلاتْ التي تستوفي الشروط في النص البرمجي (pubkey مثلاً).
الصورة التالية تساعد بتوضيح كيف يمكن استخدام ما سبق من خلال اظهار طريقة سير العمل المستخدمة من قبل سعيد لإرسال معاملة مالية لفتحي، والتي يستخدمها فتحي لاحقاً لإنفاق الأموال المستقبلة من سعيد.
كل من سعيد وفتحي سيستخدمان الصيغة الأكثر انتشاراً لنوع المعاملة المعياري Pay-To-Public-Key-Hash (P2PKH)، الذي بدوره يتيح لسعيد أن ينفق الساتوشيز الخاصة به الى عنوان بتكوين معياري، ثم يتيح لفتحي إنفاق هذه الساتوشيز باستخدام زوج مفاتيح تشفير (public key; private key).
على فتحي بدايةً ان ينشئ زوج مفاتيح تشفير عام/خاص قبل ان يتمكن سعيد من انشاء المعاملة لإرسال الأموال لفتحي. بتكوين يستخدم خوارزمية التوقيع الرقمي باستخدام المنحنى الاهليجي (Eliptic Curve Digital Signature Algorithm ECDSA) باستخدام المنحنى (secp256k1)، المفاتيح الخاصة لمنحنى (secp256k1) عبارة عن 256 Bit من البيانات العشوائية. يمكن تحويل هذه البيانات "المفتاح الخاص" الى مفتاح عام من نوع (secp256k1) بشكل حتمي. لأن عملية التحويل حتمية ويمكن تكرارها بأي وقت على نحو موثوق، فلا حاجة لحفظ المفتاح العام. بمعنى أنَّ مفتاح خاص يعطي نفس المفتاح العام دائماً؛ حتمياً.
يتم بعد ذلك استخراج الهاش (Hash) للمفتاح العام (pubkey). انتاج الهاش أيضا يمكن تكراره بأي وقت على نحو موثوق، لذلك لا حاجة لحفظ الهاش. الهاش يستخدم لتقليل طول العنون العام ولإخفائه، وهذا يجعل كتابة العنوان العام يدويا أسهل ويوفر آلية حماية وأمان دفاعية ضد مشاكل غير متوقعة يمكن أن تحدث في المستقبل مثل التمكن من إعادة انشاء المفتاح الخاص باستخدام المفتاح العام.
فتحي يعطي هاش مفتاحه العام لسعيد. وهاش المفتاح العام تقريبا بشكل دائم يُرسل بعد إعادة ترميزه باستخدام (ترميز Base58)، والناتج يطلق عليه اسم "عنوان بتكوين" (Bitcoin Adresse)، الذي يحوي على رقم نسخة العنوان، الهاش وChecksum لكشف الأخطاء المطبعية.
بمجرد أن يحصل سعيد على العنوان وفك ترميزه من ترميز Base58 إلى هاش العنوان العام، يُمكِنهْ إنشاء المعاملة. يقوم بإنشاء خرج معاملة (P2PKH) معياري يحتوي على تعليمات أو إرشادات التي تمكن أي شخص من إنفاق خرج المعاملة إذا استطاعوا إثبات أنهم يملكون المفتاح الخاص المطابق أو المقابل لهاش العنوان العام لفتحي. هذه التعليمات أو الارشادات تدعى نص برمجي pubkey (pubkey script) أو scriptPubKey.
يقوم سعيد ببث او إذاعة أو نشر المعاملة للشبكة ليتم اضافتها الى البلوكتشين. الشبكة تقوم بتصنيفها على أنها خرج معاملة غير منفقة (UTXO) Unspent Transaction Output, يقوم برنامج محفظة فتحي بعد ذلك بإظهارها على أنها رصيد قابل للإنفاق.
عندما يقرر فتحي في وقت لاحق إنفاق هذا الـ UTXO, يحب عليه أن يقوم بإنشاء دخل لمعاملة جديدة تشير الى هاش المعاملة التي أنشأها سعيد، والذي يسمى مُعرف المعاملة (txid)، وإلى تحديدا الخرج الذي أنشأه سعيد لصالح فتحي من خلال رقم الفهرسة للخرج (Output Index). يجب عليه بعد ذلك انشاء نص برمجي للتوقيع (Signature Script)، عبارة عن مجموعة من البيانات التي تستوفي الشروط التي وضعها سعيد في الخرج الغير منفق في المعاملة السابقة ضمن النص البرمجي pubkey. النص البرمجي للتوقيع يدعى أيضاً scriptSigs.
النص البرمجي pubkey والنص البرمجي للتوقيع يجمعون المفاتيح العامة من نوع secp256k1 والتواقيع المقابلة مع المنطق الشرطي، ليخلق آلية برمجية للتفويض أو الترخيص.
من أجل خرج على غرار P2PKH, النص البرمجي للتوقيع الخاص بفتحي سوف يحتوي على هذه البيانات:
1. المتاح العام الخاص به كامل أي ليس الهاش، ليقوم النص البرمجي pubkey من التأكد أن نتيجة هاش العنوان العام مطابقة للهاش المرفق مع النص البرمجي السابق المقدم من سعيد.
2. توقيع من نوع secp256k1 تم اجراءه باستخدام صيغة التشفير ECDSA يجمع بين بيانات محددة من المعاملة (مشروح في الأسفل) مع المفتاح الخاص بفتحي. هذا يدع النص البرمجي pubkey من التأكد أن فتحي يملك المفتاح الخاص الذي تم انشاء المفتاح العام منه.
توقيع فتحي من نوع secp256k1 لا يثبت فقط أن فتحي يملك المفتاح الخاص المقابل؛ انما أيضا تجعل أجزاء المعاملة خارج النص البرمجي للتوقيع (scriptSigs) غير قابلة للتغيير أو التلاعب، لذا يمكن لفتحي من بث المعاملة على شبكة الند للند بأمان.
كما هو موضح في الصورة أعلاه، البيانات التي سيوقعها فتحي رقمياً تشمل مُعرِف المعاملة txid وعنوان فهرسة الخرج Output Index للمعاملة السابقة، النص البرمجي pubkey للخرج السابق، النص البرمجي المنشأ من قبل فتحي الذي بدوره سيسمح للمستلم التالي بإنفاق خرج هذه المعاملة، وكمية الساتوشيز المرسلة للمستلم التالي. فعلياً يتم توقيع كامل المعاملة باستثناء أي نص برمجي للتوقيع scriptSig, الذي يحوي على المفتاح العام كامل والتوقيع من نوع secp256k1.
بعد إضافة فتحي لتوقيعه الخاص ومفتاحه العام الى النص البرمجي للتوقيع، يبث فتحي المعاملة الى المعدنيين من خلال شبكة الند للند اللامركزية. كل نظير أو ند ومُعَدن يقوم بالتأكد من صحة المعاملة بشكل مستقل قبل أن يقوم بدوره بإعادة بثها الى النظراء المتصلين معه أو اضافتها الى البلوك او الكتلة التالية.
مجموع الـ UTXOs الموجودة في البلوكتشين تمثل مجموعة، بالتالي كل معاملة تستهلك عناصر من هذه المجموعة وتقوم بإنشاء عناصر جديدة تضاف إلى المجموعة. هكذا هذه المجموعة تمثل جميع العملات Coins في النظام.
كما تم ذكره، UTXO تُعرف خرج لمعاملة Output الذي بدوره لم يتم انفاقه بعد، أي استخدم كدخل لمعاملة جديدة. الـ Outputs هم مجموعة عليا أو مجموعة حاوية لـ الـ UTXOs. وفقاً لذلك فالـ UTXOs هم مجموعة دنيا أو مجموعة جزئية من المجموعة العليا Outputs.
المصادر:
-
https://bitcoin.org/en/transactions-guide#introduction-
https://en.wikipedia.org/wiki/Unspent_transaction_output-
https://bitcoin.org/bitcoin.pdf-
https://docs.neo.org/developerguide/en/articles/blockchain/utxo.html-
https://academy.horizen.global/technology/advanced/the-utxo-model/-
http://earlz.net/view/2017/07/27/1820/what-is-a-utxo-and-how-does-itLong Bitcoin
BTC. Short the Banks