التوقيع الجزئي

يتيح التوقيع الجزئي لعدة أطراف توقيع المعاملة نفسها في أوقات مختلفة أو على أجهزة مختلفة. يبني المنسّق الرسالة، ويوقّع كل موقّع مطلوب بايتات الرسالة المتسلسلة نفسها بدقة، ثم يتحقق المنسّق من التوقيعات ويدمجها قبل الإرسال.

التوقيعات تصادق على البايتات، لا على النية

يؤدي تغيير دافع الرسوم، أو blockhash، أو ترتيب التعليمات، أو قائمة الحسابات، أو أي instruction data إلى إنتاج رسالة مختلفة وإبطال كل توقيع تم جمعه بالفعل.

مسار التوقيع الجزئي

  1. اتفقوا على تعليمات المعاملة ومن سيدفع الرسوم.
  2. حدّد مدة صلاحية المعاملة ودافع الرسوم.
  3. سلسل الرسالة مرة واحدة فقط، وتعامل مع تلك البايتات على أنها غير قابلة للتغيير.
  4. وزّع بايتات الرسالة وملخصًا مقروءًا للبشر على كل موقّع.
  5. اجمع كل توقيع Ed25519 وتحقق منه مقابل بايتات الرسالة نفسها.
  6. أرفق التوقيعات بعناوين الموقّعين المطلوبين الخاصة بها.
  7. تأكد من وجود كل توقيع مطلوب وصحته، ثم أرسل المعاملة.

مثال كامل

يوقّع دافع الرسوم ومرسل SOL أدناه بشكل مستقل. يتحقق المنسّق من كلا التوقيعين، ثم يدمجهما ويرسل المعاملة المكتملة.

يستخدم المثال توقيع Ed25519 الخام لتوضيح الحد الفاصل بين المنسّق وكل موقّع. يمكن لمحفظة أو جهاز عتادي أو خدمة حفظ أو موقّع غير متصل بالإنترنت أن يحل محل أي keypair محلي ما دام يوقّع بايتات الرسالة نفسها تمامًا.

ثبّت الرسالة قبل التوقيع

يغطي كل توقيع رسالة المعاملة المتسلسلة. وتتضمن الرسالة كل ما يلي:

  • دافع الرسوم
  • blockhash الحديث أو nonce دائم
  • عنوان كل برنامج وكل حساب
  • صلاحيات التوقيع والكتابة للحسابات
  • ترتيب التعليمات وinstruction data

ابنِ هذه الحقول أولًا، وسلسل الرسالة مرة واحدة، ووزّع مصفوفة البايتات هذه على كل موقّع. من المفيد تخزين بصمة (digest) للرسالة مع كل طلب توقيع حتى يتمكن المنسّق من رفض توقيع أُعيد لرسالة مختلفة.

لا تفكّ تسلسل الرسالة ثم تعدّلها وتتوقع أن تبقى التوقيعات التي جُمعت سابقًا صالحة. حتى التغيير الذي يبدو تشغيليًا، مثل استبدال blockhash منتهي الصلاحية أو تغيير دافع الرسوم، يتطلب أن يوقّع كل موقّع من جديد.

نسّق دافع الرسوم

دافع الرسوم موقّع مطلوب دائمًا، ويجب اختياره قبل تثبيت الرسالة. تأكد من أن الحساب يحتوي على ما يكفي من SOL للرسوم الأساسية وأي رسوم أولوية. إذا كانت جهة راعية أو خادم خلفي سيدفع الرسوم، فضع ذلك العنوان في الرسالة قبل جمع توقيع المستخدم؛ فإضافة الجهة الراعية لاحقًا تغيّر البايتات الموقَّعة.

ينبغي للمنسّق التحقق من أن التوقيع الوارد يعود إلى عنوان مدرج ضمن الموقّعين المطلوبين. لا تقبل أبدًا مفتاحًا عامًا عشوائيًا ثم تُلحقه بالمعاملة.

إدارة مدة صلاحية المعاملة

لا تكون معاملة blockhash الحديث صالحة إلا ما دام blockhash الخاص بها موجودًا في قائمة blockhash الحديثة لدى validator. قبل بدء مسار توقيع متعدد الأطراف، قدّر ما إذا كان بإمكان جميع الموقّعين الاستجابة قبل lastValidBlockHeight.

إذا انتهت صلاحية blockhash، فابنِ رسالة جديدة بـ blockhash حديث واجمع كل التوقيعات من جديد. بالنسبة لمسارات العمل التي قد تستغرق وقتًا أطول أو تتضمن موقّعين غير متصلين بالإنترنت، استخدم nonce دائمًا. يتجنب nonce الدائم نافذة blockhash الحديث، لكن تقديم هذا nonce أو استهلاكه بأي شكل آخر يبطل المعاملة المعلّقة أيضًا.

تحقق قبل الإرسال

لكل توقيع مُعاد:

  1. تحقق من التوقيع مقابل بايتات الرسالة المثبتة والمفتاح العام المتوقع للموقّع.
  2. أرفقه بموضع ذلك الموقّع في مصفوفة توقيعات المعاملة.
  3. تحقق من أن المعاملة المجمّعة تحتوي على توقيعات صالحة لكل موقّع مطلوب.
  4. أرسل المعاملة المتسلسلة دون إعادة بناء رسالتها.

بعد الإرسال، أكّد المعاملة باستخدام معلومات مدة الصلاحية نفسها التي تضمنتها الرسالة الموقَّعة. إذا أفاد التأكيد بانتهاء صلاحية blockhash أو استهلاك nonce، فلا تُعد المحاولة بمعاملة معدّلة؛ بل أعد بدء مسار التوقيع.

Is this page helpful?

جدول المحتويات

تعديل الصفحة