มากกว่าหนึ่งปีที่ผ่านมา เป็นที่ทราบกันดีเกี่ยวกับแผนการของ Telegram Messenger ที่จะเผยแพร่เครือข่ายการกระจายอำนาจของตัวเอง เปิดเครือข่ายโทรเลข. จากนั้นมีเอกสารทางเทคนิคจำนวนมากซึ่งถูกกล่าวหาว่าเขียนโดย Nikolai Durov และอธิบายโครงสร้างของเครือข่ายในอนาคต สำหรับผู้ที่พลาด ฉันขอแนะนำให้คุณอ่านการเล่าเรื่องเอกสารนี้ของฉันอีกครั้ง (
ตั้งแต่นั้นมา ยังไม่มีข่าวสำคัญเกี่ยวกับสถานะของการพัฒนา TON จนกระทั่งเมื่อสองสามวันก่อน (ในหนึ่งในนั้น)
◦
◦
◦
◦
◦
◦
◦
◦
ฉันขอย้ำอีกครั้งว่าไม่มีการยืนยันอย่างเป็นทางการเกี่ยวกับหน้านี้และเอกสารทั้งหมดเหล่านี้จาก Telegram แต่ปริมาณของเนื้อหาเหล่านี้ทำให้เป็นไปได้ค่อนข้างมาก เปิดตัวไคลเอนต์ที่เผยแพร่ อยู่ในความเสี่ยงของตัวเอง.
กำลังสร้างลูกค้าทดสอบ
ก่อนอื่น เรามาลองสร้างและรันไคลเอนต์ทดสอบกันก่อน - โชคดีที่
-
ดาวน์โหลดและแกะกล่อง
เก็บถาวรแหล่งที่มา . สิ่งสำคัญคือต้องดาวน์โหลดเวอร์ชันล่าสุด เนื่องจากไม่รับประกันความเข้ากันได้แบบย้อนหลังในขั้นตอนนี้ -
ตรวจสอบให้แน่ใจว่าเวอร์ชันล่าสุดของ make, cmake (เวอร์ชัน 3.0.2 หรือสูงกว่า), OpenSSL (รวมถึงไฟล์ส่วนหัว C), g++ หรือ clang ได้รับการติดตั้งบนระบบ ฉันไม่ต้องติดตั้งอะไรเลย ทุกอย่างมารวมกันทันที
-
สมมติว่าแหล่งที่มาถูกแตกไฟล์ลงในโฟลเดอร์
~/lite-client
. แยกจากกัน สร้างโฟลเดอร์ว่างสำหรับโปรเจ็กต์ที่ประกอบ (ตัวอย่างเช่น~/liteclient-build
) และจากนั้น (cd ~/liteclient-build
) เรียกคำสั่ง:cmake ~/lite-client cmake --build . --target test-lite-client
ในการสร้างล่ามภาษาห้าสำหรับสัญญาอัจฉริยะ (เพิ่มเติมเกี่ยวกับเรื่องนี้ด้านล่าง) เรายังเรียกcmake --build . --target fift
-
ดาวน์โหลดอันปัจจุบัน
ไฟล์การกำหนดค่า เพื่อเชื่อมต่อกับเครือข่ายทดสอบและวางไว้ในโฟลเดอร์ที่มีไคลเอนต์ที่ประกอบไว้ -
ทำคุณสามารถเริ่มต้นไคลเอ็นต์ได้:
./test-lite-client -C ton-lite-client-test1.config.json
หากทุกอย่างถูกต้อง คุณจะเห็นสิ่งนี้:
ดังที่เราเห็น มีคำสั่งไม่กี่คำสั่งที่ใช้ได้:
◦ 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 พยายามรวบรวมสัญญาอัจฉริยะ (เช่น สร้างกระเป๋าเงินทดสอบ) อัปโหลดไปยังเครือข่าย และลองโอนเงินระหว่างบัญชี
ภาษาที่ห้า
จากเอกสาร
เอกสารนี้ค่อนข้างใหญ่ 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
ตามที่ฉันได้อธิบายไว้ใน
ภายในเวิร์กเชนเดียว บัญชีจำนวนมากจะถูกจัดเก็บไว้ซึ่งมีตัวระบุ 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 และส่งคำขอไปยังพวกเขาได้ อย่างที่คุณเห็น ฟังก์ชั่นปัจจุบันก็เพียงพอที่จะสร้างกระเป๋าเงินที่เป็นมิตรมากขึ้นด้วยอินเทอร์เฟซแบบกราฟิก (อย่างไรก็ตาม คาดว่ามันจะพร้อมใช้งานในฐานะส่วนหนึ่งของ Messenger อยู่แล้ว)
เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถเข้าร่วมในการสำรวจได้
คุณสนใจที่จะอ่านบทความวิเคราะห์ TON, TVM, Fift ต่อไปหรือไม่?
-
ใช่ ฉันกำลังรอให้ชุดบทความพร้อมภาพรวมทั่วไปของ TON เสร็จสิ้น
-
ใช่แล้ว การอ่านเพิ่มเติมเกี่ยวกับภาษาที่ห้านั้นน่าสนใจ
-
ใช่ ฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ TON Virtual Machine และแอสเซมเบลอร์ของมัน
-
ไม่ ไม่มีสิ่งใดที่น่าสนใจเลย
ผู้ใช้ 39 คนโหวต ผู้ใช้ 12 รายงดออกเสียง
คุณคิดอย่างไรเกี่ยวกับแผนการของ Telegram ที่จะเปิดตัว TON
-
ฉันมีความหวังสูงสำหรับโครงการนี้
-
ฉันแค่ติดตามการพัฒนาด้วยความสนใจ
-
ฉันสงสัยและสงสัยในความสำเร็จของมัน
-
ฉันมีแนวโน้มที่จะพิจารณาว่าความคิดริเริ่มนี้เป็นความล้มเหลวและไม่จำเป็นสำหรับมวลชนในวงกว้าง
ผู้ใช้ 47 คนโหวต ผู้ใช้ 12 รายงดออกเสียง
ที่มา: will.com