ไคลเอนต์ทดสอบ TON (Telegram Open Network) และภาษา Fift ใหม่สำหรับสัญญาอัจฉริยะ

มากกว่าหนึ่งปีที่ผ่านมา เป็นที่ทราบกันดีเกี่ยวกับแผนการของ Telegram Messenger ที่จะเผยแพร่เครือข่ายการกระจายอำนาจของตัวเอง เปิดเครือข่ายโทรเลข. จากนั้นมีเอกสารทางเทคนิคจำนวนมากซึ่งถูกกล่าวหาว่าเขียนโดย Nikolai Durov และอธิบายโครงสร้างของเครือข่ายในอนาคต สำหรับผู้ที่พลาด ฉันขอแนะนำให้คุณอ่านการเล่าเรื่องเอกสารนี้ของฉันอีกครั้ง (ส่วนหนึ่งของ 1, ส่วนหนึ่งของ 2; ส่วนที่สามอนิจจายังคงเก็บฝุ่นเป็นร่าง)

ตั้งแต่นั้นมา ยังไม่มีข่าวสำคัญเกี่ยวกับสถานะของการพัฒนา TON จนกระทั่งเมื่อสองสามวันก่อน (ในหนึ่งในนั้น) ช่องทางที่ไม่เป็นทางการ) ลิงก์ไปยังเพจไม่ปรากฏ https://test.ton.org/download.html, อยู่ที่ไหน:
ตันทดสอบ liteclient-full.tar.xz — แหล่งที่มาของไคลเอนต์แบบเบาสำหรับเครือข่ายทดสอบ TON
ตัน-lite-client-test1.config.json — ไฟล์การกำหนดค่าสำหรับการเชื่อมต่อกับเครือข่ายทดสอบ
README — ข้อมูลเกี่ยวกับการสร้างและการเปิดตัวลูกค้า
วิธีทำ — คำแนะนำทีละขั้นตอนในการสร้างสัญญาอัจฉริยะโดยใช้ไคลเอนต์
ตัน.pdf — เอกสารที่อัปเดต (ลงวันที่ 2 มีนาคม 2019) พร้อมภาพรวมทางเทคนิคของเครือข่าย TON
ทีวีเอ็ม.pdf — คำอธิบายทางเทคนิคของ TVM (TON Virtual Machine, TON virtual machine)
tblkch.pdf — คำอธิบายทางเทคนิคของ TON blockchain
ฐานที่ห้า.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 ใหม่สำหรับสัญญาอัจฉริยะ

    ในการสร้างล่ามภาษาห้าสำหรับสัญญาอัจฉริยะ (เพิ่มเติมเกี่ยวกับเรื่องนี้ด้านล่าง) เรายังเรียก

    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 — อัปเดตสถานะของบล็อคเชน (ดาวน์โหลดบล็อคสุดท้าย) สิ่งสำคัญคือต้องรันคำสั่งนี้ก่อนที่จะร้องขอใดๆ เพื่อให้แน่ใจว่าคุณเห็นสถานะปัจจุบันของเครือข่าย
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 พยายามรวบรวมสัญญาอัจฉริยะ (เช่น สร้างกระเป๋าเงินทดสอบ) อัปโหลดไปยังเครือข่าย และลองโอนเงินระหว่างบัญชี

ภาษาที่ห้า

จากเอกสาร ฐานที่ห้า.pdf คุณจะพบว่าทีม Telegram ได้สร้างภาษาสแต็กใหม่เพื่อสร้างสัญญาอัจฉริยะ ห้า (ดูจากตัวเลข. ที่ห้าคล้ายกับภาษา 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 Virtual Machine (ฉันจะไม่เน้นรายละเอียด) คำแนะนำจะถูกวางไว้บนบล็อคเชน

ดังนั้นแอสเซมเบลอร์สำหรับ TVM จึงเขียนด้วยภาษา Fift - แหล่งที่มาของแอสเซมเบลอร์นี้อยู่ในไฟล์ crypto/fift/Asm.fif และเชื่อมต่อกันที่จุดเริ่มต้นของโค้ดด้านบน

ฉันจะพูดอะไรได้บ้างเห็นได้ชัดว่า Nikolai Durov ชอบสร้างภาษาการเขียนโปรแกรมใหม่ :)

การสร้างสัญญาที่ชาญฉลาดและการโต้ตอบกับ TON

สมมติว่าเราได้รวบรวมไคลเอนต์ TON และล่าม Fift ตามที่อธิบายไว้ข้างต้นและคุ้นเคยกับภาษาแล้ว จะสร้างสัญญาอัจฉริยะตอนนี้ได้อย่างไร? นี่คือคำอธิบายในไฟล์ วิธีทำแนบมากับแหล่งที่มา

บัญชีใน 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}

เราเห็นโครงสร้างที่ถูกเก็บไว้ใน DHT ของเวิร์กเชนที่ระบุ เช่น ในสนาม storage.balance คือยอดเงินในบัญชีปัจจุบันใน storage.state.code - รหัสสัญญาอัจฉริยะ และใน storage.state.data - ข้อมูลปัจจุบัน โปรดทราบว่าการจัดเก็บข้อมูล TON - เซลล์ เซลล์ - มีลักษณะคล้ายต้นไม้ แต่ละเซลล์สามารถมีทั้งข้อมูลและเซลล์ลูกของตัวเอง ซึ่งแสดงเป็นการเยื้องในบรรทัดสุดท้าย

การสร้างสัญญาที่ชาญฉลาด

ตอนนี้เรามาสร้างโครงสร้างดังกล่าวด้วยตัวเอง (เรียกว่า BOC - ถุงเซลล์) โดยใช้ภาษาห้า โชคดีที่คุณไม่จำเป็นต้องเขียนสัญญาอัจฉริยะด้วยตัวเองในโฟลเดอร์ 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) และลำดับลำดับของกระเป๋าเงินของคุณ (จะเท่ากับ 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 (Telegram Open Network) และภาษา Fift ใหม่สำหรับสัญญาอัจฉริยะ

เพียงเท่านี้ เราสามารถสร้างสัญญาอัจฉริยะใน TON และส่งคำขอไปยังพวกเขาได้ อย่างที่คุณเห็น ฟังก์ชั่นปัจจุบันก็เพียงพอที่จะสร้างกระเป๋าเงินที่เป็นมิตรมากขึ้นด้วยอินเทอร์เฟซแบบกราฟิก (อย่างไรก็ตาม คาดว่ามันจะพร้อมใช้งานในฐานะส่วนหนึ่งของ Messenger อยู่แล้ว)

เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถเข้าร่วมในการสำรวจได้ เข้าสู่ระบบ, โปรด.

คุณสนใจที่จะอ่านบทความวิเคราะห์ TON, TVM, Fift ต่อไปหรือไม่?

  • ใช่ ฉันกำลังรอให้ชุดบทความพร้อมภาพรวมทั่วไปของ TON เสร็จสิ้น

  • ใช่แล้ว การอ่านเพิ่มเติมเกี่ยวกับภาษาที่ห้านั้นน่าสนใจ

  • ใช่ ฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ TON Virtual Machine และแอสเซมเบลอร์ของมัน

  • ไม่ ไม่มีสิ่งใดที่น่าสนใจเลย

ผู้ใช้ 39 คนโหวต ผู้ใช้ 12 รายงดออกเสียง

คุณคิดอย่างไรเกี่ยวกับแผนการของ Telegram ที่จะเปิดตัว TON

  • ฉันมีความหวังสูงสำหรับโครงการนี้

  • ฉันแค่ติดตามการพัฒนาด้วยความสนใจ

  • ฉันสงสัยและสงสัยในความสำเร็จของมัน

  • ฉันมีแนวโน้มที่จะพิจารณาว่าความคิดริเริ่มนี้เป็นความล้มเหลวและไม่จำเป็นสำหรับมวลชนในวงกว้าง

ผู้ใช้ 47 คนโหวต ผู้ใช้ 12 รายงดออกเสียง

ที่มา: will.com

เพิ่มความคิดเห็น