233 / 736ORPH

Orphan Block

كتلة ينقصها الفصل السابق

تشغّل يانا عقدتها الخاصة، أي حاسوبًا يتحقق من ⁦Bitcoin⁩. تصل إليه كتلة تشير إلى كتلة سابقة لا تعرفها العقدة بعد. يشبه ذلك قليلًا استلام صفحة من كتاب من دون الصفحة التي قبلها: يوجد نص جديد، لكن الصلة مفقودة. هذا هو ⁦Orphan Block⁩ بالمعنى الضيق. إلا أن المقالات ولوحات المتابعة تستخدم الاسم نفسه أحيانًا لحالة أخرى: كتلة ذات تاريخ معروف بقيت على فرع جانبي. والتمييز بين الحالتين أهم من ترجمة الاسم حرفيًا.

⁦Orphan Block⁩ بالمعنى الدقيق هو كتلة لا تعرف عقدة معينة سابقتها المباشرة. وقد يُستخدم الاسم بمعنى أوسع للدلالة على ⁦Stale Block⁩ خارج السلسلة النشطة. لا تعني أي من التسميتين وحدها احتيالًا أو كتلة معيبة؛ علينا أولًا معرفة البيانات التي تملكها العقدة والمعنى المقصود.

تُسمّى الكتلة السابقة أحيانًا الكتلة الأم. في حالة ⁦Orphan Block⁩ الحقيقية، لا تعرفها عقدة يانا، فلا تستطيع إكمال التحقق من الترابط. أما ⁦Stale Block⁩ فقد تكون أمّها معروفة والكتلة كلها صالحة؛ لكن العقدة تتبع فرعًا آخر بوصفه التاريخ النشط. يميّز ⁦Bitcoin Developer Guide⁩ هذين المعنيين صراحةً. لذلك، حين ترى يانا ⁦orphan⁩ في مستكشف الكتل، تسأل أولًا: هل السابقة مفقودة، أم أن الكتلة لم تبقَ في السلسلة الرئيسية فحسب؟ [1]

يظهر الفرق أيضًا في ⁦Bitcoin Core⁩، وهو برنامج لتشغيل عقدة تتحقق من الكتل والمعاملات وفق قواعد ⁦Bitcoin⁩. في ⁦Bitcoin Core 29⁩ تبحث ⁦AcceptBlockHeader⁩ عن السابقة عبر ⁦hashPrevBlock⁩، الإشارة إلى بصمتها المعرّفة. إذا لم يوجد سجل في الفهرس، تعيد ⁦prev-blk-not-found⁩. وإذا كانت الكتلة الأم معروفة وموسومة بأنها غير صالحة، تكون النتيجة ⁦bad-prevblk⁩. تعني الأولى «ينقصني السياق»، والثانية «أنت تبني على كتلة غير صالحة». إحضار السابقة المفقودة يتيح فحوصًا أخرى، لكنه لا يضمن وحده قبول الكتلة كاملةً. [2]

للكتلة ترويسة، أي مجموعة قصيرة من معلومات الهوية والارتباط، وجسم يحتوي المعاملات. أدخل ⁦Bitcoin Core 0.10.0⁩ مزامنة ⁦headers-first⁩: تُجلب الترويسات وتُفحص أولًا، ثم يمكن تنزيل الكتل بالتوازي. لذا قد تعرف عقدة يانا ترويسة السابقة من دون أن تكون الكتلة كاملةً على القرص. غياب جسم الكتلة ليس هو جهل سابقتها؛ والخلط بينهما قد يجعل تنزيلًا عاديًا يبدو لغزًا. [3]

يساعد الأمر ⁦getchaintips⁩ في ⁦Bitcoin Core 29⁩ يانا على معرفة نهايات الفروع التي تعرفها عقدتها. تشير ⁦active⁩ إلى السلسلة النشطة، و⁦valid-fork⁩ إلى فرع غير نشط جرى التحقق منه بالكامل. تعني ⁦valid-headers⁩ أن الكتل متاحة لكنها لم تخضع للتحقق الكامل، بينما تعني ⁦headers-only⁩ أن بعض الكتل غير متاحة. وتشير ⁦invalid⁩ إلى فرع يحتوي كتلة غير صالحة. هذه إذن ليست قائمة بنتائج تعاني المشكلة نفسها. وحتى عبارة ⁦orphaned branches⁩ في المساعدة لا تلغي هذه الفروق. [4]

لنتخيل كتلتين مختلفتين ⁦A⁩ و⁦B⁩ عند الارتفاع ⁦900000⁩. هذا مثال توضيحي من عندنا، لا وصف لواقعة محددة. الارتفاع موضع في السلسلة، ولذلك يمكن لكتل متنافسة أن تشترك فيه. تميّز يانا بينها بواسطة ⁦hash⁩، بصمة تعريف الكتلة، و⁦previousblockhash⁩، الإشارة إلى سابقتها. عند الاختيار بين فروع صالحة، يحسم العمل التراكمي الأمر، لا الارتفاع وحده. وتعرضه واجهة ⁦RPC⁩، التي تُرسل عبرها أوامر إلى البرنامج، باسم ⁦chainwork⁩: مجموع العمل المتوقع الموافق لصعوبات الكتل. [1] [5]

حين تستعلم يانا بواسطة ⁦getblock⁩ عن كتلة خارج السلسلة الرئيسية، قد يعرض ⁦Bitcoin Core 29⁩ القيمة ⁦confirmations = -1⁩. إنها علامة حالة خاصة، وليست عددًا عاديًا من التأكيدات. ليست عدًا تنازليًا ولا عمقًا سالبًا لإعادة تنظيم السلسلة. ولا تثبت غياب السابقة أيضًا. يجب قراءة القيمة مع هوية الكتلة وحالة الفرع؛ كما أن عقدة يانا قد لا تملك كل كتلة سبق أن شاهدها المشاركون الآخرون. [5]

تنشأ مكافأة الكتلة من معاملة أولى خاصة تسمّى ⁦coinbase⁩، ولا علاقة لها بمنصة التداول التي تحمل الاسم نفسه. يسجّل مخرج المعاملة مبلغًا من بيتكوين والشروط التي يجب استيفاؤها لإنفاقه. في ⁦Bitcoin Core 29⁩ تساوي ⁦COINBASE_MATURITY⁩ قيمة ⁦100⁩: يمكن إنفاق مخرج أُنشئ عند الارتفاع ⁦H⁩ لأول مرة في كتلة صالحة عند ⁦H+100⁩. المهم فرق الارتفاع، لا الدقائق المنقضية. لكن شرط الانتظار هذا لا يعوّض الانضمام إلى السلسلة النشطة. ما دامت كتلة المكافأة على فرع غير نشط، فمخرجها غير موجود في مجموعة ⁦UTXO⁩ النشطة، أي سجل المخرجات غير المنفقة. ولا تعيد الكتل الإضافية في موضع آخر ذلك المال تلقائيًا. [6] [7] [1] [8]

تحفظ يانا ⁦hash⁩ الكتلة وسابقتها وحالة الفرع وإصدار البرنامج. وتضيف ردود ⁦getchaintips⁩ و⁦getblock⁩ ووقت الحصول عليها. تسجّل هذا الوقت منفصلًا عن حقل ⁦time⁩ في الترويسة: الطابع الزمني للكتلة ليس لحظة مشاهدة حاسوبها لها. يساعد السجل على مقارنة ملاحظات أخرى، لكنه لا يثبت وحده هجومًا أو عطلًا محددًا في الشبكة أو نسبة عالمية لكتل ⁦orphan⁩. فهو يصف أولًا حالة عقدة واحدة في لحظة معينة. [4] [5]

للحصول على صورة أوضح، اقرأ هذا المدخل مع Stale Block, Reorg, Block Propagation, Proof of Work, Bitcoin. تشير إلى هذا المدخل أيضًا Stale Block.

DOC · 001Bitcoin Developer Guide — Block height and forksتوثيق DOC · 002Bitcoin Core 29 — Header acceptanceمصدر أولي DOC · 003Bitcoin Core 0.10.0 — Headers-first synchronizationمصدر أولي DOC · 004Bitcoin Core 29 — getchaintipsتوثيق DOC · 005Bitcoin Core 29 — getblockتوثيق DOC · 006Bitcoin Core 29 — Coinbase maturityمصدر أولي DOC · 007Bitcoin Core 29 — Coinbase input validationمصدر أولي DOC · 008Bitcoin Developer Guide — Transaction outputsتوثيق
تمت المراجعة: المصادر أولًا · ليست نصيحة استثمارية