سمارٹ معاہدوں کے لیے کلائنٹ TON (ٹیلیگرام اوپن نیٹ ورک) اور نئی ففٹ لینگویج کی جانچ کریں۔

ایک سال سے زیادہ پہلے، یہ ٹیلیگرام میسنجر کے اپنے وکندریقرت نیٹ ورک کو جاری کرنے کے منصوبوں کے بارے میں معلوم ہوا تھا۔ ٹیلیگرام اوپن نیٹ ورک. اس کے بعد ایک بڑی تکنیکی دستاویز دستیاب ہوئی، جسے مبینہ طور پر نکولائی دوروف نے لکھا اور مستقبل کے نیٹ ورک کی ساخت کو بیان کیا۔ ان لوگوں کے لیے جنہوں نے اسے یاد کیا، میں تجویز کرتا ہوں کہ آپ میری اس دستاویز کو دوبارہ پڑھ لیں (. 1, . 2; تیسرا حصہ، افسوس، اب بھی مسودوں میں خاک جمع کر رہا ہے)۔

اس کے بعد سے، کچھ دن پہلے تک TON کی ترقی کی حیثیت کے بارے میں کوئی اہم خبر نہیں ہے (ان میں سے ایک میں غیر سرکاری چینلز) صفحہ کا لنک ظاہر نہیں ہوا۔ https://test.ton.org/download.html، کہاں واقع ہیں:
ton-test-liteclient-full.tar.xz - TON ٹیسٹ نیٹ ورک کے لیے ہلکے کلائنٹ کے ذرائع؛
ton-lite-client-test1.config.json - ٹیسٹ نیٹ ورک سے جڑنے کے لیے کنفیگریشن فائل؛
پڑھیں - کلائنٹ کی تعمیر اور آغاز کے بارے میں معلومات؛
کیسے - ایک کلائنٹ کا استعمال کرتے ہوئے ایک سمارٹ کنٹریکٹ بنانے کے لیے مرحلہ وار ہدایات؛
ton.pdf — اپ ڈیٹ شدہ دستاویز (2 مارچ 2019) TON نیٹ ورک کے تکنیکی جائزہ کے ساتھ؛
tvm.pdf - TVM کی تکنیکی وضاحت (TON ورچوئل مشین، TON ورچوئل مشین)؛
tblkch.pdf - TON بلاکچین کی تکنیکی وضاحت؛
fifthbase.pdf — نئی ففٹ لینگویج کی تفصیل، جسے TON میں سمارٹ کنٹریکٹس بنانے کے لیے ڈیزائن کیا گیا ہے۔

میں دہراتا ہوں، ٹیلیگرام سے صفحہ اور ان تمام دستاویزات کی کوئی باضابطہ تصدیق نہیں ہوئی، لیکن ان مواد کا حجم انہیں کافی قابل فہم بناتا ہے۔ شائع شدہ کلائنٹ کو شروع کریں۔ اپنے خطرے پر.

ایک ٹیسٹ کلائنٹ کی تعمیر

سب سے پہلے، آئیے ایک ٹیسٹ کلائنٹ بنانے اور چلانے کی کوشش کریں - خوش قسمتی سے، پڑھیں اس سادہ عمل کو تفصیل سے بیان کرتا ہے۔ میں یہ مثال کے طور پر macOS 10.14.5 کا استعمال کرتے ہوئے کروں گا؛ میں دوسرے سسٹمز پر تعمیر کی کامیابی کی ضمانت نہیں دے سکتا۔

  1. ڈاؤن لوڈ اور پیک کھولیں۔ ماخذ محفوظ شدہ دستاویزات. تازہ ترین ورژن ڈاؤن لوڈ کرنا ضروری ہے کیونکہ اس مرحلے پر پسماندہ مطابقت کی ضمانت نہیں ہے۔

  2. اس بات کو یقینی بنائیں کہ میک، 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 (ٹیلیگرام اوپن نیٹ ورک) اور نئی ففٹ لینگویج کی جانچ کریں۔

    سمارٹ معاہدوں کے لیے ففٹ لینگویج انٹرپریٹر بنانے کے لیے (نیچے اس کے بارے میں مزید)، ہم بھی کال کرتے ہیں۔

    cmake --build . --target fift

  4. موجودہ ڈاؤن لوڈ کریں۔ ترتیب فائل ٹیسٹ نیٹ ورک سے جڑنے کے لیے اور اسے جمع شدہ کلائنٹ کے ساتھ فولڈر میں ڈالیں۔

  5. ہو گیا، آپ کلائنٹ شروع کر سکتے ہیں:

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

اگر سب کچھ صحیح طریقے سے کیا گیا ہے، تو آپ کو اس طرح کچھ دیکھنا چاہئے:

سمارٹ معاہدوں کے لیے کلائنٹ TON (ٹیلیگرام اوپن نیٹ ورک) اور نئی ففٹ لینگویج کی جانچ کریں۔

جیسا کہ ہم دیکھ سکتے ہیں، چند دستیاب کمانڈز ہیں:
help - کمانڈز کی اس فہرست کو ظاہر کریں؛
quit - باہر جانا؛
time - سرور پر موجودہ وقت دکھائیں؛
status - کنکشن اور مقامی ڈیٹا بیس کی حیثیت دکھائیں؛
last - بلاکچین کی حالت کو اپ ڈیٹ کریں (آخری بلاک ڈاؤن لوڈ کریں)۔ کسی بھی درخواست سے پہلے اس کمانڈ کو چلانا ضروری ہے تاکہ یہ یقینی بنایا جا سکے کہ آپ نیٹ ورک کی موجودہ حالت دیکھ رہے ہیں۔
sendfile <filename> - TON نیٹ ورک پر ایک مقامی فائل اپ لوڈ کریں۔ اس طرح نیٹ ورک کے ساتھ تعامل ہوتا ہے - بشمول، مثال کے طور پر، نئے سمارٹ معاہدوں کی تخلیق اور اکاؤنٹس کے درمیان رقوم کی منتقلی کی درخواستیں؛
getaccount <address> - کرنٹ دکھائیں (جس وقت کمانڈ پر عمل کیا گیا تھا) last) مخصوص ایڈریس کے ساتھ اکاؤنٹ کی حیثیت؛
privkey <filename> - مقامی فائل سے نجی کلید لوڈ کریں۔

اگر، کلائنٹ کو شروع کرتے وقت، آپ آپشن کا استعمال کرتے ہوئے فولڈر کو اس میں منتقل کرتے ہیں۔ -D، پھر وہ اس میں ماسٹر چین کا آخری بلاک شامل کرے گا:

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

اب ہم مزید دلچسپ چیزوں کی طرف بڑھ سکتے ہیں - ففٹ زبان سیکھیں، ایک سمارٹ کنٹریکٹ مرتب کرنے کی کوشش کریں (مثال کے طور پر ایک ٹیسٹ والیٹ بنائیں)، اسے نیٹ ورک پر اپ لوڈ کریں اور اکاؤنٹس کے درمیان رقوم کی منتقلی کی کوشش کریں۔

زبان پانچ

دستاویز سے fifthbase.pdf آپ یہ جان سکتے ہیں کہ ٹیلی گرام ٹیم نے سمارٹ کنٹریکٹس بنانے کے لیے ایک نئی اسٹیک لینگویج بنائی ہے۔ پانچ (بظاہر اعداد سے پانچویںفورتھ کی طرح، ایک ایسی زبان جس کے ساتھ پانچویں میں بہت کچھ مشترک ہے)۔

دستاویز کافی بڑی ہے، 87 صفحات پر مشتمل ہے، اور میں اس مضمون کے فریم ورک کے اندر اس کے مندرجات کو تفصیل سے نہیں بتاؤں گا (کم از کم اس لیے کہ میں نے خود اسے پڑھنا ختم نہیں کیا ہے :)۔ میں اہم نکات پر توجہ دوں گا اور اس زبان میں کوڈ کی چند مثالیں دوں گا۔

بنیادی سطح پر، ففٹ کا نحو کافی آسان ہے: اس کا کوڈ پر مشتمل ہے۔ الفاظ, عام طور پر خالی جگہوں یا لائن کے وقفوں سے الگ کیا جاتا ہے (خاص معاملہ: کچھ الفاظ کو اپنے بعد الگ کرنے والے کی ضرورت نہیں ہوتی ہے)۔ کوئی بھی لفظ حروف کی ایک کیس حساس ترتیب ہے جو کسی خاص سے مطابقت رکھتی ہے۔ تعریف (تقریباً، جب اس لفظ کا سامنا ہو تو ترجمان کو کیا کرنا چاہیے)۔ اگر کسی لفظ کی کوئی تعریف نہیں ہے تو مترجم اسے نمبر کے طور پر پارس کرنے اور اسٹیک پر ڈالنے کی کوشش کرتا ہے۔ ویسے، یہاں کے اعداد ہیں - اچانک - 257 بٹ انٹیجرز، اور ان میں کوئی کسر بالکل بھی نہیں ہے - زیادہ واضح طور پر، وہ فوری طور پر عدد کے جوڑے میں تبدیل ہو جاتے ہیں، جو ایک عقلی کسر کا عدد اور ڈینومینیٹر بناتے ہیں۔

الفاظ اسٹیک کے اوپری حصے میں اقدار کے ساتھ تعامل کرتے ہیں۔ الفاظ کی ایک الگ قسم - سابقہ - اسٹیک کا استعمال نہیں کرتا، لیکن سورس فائل کے بعد کے حروف۔ مثال کے طور پر، اس طرح اسٹرنگ لٹریلز کو لاگو کیا جاتا ہے - اقتباس کردار (") ایک سابقہ ​​لفظ ہے جو اگلے (بند ہونے والے) اقتباس کو تلاش کرتا ہے، اور ان کے درمیان سٹرنگ کو اسٹیک پر دھکیلتا ہے۔ ون لائنرز اسی طرح برتاؤ کرتے ہیں (//) اور ملٹی لائن (/*) تبصرے

یہیں سے زبان کی تقریباً پوری اندرونی ساخت ختم ہو جاتی ہے۔ باقی سب کچھ (بشمول کنٹرول کنسٹرکٹس) کو الفاظ کے طور پر بیان کیا گیا ہے (یا تو اندرونی، جیسے ریاضی کے عمل اور نئے الفاظ کی تعریف؛ یا "معیاری لائبریری" میں بیان کی گئی ہے۔ Fift.fif، جو فولڈر میں ہے۔ crypto/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 ورچوئل مشین کے لیے ایک اور اسمبلی لینگویج استعمال کی گئی ہے (میں اس پر تفصیل سے غور نہیں کروں گا)، جس کی ہدایات بلاک چین پر رکھی جائیں گی۔

اس طرح ٹی وی ایم کے لیے اسمبلر کو ففٹ میں لکھا گیا ہے - اس اسمبلر کے ذرائع فائل میں ہیں crypto/fift/Asm.fif اور کوڈ کے اوپر والے حصے کے شروع میں جڑے ہوئے ہیں۔

میں کیا کہہ سکتا ہوں، بظاہر نکولائی ڈوروف کو صرف نئی پروگرامنگ زبانیں بنانا پسند ہے :)

ایک سمارٹ معاہدہ بنانا اور TON کے ساتھ بات چیت کرنا

تو، فرض کریں کہ ہم نے TON کلائنٹ اور ففٹ انٹرپریٹر کو اسمبل کر لیا ہے جیسا کہ اوپر بیان کیا گیا ہے اور زبان سے واقف ہو گئے ہیں۔ اب ایک سمارٹ کنٹریکٹ کیسے بنایا جائے؟ یہ فائل میں بیان کیا گیا ہے۔ کیسےذرائع سے منسلک۔

TON میں اکاؤنٹس

جیسا کہ میں نے بیان کیا ہے۔ TON جائزہ، اس نیٹ ورک میں ایک سے زیادہ بلاکچین ہیں - ایک عام ہے، نام نہاد۔ "ماسٹر چین"، نیز اضافی "ورک چینز" کی صوابدیدی تعداد، جس کی شناخت 32 بٹ نمبر سے ہوتی ہے۔ ماسٹر چین میں -1 کا شناخت کنندہ ہے؛ اس کے علاوہ، 0 کے شناخت کنندہ کے ساتھ ایک "بیس" ورک چین بھی استعمال کیا جا سکتا ہے۔ ہر ورک چین کی اپنی ترتیب ہو سکتی ہے۔ اندرونی طور پر، ہر ورک چین کو شارڈ چینز میں تقسیم کیا گیا ہے، لیکن یہ عمل درآمد کی تفصیل ہے جسے ذہن میں رکھنے کی ضرورت نہیں ہے۔

ایک ورک چین کے اندر، بہت سے اکاؤنٹس اسٹور کیے جاتے ہیں جن کے اپنے account_id شناخت کنندہ ہوتے ہیں۔ ماسٹر چین اور صفر ورک چین کے لیے، وہ 256 بٹ لمبے ہیں۔ اس طرح، اکاؤنٹ شناخت کنندہ لکھا جاتا ہے، مثال کے طور پر، اس طرح:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

یہ "را" فارمیٹ ہے: پہلے ورک چین ID، پھر بڑی آنت، اور ہیکسا ڈیسیمل اشارے میں اکاؤنٹ ID۔

اس کے علاوہ، ایک مختصر شکل ہے - ورک چین نمبر اور اکاؤنٹ کا پتہ بائنری شکل میں انکوڈ کیا جاتا ہے، ان میں ایک چیکسم شامل کیا جاتا ہے، اور یہ سب کچھ 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}

ہم وہ ڈھانچہ دیکھتے ہیں جو مخصوص ورک چین کے ڈی ایچ ٹی میں محفوظ ہے۔ مثال کے طور پر، میدان میں storage.balance کرنٹ اکاؤنٹ بیلنس ہے، میں storage.state.code - سمارٹ کنٹریکٹ کوڈ، اور اندر storage.state.data - اس کا موجودہ ڈیٹا۔ براہ کرم نوٹ کریں کہ TON ڈیٹا اسٹوریج - سیل، سیلز - درخت کی طرح ہے، ہر سیل کا اپنا ڈیٹا اور چائلڈ سیل دونوں ہو سکتے ہیں۔ یہ آخری لائنوں میں انڈینٹیشن کے طور پر دکھایا گیا ہے۔

ایک سمارٹ کنٹریکٹ بنانا

آئیے اب ایسا ڈھانچہ خود بنائیں (اسے BOC کہتے ہیں - خلیات کا بیگپانچ زبان کا استعمال کرتے ہوئے. خوش قسمتی سے، آپ کو خود ایک سمارٹ کنٹریکٹ لکھنے کی ضرورت نہیں ہے - فولڈر میں crypto/block سورس آرکائیو سے ایک فائل ہے۔ new-wallet.fif، جو ایک نیا پرس بنانے میں ہماری مدد کرے گا۔ آئیے اسے جمع شدہ کلائنٹ کے ساتھ فولڈر میں کاپی کریں (~/liteclient-build، اگر آپ اوپر دی گئی ہدایات پر عمل کرتے ہیں)۔ میں نے اوپر اس کے مندرجات کو ففٹ پر کوڈ کی مثال کے طور پر پیش کیا۔

اس فائل کو اس طرح چلائیں:

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

یہاں <source-directory> غیر پیک شدہ ذرائع کے راستے کے ساتھ تبدیل کرنا ضروری ہے ("~" علامت، بدقسمتی سے، یہاں استعمال نہیں کیا جا سکتا، مکمل راستے کی ضرورت ہے)۔ چابی استعمال کرنے کے بجائے -I آپ ماحولیاتی متغیر کی وضاحت کر سکتے ہیں۔ FIFTPATH اور اس راستے کو اس میں ڈالو.

چونکہ ہم نے فائل کے نام کے ساتھ فائفٹ لانچ کیا۔ 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}

نمبر 0000000D (آپ کا بڑا ہوگا) وہ ترتیب نمبر ہے جسے اس میں بدلنا ضروری ہے 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 کلائنٹ میں. اس کے بعد، بلاکچین کی حالت کو اپ ڈیٹ کرنا نہ بھولیں (lastاور چیک کریں کہ ہمارے بٹوے کا بیلنس اور سیکنو بدل گیا ہے (getaccount <account_id>).

سمارٹ معاہدوں کے لیے کلائنٹ TON (ٹیلیگرام اوپن نیٹ ورک) اور نئی ففٹ لینگویج کی جانچ کریں۔

بس، اب ہم TON میں سمارٹ معاہدے بنا سکتے ہیں اور انہیں درخواستیں بھیج سکتے ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، موجودہ فعالیت پہلے سے ہی کافی ہے، مثال کے طور پر، گرافیکل انٹرفیس کے ساتھ ایک زیادہ دوستانہ پرس بنانے کے لیے (تاہم، یہ توقع کی جاتی ہے کہ یہ پہلے ہی میسنجر کے حصے کے طور پر دستیاب ہو جائے گا)۔

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

کیا آپ TON، TVM، Fift کے تجزیہ کے ساتھ مضامین کو جاری رکھنے میں دلچسپی رکھتے ہیں؟

  • ہاں، میں TON کے عمومی جائزہ کے ساتھ مضامین کی سیریز کے مکمل ہونے کا انتظار کر رہا ہوں۔

  • ہاں، ففٹ زبان کے بارے میں مزید پڑھنا دلچسپ ہے۔

  • ہاں، میں TON ورچوئل مشین اور اس کے اسمبلر کے بارے میں مزید جاننا چاہتا ہوں۔

  • نہیں، اس میں سے کوئی بھی دلچسپ نہیں ہے۔

39 صارفین نے ووٹ دیا۔ 12 صارفین غیر حاضر رہے۔

ٹیلیگرام کے TON کو شروع کرنے کے منصوبوں کے بارے میں آپ کا کیا خیال ہے؟

  • مجھے اس منصوبے سے بہت زیادہ امیدیں ہیں۔

  • میں صرف دلچسپی کے ساتھ اس کی ترقی کی پیروی کر رہا ہوں۔

  • میں شکی ہوں اور اس کی کامیابی پر شک کرتا ہوں۔

  • میں اس اقدام کو ایک ناکامی اور وسیع عوام کے لیے غیر ضروری سمجھنے کی طرف مائل ہوں۔

47 صارفین نے ووٹ دیا۔ 12 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں