هڪ سال اڳ کان وڌيڪ، اهو معلوم ٿيو ته ٽيليگرام ميسينجر جي منصوبن بابت پنهنجي غير مرڪزي نيٽ ورڪ کي ڇڏڻ لاء اوپن نيٽورڪ ٽيليگرام. ان کان پوء هڪ وڏي ٽيڪنيڪل دستاويز دستياب ٿي وئي، جيڪا مبينا طور تي نيڪولائي دوروف طرفان لکيل هئي ۽ مستقبل جي نيٽ ورڪ جي جوڙجڪ کي بيان ڪيو ويو آهي. انھن لاءِ جن ان کي ياد ڪيو، مان سفارش ڪريان ٿو ته توھان پڙھو پڙھو منھنجي ھن دستاويز جي ريٽيلنگ (حصو 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 - ٽي وي ايم جي ٽيڪنيڪل وضاحت (TON ورچوئل مشين، TON ورچوئل مشين)؛
◦ tblkch.pdf - TON blockchain جي ٽيڪنيڪل وضاحت؛
◦ fifthbase.pdf - نئين ففٽ ٻولي جو بيان، TON ۾ سمارٽ معاهدو ٺاهڻ لاءِ ٺهيل آهي.
مان ورجائي ٿو، صفحي جي ڪا به سرڪاري تصديق نه هئي ۽ اهي سڀئي دستاويز ٽيليگرام کان، پر انهن مواد جي مقدار انهن کي ڪافي قابل اعتبار بڻائي ٿو. شايع ٿيل ڪلائنٽ لانچ ڪريو پنهنجي خطري تي.
ٽيسٽ ڪلائنٽ جي تعمير
پهرين، اچو ته هڪ ٽيسٽ ڪلائنٽ ٺاهڻ ۽ هلائڻ جي ڪوشش ڪريون - خوش قسمتي سان، ريڊيو هن سادي عمل کي تفصيل سان بيان ڪري ٿو. مان ائين ڪندس macOS 10.14.5 استعمال ڪندي مثال طور؛ مان ٻين سسٽم تي تعمير جي ڪاميابي جي ضمانت نه ٿو ڏئي سگهان.
ڊائون لوڊ ڪريو ۽ پيڪ ڪريو ذريعو آرڪائيو. اهو ضروري آهي ته جديد نسخو ڊائون لوڊ ڪريو جيئن ته هن اسٽيج تي پسمانده مطابقت جي ضمانت نه آهي.
پڪ ڪريو ته make، cmake (ورجن 3.0.2 يا وڌيڪ)، OpenSSL (بشمول C هيڊر فائلون)، g++ يا ڪلانگ جا جديد ورجن سسٽم تي انسٽال ٿيل آهن. مون کي ڪا به شيءِ انسٽال ڪرڻ جي ضرورت نه هئي، هر شيءِ گڏ ٿي آئي.
دستاويز ڪافي وسيع آهي، 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
(ليڪ ”ٺيڪ“ مترجم طرفان ڇپيل آهي جڏهن اها موجوده لائن کي انٽرايڪٽو ان پٽ موڊ ۾ پروسيسنگ مڪمل ڪري ٿي)
جيئن مون بيان ڪيو آهي TON جائزو, هي نيٽ ورڪ هڪ کان وڌيڪ blockchain تي مشتمل آهي - اتي هڪ عام آهي، جنهن کي سڏيو ويندو آهي. "ماسٽر زنجير"، گڏوگڏ اضافي "ڪم جي زنجير" جو هڪ صوابديدي نمبر، 32-bit نمبر جي سڃاڻپ. ماسٽر چين کي -1 جي سڃاڻپ ڪندڙ آهي؛ ان کان علاوه، 0 جي سڃاڻپ ڪندڙ سان گڏ هڪ "بنيادي" ورڪ چين پڻ استعمال ڪري سگهجي ٿو. هر ورڪ چين جي پنهنجي ترتيب ٿي سگهي ٿي. اندروني طور تي، هر ڪم جي چين ۾ ورهايل آهي شارڊ چين، پر اهو هڪ عمل درآمد تفصيل آهي جنهن کي ذهن ۾ رکڻ جي ضرورت ناهي.
ھڪڙي ڪم جي چين اندر، ڪيترائي اڪائونٽ محفوظ ڪيا ويا آھن جن کي انھن جا پنھنجو account_id سڃاڻپ ڪندڙ آھن. ماسٽر زنجير ۽ صفر ڪم جي زنجير لاء، اهي 256 بٽ ڊگهو آهن. اهڙيء طرح، اڪائونٽ جي سڃاڻپ ڪندڙ لکيو ويو آهي، مثال طور، هن طرح:
[ 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، جيڪڏهن توهان مٿي ڏنل هدايتن تي عمل ڪيو). مون مٿي ڏنل مواد کي ففٽ تي ڪوڊ جي مثال طور بيان ڪيو.
اهو آهي <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)
هن جو مطلب آهي ته پرس ID سان -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“ لکو.
ڪلائنٽ استعمال ڪندي، اسان ان کي نيٽ ورڪ تي اپلوڊ ڪريون ٿا:
> 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>).