TON (شبکه باز تلگرام) و زبان Fift جدید را برای قراردادهای هوشمند آزمایش کنید

بیش از یک سال پیش، از برنامه های پیام رسان تلگرام برای انتشار شبکه غیرمتمرکز خود مطلع شد. Telegram Open Network. سپس یک سند فنی حجیم در دسترس قرار گرفت که ظاهراً توسط نیکولای دوروف نوشته شده بود و ساختار شبکه آینده را توصیف می کرد. برای کسانی که آن را از دست داده اند، توصیه می کنم که بازگویی من از این سند را بخوانید (قسمت 1, قسمت 2; بخش سوم، افسوس، هنوز گرد و غبار را در پیش نویس جمع می کند).

از آن زمان تاکنون هیچ خبر قابل توجهی در مورد وضعیت توسعه TON تا چند روز پیش (در یکی از کانال های غیر رسمی) پیوند صفحه ظاهر نشد https://test.ton.org/download.html، جایی که قرار دارند:
ton-test-liteclient-full.tar.xz - منابع یک مشتری نور برای شبکه آزمایش TON؛
ton-lite-client-test1.config.json - فایل پیکربندی برای اتصال به شبکه آزمایشی؛
README - اطلاعات در مورد ساخت و راه اندازی مشتری؛
چگونه - دستورالعمل های گام به گام در مورد ایجاد یک قرارداد هوشمند با استفاده از مشتری؛
ton.pdf - سند به روز شده (مورخ 2 مارس 2019) با نمای فنی شبکه TON؛
tvm.pdf - توضیحات فنی TVM (ماشین مجازی TON، ماشین مجازی TON)؛
tblkch.pdf - توضیحات فنی بلاک چین TON؛
fifthbase.pdf - شرح زبان Fift جدید، طراحی شده برای ایجاد قراردادهای هوشمند در TON.

باز هم می گویم هیچ تایید رسمی صفحه و این همه اسناد از تلگرام وجود نداشت اما حجم این مطالب آنها را کاملا قابل قبول می کند. کلاینت منتشر شده را راه اندازی کنید با ریسک خود شخص.

ساخت مشتری آزمایشی

ابتدا، بیایید سعی کنیم یک کلاینت آزمایشی بسازیم و اجرا کنیم - خوشبختانه، 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 (شبکه باز تلگرام) و زبان Fift جدید را برای قراردادهای هوشمند آزمایش کنید

    برای ساخت مترجم زبان Fift برای قراردادهای هوشمند (در مورد آن در زیر)، ما همچنین تماس می گیریم

    cmake --build . --target fift

  4. فعلی را دانلود کنید فایل پیکربندی برای اتصال به شبکه آزمایشی و قرار دادن آن در پوشه با کلاینت اسمبل شده.

  5. انجام شده است، می توانید مشتری را راه اندازی کنید:

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

اگر همه چیز به درستی انجام شود، باید چیزی شبیه به این را ببینید:

TON (شبکه باز تلگرام) و زبان Fift جدید را برای قراردادهای هوشمند آزمایش کنید

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

اگر هنگام راه اندازی کلاینت، پوشه ای را با استفاده از گزینه به آن منتقل کنید -D، سپس آخرین بلوک Masterchain را به آن اضافه می کند:

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

اکنون می‌توانیم به چیزهای جالب‌تری برویم - زبان Fift را یاد بگیرید، سعی کنید یک قرارداد هوشمند جمع‌آوری کنید (مثلاً یک کیف پول آزمایشی بسازید)، آن را در شبکه آپلود کنید و سعی کنید وجوه را بین حساب‌ها منتقل کنید.

زبان پنجم

از سند fifthbase.pdf می توانید متوجه شوید که تیم تلگرام یک زبان پشته جدید برای ایجاد قراردادهای هوشمند ایجاد کرده است پنج (ظاهراً از روی عدد پنجم، مشابه زبان Forth، زبانی که Fifth اشتراکات زیادی با آن دارد).

این سند بسیار حجیم است، 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

(خط "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 استفاده می‌شود (من به طور مفصل در مورد آن صحبت نمی‌کنم) که دستورالعمل‌های آن بر روی بلاک چین قرار می‌گیرد.

بنابراین، اسمبلر برای TVM در Fift نوشته شده است - منابع این اسمبلر در فایل موجود است crypto/fift/Asm.fif و در ابتدای کد بالا متصل می شوند.

چه می توانم بگویم، ظاهرا نیکولای دوروف فقط عاشق ایجاد زبان های برنامه نویسی جدید است :)

ایجاد یک قرارداد هوشمند و تعامل با TON

بنابراین، بیایید فرض کنیم مشتری TON و مترجم Fift را همانطور که در بالا توضیح داده شد مونتاژ کرده ایم و با زبان آشنا شده ایم. اکنون چگونه یک قرارداد هوشمند ایجاد کنیم؟ این در فایل توضیح داده شده است چگونه، پیوست به منابع.

حساب ها به TON

همانطور که در توضیح دادم بررسی TON، این شبکه شامل بیش از یک بلاک چین است - یک مورد رایج وجود دارد که به اصطلاح وجود دارد. "زنجیره اصلی"، و همچنین تعداد دلخواه "زنجیره کار" اضافی، که با یک عدد 32 بیتی مشخص می شود. Masterchain دارای شناسه -1 است، علاوه بر آن، می توان از یک زنجیره کار "پایه" با شناسه 0 نیز استفاده کرد. هر زنجیره کاری می تواند پیکربندی خاص خود را داشته باشد. در داخل، هر زنجیره کار به زنجیره های خرد تقسیم می شود، اما این یک جزئیات پیاده سازی است که نیازی به در نظر گرفتن ندارد.

در یک زنجیره کاری، حساب های زیادی ذخیره می شوند که شناسه های 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}

عدد 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 (شبکه باز تلگرام) و زبان Fift جدید را برای قراردادهای هوشمند آزمایش کنید

این همه است، اکنون می توانیم قراردادهای هوشمند را در TON ایجاد کنیم و درخواست ها را برای آنها ارسال کنیم. همانطور که می بینید، عملکرد فعلی در حال حاضر برای ایجاد یک کیف پول دوستانه تر با رابط گرافیکی کافی است (با این حال، انتظار می رود که در حال حاضر به عنوان بخشی از پیام رسان در دسترس باشد).

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

آیا علاقه مند به ادامه مقالات با تجزیه و تحلیل TON، TVM، Fift هستید؟

  • بله، من منتظر تکمیل مجموعه مقالات با یک نمای کلی از TON هستم

  • بله، جالب است که در مورد زبان Fift بیشتر بخوانید

  • بله، می‌خواهم درباره ماشین مجازی TON و اسمبلر آن اطلاعات بیشتری کسب کنم

  • نه، هیچ کدام از اینها جالب نیست

39 کاربر رای دادند. 12 کاربر رای ممتنع دادند.

نظر شما در مورد برنامه های تلگرام برای راه اندازی TON چیست؟

  • من به این پروژه امید زیادی دارم

  • من فقط توسعه آن را با علاقه دنبال می کنم.

  • من شک دارم و به موفقیت آن شک دارم.

  • من تمایل دارم این ابتکار را برای توده های وسیع شکست خورده و غیر ضروری بدانم

47 کاربر رای دادند. 12 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر