البيتكوين من الصفر
إزاي شبكة من الغرباء بتتفق على دفتر واحد
الصفحة دي مش محتاجة أي خلفية عن التشفير. الآليات الأساسية فيها تجارب تشغّلها بإيدك، منها SHA-256، كارت بلوك الميلاد، شجرة Merkle، التعدين، وتعديل سلسلة مصغّرة.
دوس على الزرارين الأولانيين بالتبادل. فرق رقم واحد في المبلغ، والبصمتين ملهمش أي علاقة ببعض. حتى نقطة في آخر الجملة بتقلب كل حاجة. الخاصية دي هي اللي هتخلي "القفل" اللي جاي يشتغل.
المحتويات
01 مين يكتب الصفحة الجاية؟
قبل أي هاش وأي تعدين، فيه مشكلة كل ده واقف عليها. بيتكوين في جوهرها دفتر حسابات واحد: مين معاه كام، ومين بعت لمين. الدفتر ده متشارك بين ملايين الغرباء حوالين العالم، ومفيش بنك مسؤول عنه. الشركة مش طرف ومفيش حد مسؤول عنه. طيب مين اللي يكتب الصفحة الجاية فيه؟
البنك جاوب السؤال ده بموظف، هو اللي بيكتب وانت مضطر تثق فيه. شيل الموظف وهتقع في مشكلتين فوراً. الأولى اسمها الصرف المزدوج (double spend): أكتب صفحة بقول فيها إني بعتلك فلوسي، وفي نفس اللحظة أكتب صفحة تانية بقول فيها إني بعت نفس الفلوس لحد تاني، وأوزع النسختين، فمين يحدد أنهي واحدة "الحقيقية"؟ التانية، لو قلنا "نعمل تصويت"، هعمل مليون حساب وهمي وأصوّت بيهم كلهم، لأن الهويات على النت ببلاش. دي اسمها هجمة Sybil.
حق كتابة الصفحة عند بيتكوين بيتكسب بقرعة تمن تذكرتها كهربا حقيقية محدش يقدر يزوّرها. مش صوت لكل شخص، صوت لكل وات. القرعة دي هي التعدين، وباقي الصفحة بتفكك إزاي بتشتغل قطعة قطعة.
02 يعني إيه هاش أصلاً؟
في ناس فاكرة إن الموضوع قفل ومفتاح. لأ. الهاش مش تشفير. التشفير قفل ليه مفتاح، اللي معاه المفتاح يفك ويرجّع الرسالة. الهاش معندوش مفتاح ومفيش رجوع أصلاً، آلة بتاخد أي كلام مهما كان طوله وتطلعلك بصمة ثابتة الحجم، في حالة SHA-256 دايماً 64 خانة hex (256 بت).
سلوك الآلة أساس كل حاجة جاية.
نفس المدخل يطلّع نفس البصمة كل مرة، على أي جهاز، مدى الحياة. دي ثابتة (deterministic). من البصمة ترجع للكلام؟ لأ، باتجاه واحد (one way)، الخلاط بيعمل عصير في ثانية ورجوع الفاكهة من العصير مستحيل. بعدين تقلب حرف واحد في المدخل. الآلة فوضوية (avalanche)، البصمة كلها تتقلب بشكل مالوش أي علاقة بالقديمة. الـ 64 كلهم.
الآلة فوق في أول الصفحة هي SHA-256 الحقيقية جوه متصفحك. انت شغّلتها بإيدك خلاص.
03 المعاملات والكارت الصغير جوّه البلوك
البلوك هو "صفحة" الدفتر. شنطة فيها آلاف الحوالات اللي كانت مستنية في طابور اسمه الـ mempool. الماينر بيلمّها، وبيضيف في أولها معاملة خاصة اسمها coinbase بيدفع فيها لنفسه المكافأة. وهنا أول سؤال سألته، هو مش ممكن يكتب لنفسه أي مبلغ؟
لأ. كتاب قواعد البروتوكول، اللي كل جهاز في الشبكة شغال بنسخة منه، بيحدد سقف الـ coinbase عند الدعم الحالي (3.125 بيتكوين، وبينصّف كل أربع سنين) زائد رسوم المعاملات اللي ضمّنها في البلوك. ساتوشي واحد فوق السقف والبلوك كله باطل. الشبكة مش بتزعل من حد. كل جهاز هيرمي البلوك أوتوماتيكياً، زي ما هنشوف في القسم الثامن.
المفاجأة اللي صححتهالك في الكلام إن الشنطة نفسها مش هي اللي بتدخل آلة البصمة. اللي بيتطحن تريليونات المرات هو كارت تلخيص صغير اسمه الـ block header، حجمه 80 بايت بالظبط، أصغر من رسالة SMS. مكتوب عليه ست حاجات.
| الحقل | الحجم | يعني إيه |
|---|---|---|
| version | 4 بايت | نسخة القواعد اللي البلوك ماشي عليها |
| prev block hash | 32 بايت | بصمة كارت البلوك اللي فات، ودي اللي بتعمل "السلسلة" |
| merkle root | 32 بايت | بصمة واحدة بتلخص كل المعاملات (القسم الجاي) |
| timestamp | 4 بايت | ختم زمني: عدد الثواني من أول يناير 1970 (القسم السابع) |
| bits | 4 بايت | الصعوبة المطلوبة: البصمة لازم تنزل تحت الرقم ده |
| nonce | 4 بايت | العداد اللي بيتغير كل محاولة (القسم السادس) |
ومش هسيبك من غير الدليل. اللي تحت ده هو الـ 80 بايت الحقيقيين بالحرف بتوع أول بلوك في التاريخ، اللي ساتوشي عدّنه يوم 3 يناير 2009. دوس الزرار. متصفحك هيعمل عليهم SHA-256 مرتين (زي بيتكوين بالظبط) ويطلّعلك البصمة المسجلة في السلسلة من 17 سنة.
04 بصمة البصمات وشجرة الـ Merkle
طيب إزاي 32 بايت واحدة في الكارت بتمثل آلاف المعاملات؟ ببصمة البصمات. بتاخد بصمة كل معاملة لوحدها، بعدين تمسك كل بصمتين جنب بعض وتعملهم بصمة واحدة، وتكرر طبقة ورا طبقة لحد ما تفضل بصمة واحدة في القمة، ودي الـ Merkle root.
الآلة هنا بتطحن 80 بايت بس في كل محاولة، مش ميجابايت معاملات. والقفل جاي من تحت. أي تعديل في أي معاملة تحت بيتسلق الشجرة، بصمة المعاملة تتغير، فبصمة الزوج تتغير، فالجذر يتغير، فالكارت بقى كارت مختلف، فأي هاش كان الماينر لقاه على الكارت القديم بقى ملوش لازمة.
05 فين المجهود في لعبة التعدين؟
السؤال الأذكى في الحوار لسه واقف. ما دام عمل البصمة ببلاش، والمحتوى معروف، إيه المجهود في كل ده؟
المجهود مش في حساب البصمة. المطلوب معكوس. هاتلي نسخة من الكارت بصمتها تبدأ بعدد معين من الأصفار (تقنياً أقل من رقم اسمه الـ target، والأصفار في الأول هي شكل ده). صفات الآلة من القسم التاني زي ما هي، باتجاه واحد وفوضوية. مفيش معادلة تقولك "عشان تجيب أصفار حط كذا". الآلة مبتاخدش طلبات. بصمة فيها 4 أصفار مبتعلمكش أي حاجة عن إزاي تجيب 5. كل محاولة قرعة جديدة من الصفر.
الاستراتيجية الوحيدة الموجودة في الكون هي إنك تغيّر العداد وتجرّب، وتغيّر وتجرّب تاني. المحاولة الواحدة ببلاش، لكن المحاولة الكسبانة نادرة بشكل فلكي. المجهود هو عدد المحاولات. الواحدة فيهم رخيصة.
على نفس عدد الأصفار في التجربة، عدد المحاولات بيتغير كل مرة. ساعات ضربة حظ بدري، وساعات انتظار طويل. كل صفر hex إضافي يضاعف الشغل المتوقع 16 مرة. بيتكوين الحقيقية مش بتطلب عدد أصفار ثابت. بتقارن رقم الهاش بهدف رقمي بيتعاير كل 2016 بلوك عشان المتوسط يفضل قريب من 10 دقايق. وفيه مدرسة تانية بتحل اختيار المقترح بالحصة بدل إثبات العمل، ليها مقال لوحدها إثبات الحصة (EN).
06 الـ nonce وخانة العبث الحر
خلفيتك الأمنية كانت معطلاك هنا. الاسم جاي من عالمك، والوظيفة مختلفة. في البروتوكولات اللي انت متعود عليها، الـ nonce شغلته منع إعادة الاستخدام، تمنع الـ replay. في بيتكوين الحكاية أنزل بكتير. خانة فاضية ملهاش أي معنى. أربع بايت في آخر الكارت. الرقم المكتوب فيهم مش بيمثل حاجة خالص.
الموجودة ليه؟ الماينر محتاج يغيّر محتوى الكارت بين كل محاولة والتانية، وإلا هتطلعله نفس البصمة. الـ nonce أسرع حقل يتغيّر، لكنه مش الوحيد. الماينر يقدر يغيّر الوقت، version bits، المعاملات، أو extraNonce جوه coinbase فيتغيّر Merkle root. تجربة nonce = 500 مرتين على نفس الـ header تضييع شغل، لأن النتيجة هتتكرر.
تفصيلة هتعجبك. 4 بايت يعني 4,294,967,296 قيمة بس. جهاز تعدين حديث بيعمل مئات التريليونات من المحاولات في الثانية، بيحرق مساحة الـ nonce كلها في جزء من الثانية غالباً من غير فايز. يعمل إيه؟ يغيّر حاجة تانية عشان يولّد كارت جديد بمساحة nonce نضيفة. يا إما يزوّد الختم الزمني ثانية، يا إما (وهي الحركة الأساسية) يلعب في رقم جوه خانة حرة في معاملة الـ coinbase نفسها اسمه extraNonce. وافتكر شجرة القسم الرابع. أي تغيير في الـ coinbase بيتسلق ويغيّر الجذر، فالكارت بقى كارت جديد، ومعاه 4.3 مليار تذكرة تانيين.
07 ساعة الشبكة
الختم الزمني رقم بيقول "الكارت ده اتبنى إمتى". متخزن كعدد ثواني من أول يناير 1970. في تجربة بلوك الميلاد فوق، الحقل الأصفر ده بيفك لتاريخ 3 يناير 2009 الساعة 18:15.
وسبب وجوده عملي. الشبكة محتاجة ساعة تتعاير عليها الصعوبة. البروتوكول عايز البلوك ياخد 10 دقايق في المتوسط، بس الأجهزة بتتطور والماينرز بيزيدوا. هيعرف منين إن البلوكات بقت بتيجي أسرع؟ من الأختام. كل 2016 بلوك (أسبوعين تقريباً) بيتحسب الوقت الفعلي من الفرق بين الأختام. طلع أقل من أسبوعين؟ الصعوبة تزيد. أكتر؟ تقل. من غير ختم جوه كل بلوك، مفيش مرجع زمني متفق عليه أصلاً.
سؤالك الأمني الطبيعي معروف. الختم ده الماينر بيكتبه بنفسه، أثق فيه ليه؟ متثقش. القواعد محاصراه من الناحيتين. لازم يكون أكبر من الوسيط (median) بتاع آخر 11 بلوك، وأقل من ساعة الجهاز المتحقق زائد ساعتين. الساعة تقريبية. ممكن تلاقي بلوك ختمه أقدم من اللي قبله بدقيقة وده مقبول. التلاعب الكبير، اللي يأثر على حسبة الصعوبة، مقفول.
08 مين بيصدق مين؟
ورجعنا لأول سؤال سألته من الأساس: طب ما الفايز ممكن يحط اللي هو عايزه، والناس هتصدقه ليه؟ مش هيصدقوه. محدش بيصدق حد، ولا محتاج. لما الماينر يعلن بلوكه، كل جهاز (node) في الشبكة بياخد نسخة وبيعيد الفحص بنفسه، عنده محلياً، من غير ما يسأل حد:
ناتج double SHA-256 للكارت فعلاً تحت الـ target؟ كل معاملة عليها توقيع رقمي سليم؟ مفيش فلوس اتصرفت مرتين؟ الـ coinbase جوه السقف (3.125 + الرسوم)؟ الختم الزمني جوه الحدود؟ الحجم والصيغة مظبوطين؟ فحص إثبات العمل سريع، لكن قبول البلوك محتاج كل الفحوص دي.
أي قاعدة واحدة تتكسر، الجهاز بيرمي البلوك ومبيمررهوش لحد. مفيش شكوى بتتقدم لحد. البلوك يتشال من الطريق وخلاص. والماينر ساعتها خسر شهور كهربا على الفاضي. عشان كده الغش مش "ممنوع"، الغش خسران اقتصادياً: أغلى طريقة في الوجود تحرق بيها فلوسك.
وده بيجاوب على تساؤلك التاني: ينفع يبعت بلوك من غير أي حوالات خالص؟ آه ينفع. القواعد بتقبله عادي. بيحصل فعلاً في الثواني اللي بعد وصول بلوك جديد، لما المعدّنين يبدأوا شغل على القمة الجديدة قبل ما يجهزوا قالب فيه معاملات. الخسران الوحيد هو الماينر نفسه: ساب رسوم المعاملات، البقشيش، على الترابيزة، والحوالات المستنية بتتأكد في البلوك اللي بعده.
09 ليه التاريخ بيتقفل؟
افتكر إن أول حقل مهم في الكارت هو بصمة كارت البلوك اللي فات. كل بلوك ماسك في اللي قبله بالبصمة. غيّر حوالة في بلوك قديم، Merkle root يتغيّر، فبصمة الـ header تتغيّر وحقل prev في البلوك اللي بعده يبقى غلط. إعادة كتابة التاريخ تحتاج إعادة إثبات العمل من نقطة التعديل، وفي نفس الوقت السلسلة السليمة بتكمل نمو.
السلسلة اللي تحت دي مصغّرة (الصعوبة 3 أصفار بس عشان جهازك يعدّنها في ثواني). كل بلوك أخضر يعني: بصمته بأصفار، وحقل الـ prev بتاعه مطابق. دلوقتي روح للبلوك الأول وعدّل أي حرف في حوالاته، واتفرج على الكسر وهو بينتشر لقدام. لو حاولت "تصلّح" بإنك تعيد تعدين البلوكات بالترتيب، هتلاحظ إنك اضطريت تعيد شغل كل حاجة بعد التعديل:
10 أسئلة بتسألهالك
"ممكن ميحطش أي حوالة والناس هتصدقه عادي؟"
البلوك الفاضي (coinbase بس) صحيح قانوناً والشبكة بتقبله. صاحبه خسر رسوم المعاملات، فهو بيضر نفسه بس. الناس هتصدقه؟ الحكاية دي مش موجودة. كل جهاز بيعيد فحص كل قاعدة بنفسه (القسم ٨).
"ليه ميكتبش لنفسه الكمية اللي هو عايزها؟"
يكتب براحته. كل جهاز في الشبكة هيرمي البلوك في أقل من ثانية لأن الـ coinbase عدّت السقف (3.125 + الرسوم). كهربا القرعة كلها راحت هدر (القسمين ٣ و٨).
"المايننج بيفيد في إيه أصلاً؟"
التخمين نفسه ملوش معنى للتطبيق. إثبات العمل بيخلّي اقتراح البلوك مكلف، وبيوزن السباق بالشغل الفعلي بدل هويات رخيصة. التعدين ممكن يتركز في pools، فمينفعش نسميه غير قابل للاحتكار. المكافأة بتدفع للماينرز مقابل الشغل ده.
"ما دام الحاجة معروفة، إيه المجهود في الهاش؟"
البصمة الواحدة فعلاً ببلاش. الغالي هو العكس. تلاقي نسخة من الكارت بصمتها بأصفار. والآلة فوضوية باتجاه واحد فمفيش أي طريق غير التجربة. الفوز نادر فلكياً. المجهود = عدد المحاولات، مش صعوبة الواحدة (القسم ٥، وجرّبها في المنجم).
"هو إيه اللي بيتعمله هاش بالظبط؟"
كارت الـ block header، 80 بايت. فيهم بصمة البلوك اللي فات، وبصمة ملخصة لكل المعاملات (Merkle root)، والوقت، والصعوبة، والـ nonce. المعاملات نفسها بتتلخص مرة واحدة في الجذر، والكارت الصغير هو اللي بيتطحن (القسمين ٣ و٤، وشغّلت الـ 80 بايت بتوع ساتوشي بنفسك).
"الوقت بيبقى إيه؟"
ختم زمني. بيخلّي عند الشبكة ساعة مشتركة تتعاير عليها الصعوبة كل 2016 بلوك عشان البلوك يفضل ياخد 10 دقايق. ومش موثوق فيه على الفاضي. محصور بين وسيط آخر 11 بلوك وساعة المتحقق + ساعتين (القسم ٧).
"مش الـ nonce معناها number used once؟"
الاسم مستلف بس الوظيفة مختلفة عن أداة منع replay زي البروتوكولات الأمنية. مجرد خانة عبث حر 4 بايت بيقلّب فيها الماينر عشان يغيّر الكارت بين المحاولات. الـ "مرة واحدة" هنا معناها إن تكرار نفس القيمة على نفس الكارت تضييع كهربا لأن الآلة ثابتة. العداد خلّص. extraNonce جوه الـ coinbase يجدد المساحة عن طريق تغيير الجذر (القسم ٦).
كل الأرقام والتجارب في الصفحة دي حقيقية: SHA-256 بتاع متصفحك هو نفسه بتاع بيتكوين، وبايتات بلوك الميلاد هي المسجلة في السلسلة من يناير 2009. المكافأة الحالية 3.125 بيتكوين وبتتنصّف كل حوالي أربع سنين.