عميل اختبار TON (Telegram Open Network) ولغة Fift الجديدة للعقود الذكية

منذ أكثر من عام ، أصبح معروفًا بخطط Telegram messenger لإطلاق شبكته اللامركزية الخاصة برقية شبكة مفتوحة. ثم أصبحت وثيقة تقنية ضخمة متاحة ، والتي من المفترض أن تكون كتبها نيكولاي دوروف ووصفت هيكل الشبكة المستقبلية. بالنسبة لأولئك الذين فاتتهم ، أوصيك بقراءة إعادة سرد هذا المستند (جزء 1, جزء 2؛ الجزء الثالث ، للأسف ، لا يزال يجمع الغبار في المسودات).

منذ ذلك الحين ، لم تكن هناك أخبار مهمة حول حالة تطوير TON ، حتى قبل يومين (في واحدة من قنوات غير رسمية) لم يظهر رابط الصفحة https://test.ton.org/download.htmlأين تقع:
طن-اختبار-عميل-كامل. tar.xz - مصادر العميل الخفيفة لشبكة اختبار TON ؛
ton-lite-client-test1.config.json - ملف التكوين للاتصال بشبكة الاختبار ؛
README - معلومات حول تجميع وإطلاق العميل ؛
HOWTO - إرشادات خطوة بخطوة حول كيفية إنشاء عقد ذكي باستخدام العميل ؛
طن.pdf - وثيقة محدثة (بتاريخ 2 مارس 2019) مع نظرة عامة فنية على شبكة TON ؛
tvm.pdf - الوصف الفني لـ TVM (TON Virtual Machine ، TON virtual machine) ؛
tblkch.pdf - وصف تقني لـ TON blockchain ؛
Fifthbase.pdf - وصف للغة Fift الجديدة ، المصممة لإنشاء عقود ذكية في TON.

أكرر ، لم يكن هناك تأكيد رسمي للصفحة وكل هذه الوثائق من Telegram ، لكن حجم هذه المواد يجعلها معقولة تمامًا. قم بتشغيل العميل المنشور على مسؤوليتك الخاصة.

بناء عميل تجريبي

بادئ ذي بدء ، دعنا نحاول إنشاء عميل اختبار وتشغيله - جيد ، README يصف هذه العملية البسيطة بالتفصيل. سأفعل ذلك باستخدام مثال macOS 10.14.5 ، لا يمكنني أن أضمن نجاح التجميع على الأنظمة الأخرى.

  1. التنزيل والتفريغ أرشيف المصدر. من المهم تنزيل أحدث إصدار لأن التوافق مع الإصدارات السابقة غير مضمون في هذه المرحلة.

  2. تأكد من أن لديك أحدث إصدارات make أو cmake (الإصدار 3.0.2 أو أعلى) أو OpenSSL (بما في ذلك رؤوس C) أو g ++ أو clang مثبتة على نظامك. لم أضطر إلى تثبيت أي شيء ، فقد اجتمع كل شيء معًا على الفور.

  3. افترض أنه تم تفريغ المصادر في مجلد ~/lite-client. بشكل منفصل عنه ، نقوم بإنشاء مجلد فارغ للمشروع المجمع (على سبيل المثال ، ~/liteclient-build) ومنه (cd ~/liteclient-build) اتصل بالأوامر:

    cmake ~/lite-client
    cmake --build . --target test-lite-client

    عميل اختبار TON (Telegram Open Network) ولغة Fift الجديدة للعقود الذكية

    لبناء مترجم لغة Fift للعقود الذكية (كما هو موضح أدناه) ، فإننا نتصل أيضًا بـ

    cmake --build . --target fift

  4. تحميل الحالي ملف الضبط للاتصال بشبكة الاختبار ووضعها في المجلد مع العميل المجمع.

  5. نهاية، يمكنك تشغيل العميل:

    ./test-lite-client -C ton-lite-client-test1.config.json

إذا تم كل شيء بشكل صحيح ، فيجب أن ترى شيئًا مثل هذا:

عميل اختبار TON (Telegram Open Network) ولغة Fift الجديدة للعقود الذكية

كما ترى ، هناك القليل من الأوامر المتوفرة:
help - عرض قائمة الأوامر هذه ؛
quit - الخروج؛
time - إظهار الوقت الحالي على الخادم ؛
status - إظهار حالة الاتصال وقاعدة البيانات المحلية ؛
last - تحديث حالة blockchain (تحميل آخر كتلة). من المهم تشغيل هذا الأمر قبل أي استعلامات للتأكد من أنك ترى الحالة الفعلية للشبكة.
sendfile <filename> - تحميل ملف محلي على شبكة TON. هذه هي الطريقة التي يحدث بها التفاعل مع الشبكة ، بما في ذلك ، على سبيل المثال ، إنشاء عقود ذكية جديدة وطلبات لتحويل الأموال بين الحسابات ؛
getaccount <address> - إظهار التيار (وقت تنفيذ الأمر last) حالة الحساب بالعنوان المحدد ؛
privkey <filename> - تحميل المفتاح الخاص من ملف محلي.

إذا ، عند بدء تشغيل العميل ، قم بتمرير مجلد إليه باستخدام الخيار -D، ثم ستضيف إليه آخر كتلة من السلسلة الرئيسية:

./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir

يمكننا الآن الانتقال إلى أشياء أكثر إثارة للاهتمام - تعلم لغة Fift ، وحاول تجميع عقد ذكي (على سبيل المثال ، إنشاء محفظة تجريبية) ، وتحميله على الشبكة ومحاولة تحويل الأموال بين الحسابات.

لغة خماسية

من المستند Fifthbase.pdf يمكنك معرفة أن فريق Telegram أنشأ لغة مكدس جديدة لإنشاء عقود ذكية فيفت (على ما يبدو من الرقم الخامس، على غرار Forth ، وهي لغة تشترك بها Fift كثيرًا).

الوثيقة ضخمة للغاية ، 87 صفحة ، ولن أعيد سرد محتوياتها بالتفصيل في إطار هذه المقالة (على الأقل ، لأنني لم أنتهي من قراءتها :). سوف أتطرق إلى النقاط الرئيسية وأعطي بعض الأمثلة البرمجية بهذه اللغة.

على المستوى الأساسي ، فإن بناء جملة Fift بسيط للغاية: يتكون الكود الخاص به من كلام، عادة ما تكون مفصولة بمسافات أو أسطر جديدة (حالة خاصة: بعض الكلمات لا تتطلب فاصلًا بعد نفسها). أي كلمة هي سلسلة أحرف حساسة لحالة الأحرف تتوافق مع بعضها تحديد (بشكل تقريبي ، ما الذي يجب على المترجم أن يفعله عندما يصادف هذه الكلمة). إذا لم يكن هناك تعريف للكلمة ، يحاول المترجم تحليلها كرقم ودفعها إلى المكدس. بالمناسبة ، الأرقام هنا - فجأة - هي 257 بت أعداد صحيحة ، ولا توجد كسور على الإطلاق - بتعبير أدق ، تتحول على الفور إلى زوج من الأعداد الصحيحة التي تشكل بسط ومقام كسر منطقي.

تميل الكلمات إلى التفاعل مع القيم الموجودة أعلى المكدس. نوع منفصل للكلمات - بادئة - لا يستخدم المكدس ، ولكن الأحرف التي تليها من الملف المصدر. على سبيل المثال ، هذه هي الطريقة التي يتم بها تنفيذ القيم الحرفية للسلسلة - حرف الاقتباس (") هي كلمة بادئة تبحث عن الاقتباس (الختامي) التالي ، وتدفع السلسلة الموجودة بينهما إلى المكدس. يتصرف الخط الواحد بطريقة مماثلة (//) ومتعدد الأسطر (/*) تعليقات.

هذا هو المكان الذي ينتهي فيه الهيكل الداخلي للغة بالكامل تقريبًا. يتم تعريف كل شيء آخر (بما في ذلك بنيات التحكم) على أنها كلمات (إما داخلية ، مثل العمليات الحسابية وتحديد كلمات جديدة ؛ أو يتم تعريفها في "المكتبة القياسية" Fift.fif، الموجود في المجلد crypto/fift في المصادر).

مثال بسيط لبرنامج Fift:

{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .

السطر الأول يحدد كلمة جديدة setxy (لاحظ البادئة {، مما يؤدي إلى إنشاء كتلة قبل الإغلاق } والبادئة :، الذي يعرّف الكلمة بالفعل). setxy يأخذ رقمًا من أعلى المكدس ، ويعرفه (أو يعيد تعريفه) على أنه رقم عام ثابت x، ومربع هذا الرقم ثابتًا y (بالنظر إلى أنه يمكن إعادة تعريف قيم الثوابت ، فإنني أفضل أن أسميها متغيرات ، لكنني أتبع التسمية في اللغة).

يقوم السطران التاليان بدفع رقم إلى المكدس ، استدعاء setxy، ثم يتم عرض قيم الثوابت x, y (يستخدم الإخراج الكلمة .) ، يتم دفع كلا الثوابت إلى المكدس ، ويتم تلخيصها ، ويتم عرض النتيجة أيضًا. نتيجة لذلك ، سوف نرى:

3 9 12 ok
7 49 56 ok

(يتم إخراج السطر "موافق" بواسطة المترجم عندما ينتهي من معالجة السطر الحالي في وضع الإدخال التفاعلي)

وإليك مثال رمز كامل:

"Asm.fif" include

-1 constant wc  // create a wallet in workchain -1 (masterchain)

// Create new simple wallet
<{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   // sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // sign cs cnt cnt' pubk
    s1 s2 XCPU            // sign cs cnt pubk cnt' cnt
    EQUAL 33 THROWIFNOT   // ( seqno mismatch? )
    s2 PUSH HASHSU        // sign cs cnt pubk hash
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // signature mismatch
    ACCEPT
    SWAP 32 LDU NIP 
    DUP SREFS IF:<{
      8 LDU LDREF         // pubk cnt mode msg cs
      s0 s2 XCHG SENDRAWMSG  // pubk cnt cs ; ( message sent )
    }>
    ENDS
    INC NEWC 32 STU 256 STU ENDC c4 POPCTR
}>c
// code
<b 0 32 u, 
   newkeypair swap dup constant wallet_pk 
   "new-wallet.pk" B>file
   B, 
b> // data
// no libraries
<b b{00110} s, rot ref, swap ref, b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " dup x. cr
wc over 7 smca>$ type cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Saved to file " type .")" cr

ملف المظهر المخيف هذا مخصص لإنشاء عقد ذكي - سيتم وضعه في الملف new-wallet-query.boc بعد الإعدام. يرجى ملاحظة أنه يتم استخدام لغة تجميع أخرى لـ TON Virtual Machine هنا (لن أتطرق إليها بالتفصيل) ، وسيتم وضع التعليمات الخاصة بها على blockchain.

وبالتالي ، فإن مُجمِّع TVM مكتوب في Fift - الكود المصدري لهذا المُجمِّع موجود في الملف crypto/fift/Asm.fif ومتصلة في بداية جزء الكود أعلاه.

ماذا يمكنني أن أقول ، على ما يبدو ، نيكولاي دوروف يحب فقط إنشاء لغات برمجة جديدة 🙂

إنشاء عقد ذكي والتفاعل مع TON

لنفترض أننا أنشأنا عميل TON ومترجم Fift كما هو موضح أعلاه وتعرفنا على اللغة. كيف تنشئ عقدًا ذكيًا الآن؟ هذا موصوف في الملف. HOWTOتعلق على المصدر.

الحسابات في TON

كما وصفت في مراجعة TON، تحتوي هذه الشبكة على أكثر من blockchain - هناك واحدة شائعة تسمى. "masterchain" ، بالإضافة إلى عدد عشوائي من "سلاسل العمل" الإضافية المحددة برقم 32 بت. يحتوي masterchain على معرف -1 ، بالإضافة إلى أنه يمكن أيضًا استخدام سلسلة عمل "أساسية" بمعرف 0. يمكن أن يكون لكل سلسلة عمل تكوينها الخاص. داخليًا ، يتم تقسيم كل سلسلة عمل إلى سلاسل shardchains ، ولكن هذه تفاصيل تنفيذ ليست ضرورية لأخذها في الاعتبار.

ضمن سلسلة عمل واحدة ، يتم تخزين العديد من الحسابات التي لها معرفات account_id الخاصة بها. بالنسبة إلى سلسلة العمل الرئيسية وسلسلة العمل الفارغة ، يبلغ طولها 256 بت. وبالتالي ، يتم كتابة معرف الحساب ، على سبيل المثال ، على النحو التالي:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

هذا هو التنسيق الأولي: أولاً معرف سلسلة العمل ، ثم النقطتين ، ومعرف الحساب بالتدوين السداسي العشري.

بالإضافة إلى ذلك ، هناك تنسيق مختصر - يتم ترميز رقم سلسلة العمل وعنوان الحساب في شكل ثنائي ، ويضاف إليها مجموع اختباري ، وكل هذا يتم ترميزه في Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

بمعرفة تنسيق السجل هذا ، يمكننا طلب الحالة الحالية لبعض الحسابات من خلال عميل الاختبار باستخدام الأمر

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

نحصل على إجابة مثل هذا:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    requesting account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    got account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D with respect to blocks (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F and (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:-1 address:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:3)
      bits:(var_uint len:2 value:539)
      public_cells:(var_uint len:0 value:0)) last_paid:0
    due_payment:nothing)
  storage:(account_storage last_trans_lt:74208000003
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      other:(extra_currencies
        dict:hme_empty))
    state:(account_active
      (
        split_depth:nothing
        special:nothing
        code:(just
          value:(raw@^Cell 
            x{}
             x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
            ))
        data:(just
          value:(raw@^Cell 
            x{}
             x{0000000D}
            ))
        library:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
 x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

نرى الهيكل المخزن في DHT لسلسلة العمل المحددة. على سبيل المثال ، في الميدان storage.balance هو الرصيد الحالي للحساب ، ب storage.state.code هو رمز العقد الذكي ، وفي storage.state.data - بياناتها الحالية. يرجى ملاحظة أن تخزين بيانات TON - الخلية ، الخلايا - يشبه الشجرة ، يمكن أن تحتوي كل خلية على بياناتها الخاصة وخلاياها الفرعية. يظهر هذا على شكل مسافة بادئة في السطور الأخيرة.

بناء عقد ذكي

الآن دعونا ننشئ مثل هذا الهيكل بأنفسنا (يطلق عليه BOC - كيس من الخلايا) باستخدام لغة Fift. لحسن الحظ ، لا يتعين عليك كتابة عقد ذكي بنفسك - في المجلد crypto/block من أرشيف المصدر يوجد ملف new-wallet.fif، مما سيساعدنا في إنشاء محفظة جديدة. انسخه إلى المجلد مع العميل المجمع (~/liteclient-buildإذا اتبعت التعليمات أعلاه). لقد ذكرت محتوياتها أعلاه كمثال على الكود في Fift.

نقوم بتنفيذ هذا الملف على النحو التالي:

./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif

ومن <source-directory> يجب استبداله بالمسار المؤدي إلى المصادر غير المعبأة (لا يمكن استخدام الرمز "~" هنا ، للأسف ، هناك حاجة إلى المسار الكامل). بدلا من استخدام مفتاح -I يمكنك تحديد متغير البيئة FIFTPATH ونضع هذا الطريق فيه.

منذ أن أطلقنا Fift باسم ملف new-wallet.fif، سيتم تنفيذه والخروج. إذا حذفت اسم الملف ، يمكنك اللعب مع المترجم الفوري بشكل تفاعلي.

بعد التنفيذ ، يجب أن يظهر شيء من هذا القبيل في وحدة التحكم:

StateInit: x{34_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

new wallet address = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signing message: x{00000000}

External message for initialization is x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Saved to file new-wallet-query.boc)

هذا يعني أن المحفظة مع المعرف -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (أو ، وهو نفس الشيء ، 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) تم إنشاؤه بنجاح. سيكون الرمز المقابل في الملف new-wallet-query.boc، عنوانه في new-wallet.addrوالمفتاح الخاص في new-wallet.pk (كن حذرًا - سيؤدي تشغيل البرنامج النصي مرة أخرى إلى الكتابة فوق هذه الملفات).

بالطبع ، لا تعرف شبكة TON بعد عن هذه المحفظة ، يتم تخزينها فقط في شكل هذه الملفات. الآن يجب تحميله على الشبكة. صحيح أن المشكلة تكمن في أنه لإنشاء عقد ذكي ، فإنك تحتاج إلى دفع عمولة ، ولا يزال رصيد حسابك صفراً.

في وضع العمل ، سيتم حل هذه المشكلة عن طريق شراء غرام في البورصة (أو عن طريق التحويل من محفظة أخرى). حسنًا ، في وضع الاختبار الحالي ، تم إطلاق عقد ذكي خاص ، يمكنك من خلاله طلب ما يصل إلى 20 جرامًا من هذا القبيل.

تشكيل طلب عقد ذكي لشخص آخر

طلب عقد ذكي يوزع الجرامات يمينًا ويسارًا ، نقوم بذلك. في نفس المجلد crypto/block إيجاد ملف testgiver.fif:

// "testgiver.addr" file>B 256 B>u@ 
0x8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
dup constant wallet_addr ."Test giver address = " x. cr

0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
constant dest_addr

-1 constant wc
0x00000011 constant seqno

1000000000 constant Gram
{ Gram swap */ } : Gram*/

6.666 Gram*/ constant amount

// b x --> b'  ( serializes a Gram amount )
{ -1 { 1+ 2dup 8 * ufits } until
  rot over 4 u, -rot 8 * u, } : Gram, 

// create a message (NB: 01b00.., b = bounce)
<b b{010000100} s, wc 8 i, dest_addr 256 u, amount Gram, 0 9 64 32 + + 1+ 1+ u, "GIFT" $, b>
<b seqno 32 u, 1 8 u, swap ref, b>
dup ."enveloping message: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 Gram, b{00} s,
   swap <s s, b>
dup ."resulting external message: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>file

سنحفظه أيضًا في المجلد مع العميل المجمع ، لكننا سنصحح السطر الخامس - قبل السطر "constant dest_addr". دعنا نستبدلها بعنوان المحفظة التي أنشأتها من قبل (كاملة وليست مختصرة). "-1:" لا تحتاج إلى كتابتها في البداية ، بدلاً من ذلك ضع "0x" في البداية.

يمكنك أيضًا تغيير الخط 6.666 Gram*/ constant amount هي الكمية التي تطلبها بالجرام (لا تزيد عن 20). حتى إذا قمت بتحديد عدد صحيح ، اترك العلامة العشرية.

أخيرًا ، نحتاج إلى إصلاح الخط 0x00000011 constant seqno. الرقم الأول هنا هو رقم التسلسل الحالي ، والذي يتم تخزينه في حساب إصدار غرام. من أين تحصل عليه؟ كما ذكر أعلاه ، ابدأ تشغيل العميل وقم بتشغيل:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

في النهاية ، ستحتوي بيانات العقد الذكي على

...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

الرقم 0000000 د (سيكون لديك المزيد) وهناك رقم تسلسلي يجب استبداله به testgiver.fif.

هذا كل شيء ، احفظ الملف وقم بتشغيل (./crypto/fift testgiver.fif). سيكون الإخراج ملفًا wallet-query.boc. هذا هو شكل сообщение إلى عقد ذكي لشخص آخر - طلب "تحويل الكثير من الغرامات إلى حساب كذا وكذا".

باستخدام العميل ، قم بتحميله على الشبكة:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode]    sending query from file wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   external message status is 1

إذا اتصل الآن last، ثم نطلب مرة أخرى حالة الحساب الذي طلبنا منه غرامًا ، ثم يجب أن نرى أن رقمه التسلسلي قد زاد بمقدار واحد - وهذا يعني أنه أرسل أموالًا إلى حسابنا.

الخطوة الأخيرة المتبقية هي تحميل رمز محفظتنا (تم تجديد رصيدها بالفعل ، لكننا لن نتمكن من إدارته بدون رمز العقد الذكي). نقوم بتنفيذها sendfile new-wallet-query.boc - وهذا كل شيء ، لديك محفظتك الخاصة في شبكة TON (وإن كانت مجرد اختبار في الوقت الحالي).

إنشاء المعاملات الصادرة

لتحويل الأموال من رصيد الحساب الذي تم إنشاؤه ، يوجد ملف crypto/block/wallet.fif، والتي تحتاج أيضًا إلى وضعها في المجلد مع العميل المجمع.

على غرار الخطوات السابقة ، تحتاج إلى تصحيح المبلغ الذي تقوم بتحويله ، وعنوان المستلم (dest_addr) ، ومحفظتك seqno (تساوي 1 بعد تهيئة المحفظة وتزيد بمقدار 1 بعد كل معاملة صادرة - يمكنك رؤيتها عن طريق الاستعلام عن حالة حسابك). للاختبارات ، يمكنك استخدام محفظتي ، على سبيل المثال - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

بطريق الانطلاق (./crypto/fift wallet.fif) سيأخذ البرنامج النصي عنوان محفظتك (التي تقوم بالتحويل منها) ومفتاحها الخاص من الملفات new-wallet.addr и new-wallet.pk، وستتم كتابة الرسالة المستلمة إلى new-wallet-query.boc.

كما كان من قبل ، لتنفيذ المعاملة مباشرة ، نسمي sendfile new-wallet-query.boc في العميل. بعد ذلك ، لا تنس تحديث حالة blockchain (last) وتحقق من تغيير الرصيد و seqno لمحفظتنا (getaccount <account_id>).

عميل اختبار TON (Telegram Open Network) ولغة Fift الجديدة للعقود الذكية

هذا كل شيء ، الآن يمكننا إنشاء عقود ذكية في TON وإرسال الطلبات إليهم. كما ترى ، فإن الوظيفة الحالية كافية بالفعل ، على سبيل المثال ، لإنشاء محفظة أكثر ودية بواجهة رسومية (ومع ذلك ، من المتوقع أن تصبح متاحة كجزء من برنامج المراسلة على أي حال).

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

هل أنت مهتم بمتابعة المقالات مع تحليل TON و TVM و Fift؟

  • نعم ، أنا في انتظار إكمال سلسلة من المقالات مع نظرة عامة على TON

  • نعم ، من المثير للاهتمام قراءة المزيد عن لغة Fift

  • نعم ، أرغب في معرفة المزيد عن TON Virtual Machine والمجمع الخاص بها

  • لا ، لست مهتمًا بأي من هذا.

صوت 39 مستخدمين. امتنع 12 مستخدما عن التصويت.

ما هو شعورك حيال خطط Telegram لإطلاق TON؟

  • لدي آمال كبيرة في هذا المشروع.

  • أنا فقط أتابعها باهتمام.

  • أنا متشكك ، أشك في نجاحها

  • إنني أميل إلى اعتبار هذه المبادرة فاشلة وغير ضرورية للجماهير العريضة

صوت 47 مستخدمين. امتنع 12 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق