TON Virtual Machine (TVM, أحيانًا TON VM) — آلة افتراضية تنفّذ العقود الذكية في بلوكتشين TON. هذه طبقة التنفيذ في الشبكة: كل smart-contract يُخزن ويعمل كبرنامج للـ TVM. الآلة تعالج الرسائل الواردة، تُغيّر الحالة الدائمة للعقد وتُنشئ رسائل صادرة لعقود أخرى.
تخضع بنية TVM لثلاث متطلبات: تحديدية كاملة في التنفيذ (نفس المدخل يعطي نفس النتيجة على أي عُقدة)، كثافة عالية للكود (أقل مساحة في البلوكتشين) وتوافق عكسي عند توسيع مجموعة التعليمات.
التاريخ#
تم تطوير TVM بواسطة فريق Telegram في عام 2018 مع النسخة الأولى من بروتوكول TON. تم التطوير على مراحل:
- 2018 — الإصدار الأول للـ TVM، صدر مع شبكة اختبار TON. التركيز الأساسي — وظائف العقود الذكية والتكامل مع البروتوكول.
- مارس 2020 — نشر وثائق تقنية مفصلة توضح أنواع البيانات، التحسينات وتعليمات العقد.
- 2020 (إطلاق mainnet) — يدعم TVM مجموعة كاملة من العمليات ويضمن تنفيذًا محددًا في شبكة الإنتاج.
بعد نقل المشروع إلى المجتمع، تستمر تطويرات TVM عبر عملية TEP — تُدخل التحديثات من خلال مقترحات تحسين وتُفعَّل عبر إجماع المُدققين.
الأساسيات#
يستخدم TVM سلاسل بتية كتمثيل أساسي للبيانات. تُعرض في صيغتين:
- التمثيل الست عشري — سلاسل بطول مضاعف لأربع بتات، تُقسم إلى مجموعات من 4 بتات، كل مجموعة تُكتب برقم ست عشري واحد (0–F). إذا لم يكن الطول مضاعفًا لأربع بتات، تُضاف علامة إغلاق خاصة لتحديد التعديل.
- التسلسل إلى أوكتات — السلسلة تُقسم إلى مجموعات من 8 بتات وتُكتب كسلسلة من البايتات؛ إذا لزم الأمر تُضاف محاذاة إلى 8.
نموذج المكدس#
TVM — آلة افتراضية تعتمد على المكدس. هذا يعني أن البيانات تُخزن في بنية «مكدس» (last-in-first-out) وليس في متغيرات مسماة أو سجلات. معظم العمليات (رياضيات، مقارنات، تمرير معاملات) تأخذ الوسائط من المكدس وتضع النتيجة فيه أيضًا. نموذج المكدس أبسط من نهج السجلات ويعطي ترميزًا أكثر كثافة للتعليمات — وهو مهم لتقليل التخزين on-chain.
أنواع القيم
مكدس TVM يتعامل مع مجموعة ثابتة من الأنواع الأولية:
- Integer — عدد صحيح موقع بـ 257 بت (اختيار حجم البت يسمح بحمل تجزئات 256‑بت بالإضافة إلى الإشارة دون فقد).
- Cell — كائن يحتوي على ما يصل إلى 1023 بت من البيانات وما يصل إلى 4 روابط إلى خلايا أخرى. أساس ذاكرة TVM.
- Tuple — مجموعة مرتبة من القيم ذات أنواع مختلفة.
- Slice — «مقطع» من الخلية: مؤشر إلى الجزء المتبقي من البيانات والروابط عند القراءة.
- Builder — مخزن لتجميع خلية جديدة بشكل متسلسل.
- Continuation — تمثيل لنقطة استمرارية التنفيذ؛ انظر أدناه.
- Null — عدم وجود قيمة؛ علامة للحقول غير المبدئية.
فئات التعليمات
تُصنّف تعليمات TVM حسب الغرض:
- ستاكية و tuple — إعادة ترتيب المكدس، عمليات على tuple.
- ثابتة — إدخال قيم مسبقة التعريف إلى المكدس.
- رياضية — عمليات رياضية قياسية مع فحص تلقائي للفيض.
- عمليات على الخلايا — قراءة Slice، كتابة Builder، الوصول عبر الروابط.
- إدارة التدفق — فروع شرطية، حلقات، استدعاءات الاستمرارات.
- بدائية تطبيقية — عمليات متخصصة لـ TON: التعامل مع العناوين، التوقيعات، تفعيل الرسائل.
الخلايا وأنواعها#
Cell — الوحدة الذرية للتخزين في TVM وفي بلوكتشين TON نفسه. كل Cell يحتوي على ما يصل إلى 1023 بت من البيانات وما يصل إلى 4 روابط إلى خلايا أخرى. الرسم البياني للخلايا المتصل عبر الروابط هو رسم موجه غير دوري (DAG): الحلقات غير مسموح بها. تُخزن جميع بيانات البلوكتشين (العقود الذكية، الحالات، الرسائل، الكتل) كهذا الرسم البياني.
أنواع الخلايا
- عادية (type‑1) — حاملة البيانات والروابط القياسية.
- غريبة (exotic cells) — أنواع من 2 إلى 255 بخصائص خاصة في التسلسل والتجزئة. تُستعمل للفروع المقطوعة (truncated branches)، الروابط إلى المكتبات وإثباتات Merkle.
تسمح الخلايا الغريبة، على سبيل المثال، بنقل لقطة جزئية من البلوكتشين مع إثباتات تشفيرية — أساس العملاء الخفيفين لـ TON.
الاستمرارات (Continuations)#
Continuation — بنية مركزية في TVM لإدارة التدفق. في جوهرها هي «حساب مؤجل»: علامة تحتوي على شيفرة للتنفيذ، المكدس الحالي وحالة سجلات التحكم المحفوظة. يمكن وضع Continuation على المكدس، تمريره كمعامل، تفعيله — ثم متابعة التنفيذ من النقطة المسجلة.
تُبنى على continuations استدعاءات الدوال الفرعية، العمليات الشرطية، الحلقات ومعالجة الاستثناءات. النظير في اللغات الأكثر شيوعًا هو الدوال من الدرجة الأولى؛ في TVM الـ continuation أقوى ويغطي أيضًا استمرارات جزئية للبرنامج.
أنواع الاستمرارات
- عادية — تحتوي على الشيفرة، المكدس، قائمة السجلات المحفوظة وصفحة الشيفرة (انظر أدناه).
- بسيطة — فقط الشيفرة وصفحة الشيفرة، بدون بيانات مكدس محفوظة.
- الحالية (cc, current continuation) — تعكس الشيفرة التي تُنفّذ الآن؛ جزء أساسي من حالة الآلة.
يتم التبديل بين الاستمرارات بتعليمات JMP (نقل التحكم) و RET (عودة). الاستثناءات هي continuations خاصة تُفعَّل عند حدوث خطأ: تستقبل معلمات الخطأ وتحدد السلوك اللاحق. تُنفّذ البنى الشرطية والتكرارية (IF, WHILE, REPEAT) فوق continuations.
صفحات الشيفرة#
كل continuation عادي يحمل حقل صفحة شيفرة 16‑بت (cp) يحدد كيفية فك ترميز تعليماته. هذه آلية توافق عكسي: يمكن أن تتواجد في الشبكة عقود مُجمَّعة لإصدارات مختلفة من مجموعة تعليمات TVM.
تُشفّر التعليمات بترميز ثنائي مسبق — ما يضمن فك ترميز فريد وتمثيلًا مضغوطًا. إذا لم يتطابق البادئ مع تعليمات صالحة للصفحة الحالية، يُولد استثناء opcode غير صالح.
يمكن أن يحدث تبديل تلقائي بين صفحات الشيفرة بناءً على العملية المنفذة — ما يسمح بتخصيص الصفحات للعمليات المتكررة (معالجة المكدس، معالجة البيانات) وتقليل حجم الشيفرة.
TVM مقابل Ethereum Virtual Machine#
TVM و EVM — كلاهما آلات افتراضية تعتمد على المكدس للعقود الذكية، لكن لهما اختلافات جوهرية.
| الخاصية | TVM | EVM |
|---|---|---|
| نموذج البيانات الأساسي | رسم خلية (Cell، حتى 1023 بت + 4 روابط) | كلمات 256‑بت + Merkle Patricia Trie |
| حجم Integer | 257 بت | 256 بت |
| فحص الفيض | تلقائي | يدوي (Solidity ≥0.8) |
| التشفير | Curve25519، Weil pairings (zk‑SNARKs)، sha256 | secp256k1، keccak256 |
| لغة العقود الأساسية | FunC (أنواع ثابتة، ADT) | Solidity |
| تخزين الحالة | موزع عبر خلايا العقود | MPT بحالة عالمية |
يسهل رسم الخلايا التعامل مع هياكل معقدة (أشجار، DAG)، ويتطلب ذاكرة وموارد حسابية أقل مقارنةً بـ MPT. الفحص التلقائي للفيض يقلل من فئة الثغرات الشائعة. دعم Curve25519 و Weil pairings يضيف إمكانيات تشفيرية غير متوفرة في EVM «من الصندوق».
انظر أيضًاانظر أيضًا#
- The Open Network
- FunC
- Smart-contracts
- Toncoin