مضمون انهن لاءِ ڪارآمد ثابت ٿيندو جيڪي TON ۾ پنهنجو پهريون سمارٽ معاهدو ڪرڻ چاهين ٿا، پر خبر ناهي ڪٿي شروع ڪجي.
لاٽري کي مثال طور استعمال ڪندي، مان ماحول کي انسٽال ڪرڻ کان وٺي سمارٽ ڪانٽريڪٽ شايع ڪرڻ، ان سان رابطو ڪرڻ، ۽ ڊيٽا حاصل ڪرڻ ۽ شايع ڪرڻ لاءِ ويب سائيٽ لکڻ تائين ويندس.
مقابلي ۾ شرڪت بابت
گذريل آڪٽوبر، ٽيليگرام اعلان ڪيو هڪ بلاڪچين مقابلي سان نئين ٻولين سان Fift и FunC. اهو ضروري هو ته پنجن تجويز ڪيل سمارٽ معاهدن مان ڪنهن به لکڻ مان چونڊيو وڃي. مون سوچيو ته اهو سٺو لڳندو ته ڪجهه مختلف ڪرڻ، ٻولي سکي ۽ ڪجهه ٺاهيو، جيتوڻيڪ مستقبل ۾ مون کي ٻيو ڪجهه نه لکڻو پوي. ان سان گڏ، موضوع مسلسل لبن تي آهي.
اهو چوڻ جي لائق آهي ته مون وٽ سمارٽ معاهدن کي ترقي ڪرڻ جو ڪو تجربو نه هو.
مون حصو وٺڻ جي رٿابندي ڪئي هئي آخر تائين جيستائين مان ڪري سگهان ها ۽ پوءِ هڪ جائزو وٺڻ وارو مضمون لکان، پر مان پهرين ئي ناڪام ٿي ويس. آء هڪ پرس لکيو گهڻن دستخط سان FunC ۽ اهو عام طور تي ڪم ڪيو. مون ان کي بنياد طور ورتو سوليڊٽي تي سمارٽ معاهدو.
ان وقت، مون سوچيو ته اهو ضرور ڪافي آهي ته گهٽ ۾ گهٽ ڪجهه انعام واري جڳهه وٺڻ لاء. نتيجي طور، 40 مان 60 شرڪت ڪندڙ انعام ماڻيا ويا ۽ مان انهن ۾ شامل نه هو. عام طور تي، ان ۾ ڪجھ به غلط ناهي، پر هڪ شيء مون کي پريشان ڪيو. نتيجن جي اعلان وقت، منهنجي ڪانٽريڪٽ جي ٽيسٽ جو جائزو نه ورتو ويو هو، مون چيٽ ۾ شرڪت ڪندڙن کان پڇيو ته ڇا ڪو ٻيو آهي جيڪو اهو نه هو، اتي ڪو به نه هو.
بظاهر منهنجي پيغامن تي ڌيان ڏيندي، ٻن ڏينهن کان پوءِ ججن هڪ تبصرو شايع ڪيو ۽ مون کي اڃا تائين سمجهه ۾ نه ٿو اچي ته ڇا انهن ججن دوران غلطيءَ سان منهنجو سمارٽ ڪانٽريڪٽ مس ڪري ڇڏيو يا بس اهو سوچيو ته اهو ايترو خراب آهي جو ان تي تبصري جي ضرورت ئي نه هئي. مون صفحي تي هڪ سوال پڇيو، پر جواب نه مليو. جيتوڻيڪ اهو ڪو راز ناهي ته ڪير فيصلو ڪيو، مون ان کي غير ضروري سمجهيو ته ذاتي پيغام لکڻ لاء.
سمجھڻ ۾ گهڻو وقت گذري ويو، تنهنڪري هڪ مضمون لکڻ جو فيصلو ڪيو ويو. جيئن ته اڃا تائين تمام گهڻي معلومات نه آهي، مضمون هر ڪنهن جي دلچسپي لاء وقت بچائڻ ۾ مدد ڪندو.
TON ۾ سمارٽ معاهدي جو تصور
ان کان اڳ جو توھان ڪجھھ لکو، توھان کي اھو معلوم ڪرڻو پوندو ته ھن شيءِ کي ڪھڙي پاسي ڏانھن وڃڻو آھي. تنهن ڪري، هاڻي مان توهان کي ٻڌايان ٿو ته سسٽم ڪهڙي حصن تي مشتمل آهي. وڌيڪ واضح طور تي، توهان کي ڄاڻڻ جي ضرورت آهي ته گهٽ ۾ گهٽ ڪجهه قسم جي ڪم ڪندڙ معاهدي کي لکڻ لاء.
اسان هڪ سمارٽ معاهدو لکڻ ۽ ڪم ڪرڻ تي ڌيان ڏينداسين TON Virtual Machine (TVM), Fift и FunC، تنهن ڪري آرٽيڪل وڌيڪ آهي هڪ باقاعده پروگرام جي ترقي جي وضاحت وانگر. اسان ان تي نه رهنداسين ته پليٽ فارم پاڻ هتي ڪيئن ڪم ڪري ٿو.
عام طور تي اهو ڪيئن ڪم ڪري ٿو TVM ۽ ٻولي Fift اتي سٺو سرڪاري دستاويز آهي. مقابلي ۾ حصو وٺڻ دوران ۽ هاڻ موجوده معاهدو لکڻ وقت، مان اڪثر هن ڏانهن رخ ڪندو هوس.
مکيه ٻولي جنهن ۾ سمارٽ معاهدو لکيل آهن FunC. هن وقت ان تي ڪو به دستاويز موجود ناهي، تنهن ڪري ڪجهه لکڻ لاءِ، توهان کي پڙهڻ جي ضرورت آهي سمارٽ معاهدن جا مثال سرڪاري مخزن مان ۽ خود ٻوليءَ تي عمل درآمد، ان سان گڏ توهان گذريل ٻن کان سمارٽ معاهدن جا مثال ڏسي سگهو ٿا. مقابلا. مضمون جي آخر ۾ لنڪس.
مرتب ڪيل سمارٽ معاهدو شايع ٿيڻ باقي آهي. هن کي ڪرڻ لاء توهان کي هڪ فنڪشن لکڻ جي ضرورت آهي Fift، جيڪو سمارٽ ڪانٽريڪٽ ڪوڊ ۽ ان پٽ جي طور تي ڪجهه ٻيا پيٽرول کڻندو، ۽ آئوٽ پُٽ ايڪسٽينشن سان گڏ فائيل هوندو. .boc (جنهن جو مطلب آهي "سيلز جو ٿلهو")، ۽، ان تي منحصر آهي ته اسان ان کي ڪيئن لکون ٿا، هڪ خانگي ڪي ۽ پتو، جيڪو سمارٽ ڪانٽريڪٽ ڪوڊ جي بنياد تي ٺاهيل آهي. توهان اڳ ۾ ئي هڪ سمارٽ معاهدي جي ايڊريس تي گرام موڪلي سگهو ٿا جيڪو اڃا تائين شايع نه ڪيو ويو آهي.
حاصل ڪيل TON ۾ سمارٽ معاهدو شايع ڪرڻ لاء .boc فائل کي هڪ هلڪو ڪلائنٽ استعمال ڪندي بلاڪچين ڏانهن موڪلڻ جي ضرورت پوندي (هيٺ ڏنل وڌيڪ). پر شايع ڪرڻ کان پهريان، توهان کي ٺاهيل ايڊريس تي گرام منتقل ڪرڻ جي ضرورت آهي، ٻي صورت ۾ سمارٽ معاهدو شايع نه ڪيو ويندو. اشاعت کان پوء، توهان سمارٽ معاهدي سان رابطو ڪري سگهو ٿا ان کي ٻاهران پيغام موڪلڻ سان (مثال طور، هڪ هلڪو ڪلائنٽ استعمال ڪندي) يا اندر کان (مثال طور، هڪ سمارٽ معاهدو ٻيو پيغام موڪلي ٿو TON اندر).
هڪ دفعو اسان سمجهون ٿا ته ڪوڊ ڪيئن شايع ڪيو ويو آهي، اهو آسان ٿي ويندو. اسان تقريبن ڄاڻون ٿا ته اسان ڇا لکڻ چاهيون ٿا ۽ اسان جو پروگرام ڪيئن ڪم ڪندو. ۽ لکڻ دوران، اسان ڏسون ٿا ته اهو اڳ ۾ ئي موجود سمارٽ معاهدن ۾ ڪيئن لاڳو ڪيو ويو آهي، يا اسان ان تي عمل ڪرڻ واري ڪوڊ کي ڏسون ٿا. Fift и FunC سرڪاري مخزن ۾، يا سرڪاري دستاويزن ۾ ڏسو.
گهڻو ڪري مون ٽيليگرام چيٽ ۾ ڪي لفظ ڳوليا جتي مقابلي ۾ شرڪت ڪندڙ ۽ ٽيليگرام جا ملازم گڏ ٿيا، ۽ ائين ٿيو ته مقابلي دوران سڀ اتي گڏ ٿيا ۽ ففٽ ۽ فن سي تي بحث ڪرڻ لڳا. مضمون جي آخر ۾ لنڪ.
اهو وقت آهي نظريي کان مشق ڏانهن منتقل ڪرڻ جو.
TON سان ڪم ڪرڻ لاء ماحول تيار ڪرڻ
مون اهو سڀ ڪجهه ڪيو جيڪو MacOS تي آرٽيڪل ۾ بيان ڪيو ويندو ۽ ڊڪر تي صاف Ubuntu 18.04 LTS ۾ ان کي ٻه ڀيرا چيڪ ڪيو.
پهرين شيء توهان کي ڪرڻو آهي ڊائون لوڊ ۽ انسٽال ڪريو lite-client جنهن سان توهان TON ڏانهن درخواستون موڪلي سگهو ٿا.
سرڪاري ويب سائيٽ تي ڏنل هدايتون انسٽاليشن جي عمل کي ڪافي تفصيل ۽ واضح طور تي بيان ڪري ٿو ۽ ڪجهه تفصيلن کي ختم ڪري ٿو. هتي اسان هدايتن تي عمل ڪندا آهيون، رستي ۾ غائب انحصار کي نصب ڪرڻ. مون هر پروجيڪٽ کي پاڻ مرتب نه ڪيو ۽ سرڪاري Ubuntu مخزن مان انسٽال ڪيو (MacOS تي مون استعمال ڪيو brew).
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json
جيڪڏهن تعمير ڪامياب ٿي وئي، پوء لانچ کان پوء توهان نوڊ ڏانهن روشني ڪلائنٽ جي ڪنيڪشن جو لاگ ان ڏسندا.
[ 1][t 2][1582054822.963129282][lite-client.h:201][!testnode] conn ready
[ 2][t 2][1582054823.085654020][lite-client.cpp:277][!testnode] server version is 1.1, capabilities 7
[ 3][t 2][1582054823.085725069][lite-client.cpp:286][!testnode] server time is 1582054823 (delta 0)
...
توهان حڪم هلائي سگهو ٿا help ۽ ڏسو ته ڪهڙا حڪم موجود آهن.
help
اچو ته انهن حڪمن کي لسٽ ڪريون جيڪي اسان هن آرٽيڪل ۾ استعمال ڪنداسين.
list of available commands:
last Get last block and state info from server
sendfile <filename> Load a serialized message from <filename> and send it to server
getaccount <addr> [<block-id-ext>] Loads the most recent state of specified account; <addr> is in [<workchain>:]<hex-or-base64-addr> format
runmethod <addr> [<block-id-ext>] <method-id> <params>... Runs GET method <method-id> of account <addr> with specified parameters
last получает последний созданный блок с сервера.
sendfile <filename> отправляет в TON файл с сообщением, именно с помощью этой команды публикуется смарт-контракт и запрсосы к нему.
getaccount <addr> загружает текущее состояние смарт-контракта с указанным адресом.
runmethod <addr> [<block-id-ext>] <method-id> <params> запускает get-методы смартконтракта.
ان کان علاوه، اها لاٽري نه آهي جنهن ۾ توهان کي ٽڪيٽ خريد ڪرڻ جي ضرورت آهي ۽ هڪ ڪلاڪ، ڏينهن يا مهينو انتظار ڪرڻ جي ضرورت آهي، پر هڪ فوري طور تي جنهن ۾ صارف معاهدي جي ايڊريس تي منتقل ڪري ٿو. N گرام، ۽ ان کي فوري طور تي واپس حاصل ڪري ٿو 2 * N گرام يا نقصان. اسان اٽڪل 40٪ کٽڻ جو امڪان ڪنداسين. جيڪڏهن ادائگي لاءِ ڪافي گرام نه آهن، ته پوءِ اسان ٽرانزيڪشن کي ٽاپ اپ سمجھنداسين.
ان کان علاوه، اهو ضروري آهي ته شرطن کي حقيقي وقت ۽ هڪ آسان شڪل ۾ ڏسي سگهجي ٿو، انهي ڪري ته صارف فوري طور تي سمجهي سگهي ٿو ته هو کٽيو يا وڃائي ڇڏيو. تنهن ڪري، توهان کي هڪ ويب سائيٽ ٺاهڻ جي ضرورت آهي جيڪا ڏيکاريندو شرط ۽ نتيجا سڌو سنئون TON کان.
هڪ سمارٽ معاهدو لکڻ
سهولت لاءِ، مون FunC لاءِ ڪوڊ کي نمايان ڪيو آهي، پلگ ان کي ڳولي سگھجي ٿو ۽ انسٽال ڪري سگھجي ٿو Visual Studio Code سرچ ۾، جيڪڏھن توھان اوچتو ڪجھ شامل ڪرڻ چاھيو ٿا، مون پلگ ان کي عام طور تي دستياب ڪيو آھي. انهي سان گڏ، ڪنهن اڳ ۾ Fif سان ڪم ڪرڻ لاء هڪ پلگ ان ٺاهيو، توهان پڻ ان کي انسٽال ڪري سگهو ٿا ۽ ان کي VSC ۾ ڳولي سگهو ٿا.
اچو ته فوري طور تي هڪ مخزن ٺاهيون جتي اسان وچولي نتيجن کي انجام ڏينداسين.
اسان جي زندگي کي آسان بڻائڻ لاءِ، اسان هڪ سمارٽ معاهدو لکنداسين ۽ ان کي مقامي طور تي آزمائينداسين جيستائين اهو تيار نه ٿئي. صرف ان کان پوء اسان ان کي TON ۾ شايع ڪنداسين.
سمارٽ معاهدي ۾ ٻه بيروني طريقا آهن جن کي رسائي سگهجي ٿو. پهريون، recv_external() هن فنڪشن تي عمل ڪيو ويندو آهي جڏهن معاهدي جي درخواست ٻاهرئين دنيا کان اچي ٿي، يعني TON کان نه، مثال طور، جڏهن اسان پاڻ هڪ پيغام ٺاهي ۽ ان کي لائيٽ ڪلائنٽ ذريعي موڪليو. ٻيون، recv_internal() اهو آهي جڏهن، TON جي اندر اندر، ڪو به معاهدو اسان جي حوالي ڪري ٿو. ٻنهي صورتن ۾، توهان فنڪشن ڏانهن پيراگراف پاس ڪري سگهو ٿا.
اچو ته هڪ سادي مثال سان شروع ڪريون جيڪو شايع ٿيڻ جي صورت ۾ ڪم ڪندو، پر ان ۾ ڪو به فنڪشنل لوڊ نه آهي.
TVM cell slice يا slice هي موجوده هڪ جو حصو آهي cell ان کي پارس ڪرڻ لاءِ استعمال ڪيو ويندو آهي، اهو بعد ۾ واضح ٿيندو. اسان لاء بنيادي شيء اها آهي ته اسان منتقل ڪري سگهون ٿا slice ۽ پيغام جي قسم تي منحصر ڪري، ڊيٽا کي پروسيس ڪريو recv_external() يا recv_internal().
impure - هڪ لفظ جيڪو ظاهر ڪري ٿو ته فنڪشن سمارٽ معاهدي ڊيٽا کي تبديل ڪري ٿو.
В c7 اسان ان حوالي سان رڪارڊ ڪريون ٿا، يعني ڊيٽا جنهن سان TVM (يا نيٽ ورڪ اسٽيٽ) شروع ڪئي ويندي. جيتوڻيڪ مقابلي دوران، هڪ ڊولپر ڏيکاريو ته ڪيئن ٺاهيو c7 ۽ مون نقل ڪيو. هن آرٽيڪل ۾ اسان کي شايد تبديل ڪرڻ جي ضرورت آهي rand_seed جيئن ته هڪ بي ترتيب نمبر جي نسل ان تي منحصر آهي ۽ جيڪڏهن تبديل نه ڪيو وڃي، ساڳيو نمبر هر وقت واپس ڪيو ويندو.
recv_internal и recv_external 0 ۽ -1 سان constants سمارٽ ڪانٽريڪٽ ۾ لاڳاپيل ڪمن کي ڪال ڪرڻ جا ذميوار هوندا.
هاڻي اسان تيار آهيون اسان جي خالي سمارٽ معاهدي لاءِ پهرين ٽيسٽ ٺاهڻ لاءِ. وضاحت لاءِ، ھاڻي اسان سڀني ٽيسٽن کي ساڳي فائل ۾ شامل ڪنداسين lottery-test-suite.fif.
اچو ته هڪ متغير ٺاهي storage ۽ ان ۾ هڪ خالي لکو cell, هي هوندو سمارٽ ڪانٽريڪٽ اسٽوريج.
message اهو پيغام آهي ته اسان ٻاهران سمارٽ رابطي ڏانهن منتقل ڪنداسين. اسان به ان کي هاڻي لاءِ خالي ڪري ڇڏينداسين.
هاڻي اسان کي ڪارڪردگي شامل ڪرڻ جي ضرورت آهي. پهرين اچو ته انهن پيغامن سان ڊيل ڪريون جيڪي ٻاهرين دنيا کان ايندا آهن recv_external()
ڊولپر پاڻ کي پيغام جي شڪل چونڊيندو آهي جيڪو معاهدو قبول ڪري سگهي ٿو.
پر عام طور تي
سڀ کان پهريان، اسان چاهيون ٿا ته اسان جي معاهدي کي ٻاهرين دنيا کان بچائڻ ۽ ان کي ٺاهيو وڃي ته صرف معاهدي جو مالڪ ان کي ٻاهرين پيغام موڪلي سگهي ٿو.
ٻيو، جڏهن اسان TON ڏانهن هڪ صحيح پيغام موڪليندا آهيون، اسان چاهيون ٿا ته اهو بلڪل هڪ ڀيرو ٿئي ۽ جڏهن اسان ساڳيو پيغام ٻيهر موڪليو، سمارٽ معاهدو ان کي رد ڪري ٿو.
تنهنڪري تقريبن هر معاهدو انهن ٻن مسئلن کي حل ڪري ٿو، ڇو ته اسان جو معاهدو خارجي پيغامن کي قبول ڪري ٿو، اسان کي ان جو پڻ خيال رکڻو پوندو.
اسان ان کي ريورس آرڊر ۾ ڪنداسين. پهرين، اچو ته مسئلي کي ورجائي سان حل ڪريو؛ جيڪڏهن معاهدو اڳ ۾ ئي اهڙو پيغام ملي چڪو آهي ۽ ان تي عمل ڪيو ويو آهي، اهو ٻيو ڀيرو ان تي عمل نه ڪندو. ۽ پوءِ اسان اهو مسئلو حل ڪنداسين ته جيئن صرف ماڻهن جو هڪ مخصوص حلقو سمارٽ معاهدي تي پيغام موڪلي سگهي.
نقلي پيغامن سان مسئلو حل ڪرڻ جا مختلف طريقا آهن. هتي اهو ڪيئن ڪنداسين. سمارٽ ڪانٽريڪٽ ۾، اسان وصول ڪيل پيغامن جي ڪائونٽر کي شروعاتي قيمت 0 سان شروع ڪريون ٿا. سمارٽ ڪانٽريڪٽ جي هر پيغام ۾، اسان موجوده ڪائونٽر ويل شامل ڪنداسين. جيڪڏهن پيغام ۾ ڪائونٽر ويليو سمارٽ ڪانٽريڪٽ جي قيمت سان نه ملندو آهي، ته پوءِ اسان ان تي عمل نه ڪندا آهيون؛ جيڪڏهن اهو ٿئي ٿو، ته پوءِ اسان ان تي عمل ڪريون ٿا ۽ سمارٽ ڪانٽريڪٽ ۾ ڪائونٽر کي 1 تائين وڌايو.
اچو ته واپس وڃو lottery-test-suite.fif ۽ ان ۾ ٻيو امتحان شامل ڪريو. جيڪڏهن اسان هڪ غلط نمبر موڪليو، ڪوڊ کي هڪ استثنا اڇلائڻ گهرجي. مثال طور، معاهدي جي ڊيٽا کي ذخيرو ڪرڻ ڏيو 166، ۽ اسين موڪلينداسين 165.
<b 166 32 u, b> storage !
<b 165 32 u, b> message !
message @
recv_external
code
storage @
c7
runvmctx
drop
exit_code !
."Exit code " exit_code @ . cr
exit_code @ 33 - abort"Test #2 Not passed"
اچو ته لانچ ڪريون.
~/TON/build/crypto/fift -s lottery-test-suite.fif
۽ اسان ڏسنداسين ته امتحان هڪ غلطي سان جاري آهي.
[ 1][t 0][1582283084.210902214][words.cpp:3046] lottery-test-suite.fif:67: abort": Test #2 Not passed
[ 1][t 0][1582283084.210941076][fift-main.cpp:196] Error interpreting file `lottery-test-suite.fif`: error interpreting included file `lottery-test-suite.fif` : lottery-test-suite.fif:67: abort": Test #2 Not passed
هن مرحلي تي lottery-test-suite.fif وانگر ڏسڻ گهرجي لنڪ.
هاڻي اچو ته جوابي منطق کي سمارٽ معاهدي ۾ شامل ڪريون lottery-code.fc.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
if (slice_empty?(in_msg)) {
return ();
}
int msg_seqno = in_msg~load_uint(32);
var ds = begin_parse(get_data());
int stored_seqno = ds~load_uint(32);
throw_unless(33, msg_seqno == stored_seqno);
}
В slice in_msg اسان جو پيغام ڪوڙو آهي.
پهرين شيء جيڪو اسان ڪندا آهيون اهو چيڪ ڪيو آهي ته پيغام ۾ ڊيٽا شامل آهي، جيڪڏهن نه، پوء اسان صرف ٻاهر نڪرندا آهيون.
اڳتي اسان پيغام کي پارس ڪريون ٿا. in_msg~load_uint(32) لوڊ ڪري ٿو نمبر 165، 32-bit unsigned int منتقل ٿيل پيغام مان.
نتيجو ڪوڊ کي نقل ڪريو lottery-test-suite.fif، آخري لائين کي تبديل ڪرڻ نه وساريو.
اسان چيڪ ڪريون ٿا ته امتحان پاس ڪري ٿو:
~/TON/build/crypto/fift -s lottery-test-suite.fif
ھتي صحيح آھي توهان موجوده نتيجن سان لاڳاپيل عزم ڏسي سگهو ٿا.
ياد رهي ته سمارٽ ڪانٽريڪٽ جي مرتب ڪيل ڪوڊ کي ٽيسٽن سان گڏ فائل ۾ مسلسل نقل ڪرڻ مشڪل آهي، تنهن ڪري اسان هڪ اسڪرپٽ لکنداسين جيڪو ڪوڊ اسان جي لاءِ مستقل ۾ لکندو، ۽ اسان صرف ترتيب ڏنل ڪوڊ کي اسان جي ٽيسٽن سان ڳنڍينداسين. "include".
هاڻي، صرف اسان جي اسڪرپٽ کي هلائڻ لاء معاهدو گڏ ڪرڻ لاء. پر ان کان علاوه، اسان کي ان کي مسلسل لکڻ جي ضرورت آهي code. تنهنڪري اسان هڪ نئين فائل ٺاهينداسين lotter-compiled-for-test.fif، جنهن کي اسان فائل ۾ شامل ڪنداسين lottery-test-suite.fif.
اچو ته اسڪرپٽ ڪوڊ شامل ڪريون sh ۾، جيڪو آساني سان گڏ ڪيل فائل کي نقل ڪندو lotter-compiled-for-test.fif ۽ ان ۾ آخري لائين تبديل ڪريو.
# copy and change for test
cp lottery-compiled.fif lottery-compiled-for-test.fif
sed '$d' lottery-compiled-for-test.fif > test.fif
rm lottery-compiled-for-test.fif
mv test.fif lottery-compiled-for-test.fif
echo -n "}END>s constant code" >> lottery-compiled-for-test.fif
هاڻي، چيڪ ڪرڻ لاء، اچو ته نتيجو اسڪرپٽ کي هلائڻ ۽ هڪ فائل ٺاهي ويندي lottery-compiled-for-test.fif، جنهن کي اسان پنهنجي حصي ۾ شامل ڪنداسين lottery-test-suite.fif
В lottery-test-suite.fif معاهدو ڪوڊ ختم ڪريو ۽ لائن شامل ڪريو "lottery-compiled-for-test.fif" include.
اسان جاچ ڪريون ٿا ته اهي پاس ٿين ٿا.
~/TON/build/crypto/fift -s lottery-test-suite.fif
چڱو، ھاڻي ٽيسٽ جي لانچ کي خودڪار ڪرڻ لاءِ، اچو ته ھڪ فائل ٺاھيون test.sh، جيڪو پهريون عمل ڪندو build.sh، ۽ پوءِ ٽيسٽ ڪريو.
هاڻي اچو ته سوچيو ته ڪهڙي ڊيٽا جي جوڙجڪ ۽ ڪهڙي ڊيٽا کي سمارٽ معاهدي ۾ محفوظ ڪرڻ جي ضرورت آهي.
مان هر شي کي بيان ڪندس جيڪو اسان ذخيرو ڪندا آهيون.
`seqno` 32-х битное целое положительное число счетчик.
`pubkey` 256-ти битное целое положительное число публичный ключ, с помощью которого, мы будем проверять подпись отправленного извне сообщения, о чем ниже.
`order_seqno` 32-х битное целое положительное число хранит счетчик количества ставок.
`number_of_wins` 32-х битное целое положительное число хранит количество побед.
`incoming_amount` тип данных Gram (первые 4 бита отвечает за длину), хранит общее количество грамов, которые были отправлены на контртакт.
`outgoing_amount` общее количество грамов, которое было отправлено победителям.
`owner_wc` номер воркчейна, 32-х битное (в некоторых местах написано, что 8-ми битное) целое число. В данный момент всего два -1 и 0.
`owner_account_id` 256-ти битное целое положительное число, адрес контракта в текущем воркчейне.
`orders` переменная типа словарь, хранит последние двадцать ставок.
اڳيون توهان کي ٻه فنڪشن لکڻ جي ضرورت آهي. اچو ته پهرين کي سڏين pack_state()، جيڪو سمارٽ ڪانٽريڪٽ اسٽوريج ۾ ايندڙ بچت لاءِ ڊيٽا کي پيڪ ڪندو. اچو ته ٻئي کي سڏين unpack_state() اسٽوريج مان ڊيٽا پڙهي ۽ واپس ڪندو.
_ pack_state(int seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) inline_ref {
return begin_cell()
.store_uint(seqno, 32)
.store_uint(pubkey, 256)
.store_uint(order_seqno, 32)
.store_uint(number_of_wins, 32)
.store_grams(incoming_amount)
.store_grams(outgoing_amount)
.store_int(owner_wc, 32)
.store_uint(owner_account_id, 256)
.store_dict(orders)
.end_cell();
}
_ unpack_state() inline_ref {
var ds = begin_parse(get_data());
var unpacked = (ds~load_uint(32), ds~load_uint(256), ds~load_uint(32), ds~load_uint(32), ds~load_grams(), ds~load_grams(), ds~load_int(32), ds~load_uint(256), ds~load_dict());
ds.end_parse();
return unpacked;
}
اسان انهن ٻن ڪمن کي سمارٽ معاهدي جي شروعات ۾ شامل ڪندا آهيون. اهو ڪم ڪندو هن وانگر وچولي نتيجو.
ڊيٽا کي بچائڻ لاء توهان کي بلٽ ان فنڪشن کي سڏڻ جي ضرورت پوندي set_data() ۽ ان مان ڊيٽا لکندو pack_state() سمارٽ معاهدي جي اسٽوريج ۾.
اسان کي جانچڻ جي ضرورت آهي ته پيغام ٻاهران اچڻ واري معاهدي جي مالڪ طرفان دستخط ٿيل آهي (يا ٻيو صارف جنهن کي نجي ڪني تائين رسائي آهي).
جڏهن اسان هڪ سمارٽ معاهدو شايع ڪندا آهيون، اسان ان کي شروع ڪري سگھون ٿا ان ڊيٽا سان جيڪو اسان کي اسٽوريج ۾ گهربل هجي، جيڪو مستقبل جي استعمال لاءِ محفوظ ڪيو ويندو. اسان اتي پبلڪ ڪيچ کي رڪارڊ ڪنداسين ته جيئن اسان تصديق ڪري سگهون ته ايندڙ پيغام لاڳاپيل نجي چيڪ سان سائن ڪيو ويو.
اڳتي وڌڻ کان اڳ، اچو ته ھڪ خانگي ڪيچ ٺاھيون ۽ ان کي لکون test/keys/owner.pk. هن کي ڪرڻ لاء، اچو ته انٽرايڪٽو موڊ ۾ ففٽ لانچ ڪريو ۽ چار حڪمن تي عمل ڪريو.
`newkeypair` генерация публичного и приватного ключа и запись их в стек.
`drop` удаления из стека верхнего элемента (в данном случае публичный ключ)
`.s` просто посмотреть что лежит в стеке в данный момент
`"owner.pk" B>file` запись приватного ключа в файл с именем `owner.pk`.
`bye` завершает работу с Fift.
mkdir test/keys
cd test/keys
~/TON/build/crypto/fift -i
newkeypair
ok
.s
BYTES:128DB222CEB6CF5722021C3F21D4DF391CE6D5F70C874097E28D06FCE9FD6917 BYTES:DD0A81AAF5C07AAAA0C7772BB274E494E93BB0123AA1B29ECE7D42AE45184128
drop
ok
"owner.pk" B>file
ok
bye
اسان موجوده فولڊر ۾ فائل ڏسون ٿا owner.pk.
اسان اسٽيڪ مان عوامي ڪني کي هٽائي ڇڏيو ۽ جڏهن ضرورت هجي ته اسان ان کي نجي مان حاصل ڪري سگهون ٿا.
هاڻي اسان کي هڪ دستخط جي تصديق لکڻ جي ضرورت آهي. اچو ته امتحان سان شروع ڪريون. پهرين اسان فنڪشن استعمال ڪندي فائل مان پرائيويٽ ڪيئي پڙهون ٿا file>B ۽ ان کي متغير ڏانهن لکو owner_private_key، پوءِ فنڪشن استعمال ڪندي priv>pub پرائيويٽ ڪيئي کي پبلڪ ڪي ۾ تبديل ڪريو ۽ نتيجو لکو owner_public_key.
هن وانگر ٽيسٽ سان فائل هن اسٽيج تي هن وانگر ڏسڻ گهرجي.
اچو ته ٽيسٽ هلون ۽ اهو ناڪام ٿي ويندو، تنهنڪري اسان سمارٽ معاهدي کي تبديل ڪنداسين ته جيئن اهو هن فارميٽ جا پيغام وصول ڪري ۽ دستخط جي تصديق ڪري سگهي.
پهرين، اسان پيغام مان دستخط جي 512 بٽس کي ڳڻيو ۽ ان کي هڪ متغير ڏانهن لکون، پوء اسين 32 بٽ ڪائونٽر ويريبل کي ڳڻيو.
جيئن ته اسان وٽ سمارٽ ڪانٽريڪٽ اسٽوريج مان ڊيٽا پڙهڻ لاءِ هڪ فنڪشن آهي، اسان ان کي استعمال ڪنداسين.
اڳيون اسٽوريج سان منتقل ٿيل ڪائونٽر کي چيڪ ڪري رهيو آهي ۽ دستخط چيڪ ڪري رهيو آهي. جيڪڏهن ڪا شيءِ نه ملندي آهي، ته پوءِ اسان مناسب ڪوڊ سان هڪ استثنا اڇلائينداسين.
var signature = in_msg~load_bits(512);
var message = in_msg;
int msg_seqno = message~load_uint(32);
(int stored_seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) = unpack_state();
throw_unless(33, msg_seqno == stored_seqno);
throw_unless(34, check_signature(slice_hash(in_msg), signature, pubkey));
اچو ته ٽيسٽ هلون ۽ ڏسون ته ٻيو امتحان ناڪام ٿئي ٿو. ٻن سببن جي ڪري، پيغام ۾ ڪافي بٽس نه آهن ۽ اسٽوريج ۾ ڪافي بٽ نه آهن، تنهنڪري ڪوڊ تبصرو ڪرڻ وقت خراب ٿي ويندو آهي. اسان کي پيغام ۾ هڪ دستخط شامل ڪرڻ جي ضرورت آهي جيڪا اسان موڪلي رهيا آهيون ۽ آخري ٽيسٽ کان اسٽوريج کي نقل ڪريو.
ٻئين ٽيسٽ ۾، اسان هڪ پيغام جي دستخط شامل ڪنداسين ۽ سمارٽ معاهدي اسٽوريج کي تبديل ڪنداسين. هن وانگر ٽيسٽ سان فائل هن وقت ڏسڻ ۾ اچي ٿي.
اچو ته چوٿون ٽيسٽ لکون، جنهن ۾ اسان ڪنهن ٻئي جي پرائيويٽ ڪيئي سان دستخط ٿيل پيغام موڪلينداسين. اچو ته هڪ ٻي پرائيويٽ ڪنجي ٺاهي ۽ ان کي فائل ۾ محفوظ ڪريون not-owner.pk. اسان پيغام کي هن خانگي چاٻي سان سائن ڪنداسين. اچو ته ٽيسٽون هلون ۽ پڪ ڪريو ته سڀئي ٽيسٽ پاس ڪريون. انجام هن وقت.
هاڻي اسان آخرڪار سمارٽ معاهدي جي منطق کي لاڳو ڪرڻ تي اڳتي وڌي سگهون ٿا.
В recv_external() اسان ٻن قسمن جا پيغام قبول ڪنداسين.
جيئن ته اسان جو معاهدو رانديگرن جي نقصانن کي گڏ ڪندو، اهو رقم لازمي طور تي لاٽري جي خالق ڏانهن منتقل ڪيو وڃي. لاٽري ٺاهيندڙ جي والٽ ايڊريس اسٽوريج ۾ رڪارڊ ڪيو ويندو آهي جڏهن معاهدو ٺاهيو ويندو آهي.
بس صورت ۾، اسان کي پتي کي تبديل ڪرڻ جي صلاحيت جي ضرورت آهي جنهن تي اسان گم ٿيلن جا گرام موڪليندا آهيون. اسان کي لاٽري مان گرام پڻ مالڪ جي ايڊريس تي موڪلڻ جي قابل هئڻ گهرجي.
اچو ته پهرين سان شروع ڪريون. اچو ته پهريان هڪ ٽيسٽ لکون جيڪو چيڪ ڪندو ته پيغام موڪلڻ کان پوءِ سمارٽ ڪانٽريڪٽ نئين ايڊريس کي اسٽوريج ۾ محفوظ ڪيو. مهرباني ڪري نوٽ ڪريو ته پيغام ۾، انسداد ۽ نئين ايڊريس کان علاوه، اسان پڻ منتقل ڪريون ٿا action هڪ 7-bit انٽيجر غير منفي نمبر، ان تي منحصر ڪري، اسان چونڊ ڪنداسين ته پيغام کي ڪيئن عمل ڪجي سمارٽ معاهدي ۾.
<b 0 32 u, 1 @ 7 u, new_owner_wc @ 32 i, new_owner_account_id @ 256 u, b> message_to_sign !
ٽيسٽ ۾ توهان ڏسي سگهو ٿا ته ڪيئن سمارٽ ڪانٽريڪٽ اسٽوريج کي ختم ڪيو ويو آهي storage پنجن ۾. متغيرن جي ڊيسيريلائيزيشن کي ففٽ دستاويزن ۾ بيان ڪيو ويو آهي.
رستي جي ذريعي، هڪ پروسيس ٿيل پيغام لاء هر وقت سمارٽ معاهدي مان هڪ ڪميشن ڪٽيو ويندو آهي. سمارٽ معاهدي جي پيغامن لاءِ درخواست تي عمل ڪرڻ لاءِ، بنيادي چيڪن کان پوءِ توهان کي ڪال ڪرڻ جي ضرورت آهي accept_message().
هاڻي اچو ته اندروني پيغامن ڏانهن وڃو. حقيقت ۾، اسان صرف گرام قبول ڪنداسين ۽ ٻيڻو رقم واپس موڪلينداسين پليئر کي جيڪڏهن هو کٽي ٿو ۽ ٽيون مالڪ کي جيڪڏهن هو هارائي ٿو.
پهرين، اچو ته هڪ سادي ٽيسٽ لکون. هن کي ڪرڻ لاءِ، اسان کي سمارٽ ڪانٽريڪٽ جي هڪ ٽيسٽ ايڊريس جي ضرورت آهي جنهن مان اسان سمجهون ٿا ته گرام سمارٽ ڪانٽريڪٽ ڏانهن.
مون اهو ڪوڊ شامل ڪرڻ به وساري ڇڏيو آهي جيڪو پهرين درخواست تي عمل ڪندو جيڪو سمارٽ معاهدو شايع ڪرڻ وقت ٿئي ٿو. ملندڙ وابستگي. ۽ اڳتي درست ڪيو مالڪ جي اڪائونٽ ۾ رقم جو 1/3 موڪلڻ سان بگ.
ايندڙ قدم سمارٽ معاهدي کي شايع ڪرڻ آهي. اچو ته هڪ فولڊر ٺاهي requests.
ڪجهه ڌيان ڏيڻ جي قابل. اسان ٺاھيون ٿا سمارٽ ڪانٽريڪٽ اسٽوريج ۽ ھڪ ان پٽ پيغام. ان کان پوء، سمارٽ معاهدي جو پتو ٺاھيو ويندو آھي، اھو آھي، پتو TON ۾ اشاعت کان اڳ به معلوم ٿئي ٿو. اڳيون، توهان کي هن ايڊريس تي ڪيترائي گرام موڪلڻ جي ضرورت آهي، ۽ صرف ان کان پوء توهان کي سمارٽ معاهدي سان هڪ فائل موڪلڻ جي ضرورت آهي، ڇو ته نيٽورڪ سمارٽ ڪانٽريڪٽ ۽ ان ۾ آپريشنز کي محفوظ ڪرڻ لاءِ ڪميشن وٺندو آهي (تصديق ڪندڙ جيڪي سمارٽ کي اسٽور ۽ ان تي عمل ڪندا آهن. معاهدو). ڪوڊ ڏسي سگھجي ٿو هتي.
اڳيون اسان پبلشنگ ڪوڊ تي عمل ڪيو ۽ حاصل ڪيو lottery-query.boc سمارٽ معاهدي فائل ۽ پتو.
وڌيڪ واضح طور تي، اسان پهرين کي ڇڏينداسين ايڊريس کي تبديل ڪرڻ لاءِ هڪ آزاد ڪم جي طور تي، ۽ ٻيو ڪنداسين مالڪ جي ايڊريس تي گرام موڪلڻ لاءِ. حقيقت ۾، اسان کي ساڳيو ڪم ڪرڻو پوندو جيئن گرام موڪلڻ جي امتحان ۾.
اسان لائٽ ڪلائنٽ استعمال ڪنداسين ۽ سائيٽ تي سمارٽ معاهدي بابت معلومات ڏيکارڻ لاءِ طريقا حاصل ڪنداسين.
ويب سائيٽ تي سمارٽ معاهدي جي ڊيٽا کي ڏيکاريندي
مون پيٿون ۾ هڪ سادي ويب سائيٽ لکي سمارٽ ڪانٽريڪٽ مان ڊيٽا کي آسان طريقي سان ظاهر ڪرڻ لاءِ. هتي آئون ان تي تفصيل سان نه ڳالهائيندس ۽ سائيٽ شايع ڪندس هڪ عهد ۾.
TON کان درخواستون ڪيون ويون آهن Python مدد سان lite-client. سهولت لاءِ، سائيٽ ڊاڪر ۾ پيڪ ٿيل آهي ۽ گوگل ڪلائوڊ تي شايع ٿيل آهي. ڳنڍ.
مضمون منهنجي توقع کان گهڻو ڊگهو نڪتو، ٿي سگهي ٿو اهو ننڍو هجي، يا ٿي سگهي ٿو صرف ان شخص لاءِ جيڪو TON بابت ڪجهه به نه ٿو ڄاڻي ۽ لکڻ ۽ شايع ڪرڻ چاهي ٿو هڪ غير معمولي سمارٽ معاهدو لکڻ ۽ شايع ڪرڻ جي صلاحيت سان. اهو. شايد ڪجهه شيون وڌيڪ آسانيءَ سان بيان ڪري سگهجن ٿيون.
ٿي سگهي ٿو ته ان تي عملدرآمد جا ڪجهه پهلو وڌيڪ موثر ۽ خوبصورتيءَ سان ڪيا وڃن ها، پر پوءِ به مضمون تيار ڪرڻ ۾ اڃا وڌيڪ وقت لڳي ها. اهو پڻ ممڪن آهي ته مون ڪٿي غلطي ڪئي هجي يا ڪجهه سمجهي نه سگهيو، تنهنڪري جيڪڏهن توهان ڪجهه سنجيده ڪم ڪري رهيا آهيو، توهان کي TON ڪوڊ سان سرڪاري دستاويز يا سرڪاري مخزن تي ڀروسو ڪرڻو پوندو.
اهو ياد رکڻ گهرجي ته TON پاڻ اڃا تائين ترقي جي فعال اسٽيج ۾ آهي، تبديليون ٿي سگهن ٿيون جيڪي هن مضمون جي ڪنهن به مرحلن کي ٽوڙي ڇڏيندا آهن (جيڪو مون لکڻ دوران ٿيو، اهو اڳ ۾ ئي درست ڪيو ويو آهي)، پر عام طريقو آهي. تبديل ٿيڻ ممڪن ناهي.
مان TON جي مستقبل بابت نه ڳالهائيندس. شايد پليٽ فارم ڪجهه وڏو بڻجي ويندو ۽ اسان کي ان جي مطالعي ۾ وقت گذارڻ گهرجي ۽ هاڻي اسان جي شين سان هڪ جڳهه ڀريو.
فيس بڪ کان ليبرا پڻ آهي، جنهن ۾ صارفين جو امڪاني سامعين TON کان وڏو آهي. مان لبرا جي باري ۾ تقريبن ڪجھ به نه ڄاڻان ٿو، فورم طرفان فيصلو ڪيو ويو ته اتي TON ڪميونٽي جي ڀيٽ ۾ تمام گهڻو سرگرمي آهي. جيتوڻيڪ TON جي ڊولپرز ۽ ڪميونٽي وڌيڪ زير زمين وانگر آهن، جيڪو پڻ ٿڌو آهي.