ٽيليگرام اوپن نيٽورڪ (TON) ۾ سمارٽ معاهدو ڪيئن لکڻ ۽ شايع ڪرڻ بابت

TON ۾ سمارٽ معاهدو ڪيئن لکڻ ۽ شايع ڪرڻ بابت

هي مضمون ڇا جي باري ۾ آهي؟

آرٽيڪل ۾ آئون ڳالهائيندس ته ڪيئن مون پهرين (ٻن مان) ٽيليگرام بلاڪچين مقابلي ۾ حصو ورتو، انعام نه ورتو، ۽ هڪ مضمون ۾ منهنجو تجربو رڪارڊ ڪرڻ جو فيصلو ڪيو ته جيئن اهو وساري نه وڃي ۽، شايد، مدد. ڪو.

جيئن ته مان خلاصي ڪوڊ لکڻ نه ٿو چاهيان، پر ڪجهه ڪم ڪرڻ لاءِ، آرٽيڪل لاءِ مون هڪ سمارٽ ڪانٽريڪٽ لکيو آهي هڪ فوري لاٽري ۽ هڪ ويب سائيٽ جيڪا ڏيکاري ٿي سمارٽ ڪانٽريڪٽ ڊيٽا سڌو سنئون TON کان سواءِ وچولي اسٽوريج استعمال ڪرڻ جي.

مضمون انهن لاءِ ڪارآمد ثابت ٿيندو جيڪي TON ۾ پنهنجو پهريون سمارٽ معاهدو ڪرڻ چاهين ٿا، پر خبر ناهي ڪٿي شروع ڪجي.

لاٽري کي مثال طور استعمال ڪندي، مان ماحول کي انسٽال ڪرڻ کان وٺي سمارٽ ڪانٽريڪٽ شايع ڪرڻ، ان سان رابطو ڪرڻ، ۽ ڊيٽا حاصل ڪرڻ ۽ شايع ڪرڻ لاءِ ويب سائيٽ لکڻ تائين ويندس.

مقابلي ۾ شرڪت بابت

گذريل آڪٽوبر، ٽيليگرام اعلان ڪيو هڪ بلاڪچين مقابلي سان نئين ٻولين سان Fift и FunC. اهو ضروري هو ته پنجن تجويز ڪيل سمارٽ معاهدن مان ڪنهن به لکڻ مان چونڊيو وڃي. مون سوچيو ته اهو سٺو لڳندو ته ڪجهه مختلف ڪرڻ، ٻولي سکي ۽ ڪجهه ٺاهيو، جيتوڻيڪ مستقبل ۾ مون کي ٻيو ڪجهه نه لکڻو پوي. ان سان گڏ، موضوع مسلسل لبن تي آهي.

اهو چوڻ جي لائق آهي ته مون وٽ سمارٽ معاهدن کي ترقي ڪرڻ جو ڪو تجربو نه هو.

مون حصو وٺڻ جي رٿابندي ڪئي هئي آخر تائين جيستائين مان ڪري سگهان ها ۽ پوءِ هڪ جائزو وٺڻ وارو مضمون لکان، پر مان پهرين ئي ناڪام ٿي ويس. آء هڪ پرس لکيو گهڻن دستخط سان FunC ۽ اهو عام طور تي ڪم ڪيو. مون ان کي بنياد طور ورتو سوليڊٽي تي سمارٽ معاهدو.

ان وقت، مون سوچيو ته اهو ضرور ڪافي آهي ته گهٽ ۾ گهٽ ڪجهه انعام واري جڳهه وٺڻ لاء. نتيجي طور، 40 مان 60 شرڪت ڪندڙ انعام ماڻيا ويا ۽ مان انهن ۾ شامل نه هو. عام طور تي، ان ۾ ڪجھ به غلط ناهي، پر هڪ شيء مون کي پريشان ڪيو. نتيجن جي اعلان وقت، منهنجي ڪانٽريڪٽ جي ٽيسٽ جو جائزو نه ورتو ويو هو، مون چيٽ ۾ شرڪت ڪندڙن کان پڇيو ته ڇا ڪو ٻيو آهي جيڪو اهو نه هو، اتي ڪو به نه هو.

بظاهر منهنجي پيغامن تي ڌيان ڏيندي، ٻن ڏينهن کان پوءِ ججن هڪ تبصرو شايع ڪيو ۽ مون کي اڃا تائين سمجهه ۾ نه ٿو اچي ته ڇا انهن ججن دوران غلطيءَ سان منهنجو سمارٽ ڪانٽريڪٽ مس ڪري ڇڏيو يا بس اهو سوچيو ته اهو ايترو خراب آهي جو ان تي تبصري جي ضرورت ئي نه هئي. مون صفحي تي هڪ سوال پڇيو، پر جواب نه مليو. جيتوڻيڪ اهو ڪو راز ناهي ته ڪير فيصلو ڪيو، مون ان کي غير ضروري سمجهيو ته ذاتي پيغام لکڻ لاء.

سمجھڻ ۾ گهڻو وقت گذري ويو، تنهنڪري هڪ مضمون لکڻ جو فيصلو ڪيو ويو. جيئن ته اڃا تائين تمام گهڻي معلومات نه آهي، مضمون هر ڪنهن جي دلچسپي لاء وقت بچائڻ ۾ مدد ڪندو.

TON ۾ سمارٽ معاهدي جو تصور

ان کان اڳ جو توھان ڪجھھ لکو، توھان کي اھو معلوم ڪرڻو پوندو ته ھن شيءِ کي ڪھڙي پاسي ڏانھن وڃڻو آھي. تنهن ڪري، هاڻي مان توهان کي ٻڌايان ٿو ته سسٽم ڪهڙي حصن تي مشتمل آهي. وڌيڪ واضح طور تي، توهان کي ڄاڻڻ جي ضرورت آهي ته گهٽ ۾ گهٽ ڪجهه قسم جي ڪم ڪندڙ معاهدي کي لکڻ لاء.

اسان هڪ سمارٽ معاهدو لکڻ ۽ ڪم ڪرڻ تي ڌيان ڏينداسين TON Virtual Machine (TVM), Fift и FunC، تنهن ڪري آرٽيڪل وڌيڪ آهي هڪ باقاعده پروگرام جي ترقي جي وضاحت وانگر. اسان ان تي نه رهنداسين ته پليٽ فارم پاڻ هتي ڪيئن ڪم ڪري ٿو.

عام طور تي اهو ڪيئن ڪم ڪري ٿو TVM ۽ ٻولي Fift اتي سٺو سرڪاري دستاويز آهي. مقابلي ۾ حصو وٺڻ دوران ۽ هاڻ موجوده معاهدو لکڻ وقت، مان اڪثر هن ڏانهن رخ ڪندو هوس.

مکيه ٻولي جنهن ۾ سمارٽ معاهدو لکيل آهن FunC. هن وقت ان تي ڪو به دستاويز موجود ناهي، تنهن ڪري ڪجهه لکڻ لاءِ، توهان کي پڙهڻ جي ضرورت آهي سمارٽ معاهدن جا مثال سرڪاري مخزن مان ۽ خود ٻوليءَ تي عمل درآمد، ان سان گڏ توهان گذريل ٻن کان سمارٽ معاهدن جا مثال ڏسي سگهو ٿا. مقابلا. مضمون جي آخر ۾ لنڪس.

اچو ته چئو ته اسان اڳ ۾ ئي هڪ سمارٽ معاهدو لکيو آهي FunC، ان کان پوءِ اسان ڪوڊ گڏ ڪريون ٿا ففٽ اسمبلر ۾.

مرتب ڪيل سمارٽ معاهدو شايع ٿيڻ باقي آهي. هن کي ڪرڻ لاء توهان کي هڪ فنڪشن لکڻ جي ضرورت آهي Fift، جيڪو سمارٽ ڪانٽريڪٽ ڪوڊ ۽ ان پٽ جي طور تي ڪجهه ٻيا پيٽرول کڻندو، ۽ آئوٽ پُٽ ايڪسٽينشن سان گڏ فائيل هوندو. .boc (جنهن جو مطلب آهي "سيلز جو ٿلهو")، ۽، ان تي منحصر آهي ته اسان ان کي ڪيئن لکون ٿا، هڪ خانگي ڪي ۽ پتو، جيڪو سمارٽ ڪانٽريڪٽ ڪوڊ جي بنياد تي ٺاهيل آهي. توهان اڳ ۾ ئي هڪ سمارٽ معاهدي جي ايڊريس تي گرام موڪلي سگهو ٿا جيڪو اڃا تائين شايع نه ڪيو ويو آهي.

حاصل ڪيل TON ۾ سمارٽ معاهدو شايع ڪرڻ لاء .boc فائل کي هڪ هلڪو ڪلائنٽ استعمال ڪندي بلاڪچين ڏانهن موڪلڻ جي ضرورت پوندي (هيٺ ڏنل وڌيڪ). پر شايع ڪرڻ کان پهريان، توهان کي ٺاهيل ايڊريس تي گرام منتقل ڪرڻ جي ضرورت آهي، ٻي صورت ۾ سمارٽ معاهدو شايع نه ڪيو ويندو. اشاعت کان پوء، توهان سمارٽ معاهدي سان رابطو ڪري سگهو ٿا ان کي ٻاهران پيغام موڪلڻ سان (مثال طور، هڪ هلڪو ڪلائنٽ استعمال ڪندي) يا اندر کان (مثال طور، هڪ سمارٽ معاهدو ٻيو پيغام موڪلي ٿو TON اندر).

هڪ دفعو اسان سمجهون ٿا ته ڪوڊ ڪيئن شايع ڪيو ويو آهي، اهو آسان ٿي ويندو. اسان تقريبن ڄاڻون ٿا ته اسان ڇا لکڻ چاهيون ٿا ۽ اسان جو پروگرام ڪيئن ڪم ڪندو. ۽ لکڻ دوران، اسان ڏسون ٿا ته اهو اڳ ۾ ئي موجود سمارٽ معاهدن ۾ ڪيئن لاڳو ڪيو ويو آهي، يا اسان ان تي عمل ڪرڻ واري ڪوڊ کي ڏسون ٿا. Fift и FunC سرڪاري مخزن ۾، يا سرڪاري دستاويزن ۾ ڏسو.

گهڻو ڪري مون ٽيليگرام چيٽ ۾ ڪي لفظ ڳوليا جتي مقابلي ۾ شرڪت ڪندڙ ۽ ٽيليگرام جا ملازم گڏ ٿيا، ۽ ائين ٿيو ته مقابلي دوران سڀ اتي گڏ ٿيا ۽ ففٽ ۽ فن سي تي بحث ڪرڻ لڳا. مضمون جي آخر ۾ لنڪ.

اهو وقت آهي نظريي کان مشق ڏانهن منتقل ڪرڻ جو.

TON سان ڪم ڪرڻ لاء ماحول تيار ڪرڻ

مون اهو سڀ ڪجهه ڪيو جيڪو MacOS تي آرٽيڪل ۾ بيان ڪيو ويندو ۽ ڊڪر تي صاف Ubuntu 18.04 LTS ۾ ان کي ٻه ڀيرا چيڪ ڪيو.

پهرين شيء توهان کي ڪرڻو آهي ڊائون لوڊ ۽ انسٽال ڪريو lite-client جنهن سان توهان TON ڏانهن درخواستون موڪلي سگهو ٿا.

سرڪاري ويب سائيٽ تي ڏنل هدايتون انسٽاليشن جي عمل کي ڪافي تفصيل ۽ واضح طور تي بيان ڪري ٿو ۽ ڪجهه تفصيلن کي ختم ڪري ٿو. هتي اسان هدايتن تي عمل ڪندا آهيون، رستي ۾ غائب انحصار کي نصب ڪرڻ. مون هر پروجيڪٽ کي پاڻ مرتب نه ڪيو ۽ سرڪاري Ubuntu مخزن مان انسٽال ڪيو (MacOS تي مون استعمال ڪيو brew).

apt -y install git 
apt -y install wget 
apt -y install cmake 
apt -y install g++ 
apt -y install zlib1g-dev 
apt -y install libssl-dev 

هڪ دفعو سڀ انحصار انسٽال ٿيل آهن توهان انسٽال ڪري سگهو ٿا lite-client, Fift, FunC.

پهريون، اسان ان جي انحصار سان گڏ TON مخزن کي ڪلون ڪيو. سهولت لاءِ، اسان سڀ ڪم ڪنداسين فولڊر ۾ ~/TON.

cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive

مخزن پڻ عملن کي محفوظ ڪري ٿو Fift и FunC.

هاڻي اسان منصوبي کي گڏ ڪرڻ لاء تيار آهيون. مخزن جو ڪوڊ فولڊر ۾ ڪلون ڪيو ويو آهي ~/TON/ton. جي ~/TON هڪ فولڊر ٺاهيو build ۽ ان ۾ پروجيڪٽ گڏ ڪريو.

mkdir ~/TON/build 
cd ~/TON/build
cmake ../ton

جيئن ته اسان هڪ سمارٽ معاهدو لکڻ وارا آهيون، اسان کي صرف ضرورت ناهي lite-clientپر Fift с FunC، تنهنڪري اچو ته سڀ ڪجهه گڏ ڪريون. اهو تڪڙو عمل نه آهي، تنهنڪري اسان انتظار ڪري رهيا آهيون.

cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func

اڳيون، ڊائون لوڊ ڪنفگريشن فائل جنهن ۾ نوڊ بابت ڊيٽا شامل آهي جنهن ۾ lite-client ڳنڍيندو.

wget https://test.ton.org/ton-lite-client-test1.config.json

TON کي پهرين درخواستون ٺاهڻ

هاڻي اچو ته لانچ ڪريون lite-client.

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 جي اندر اندر، ڪو به معاهدو اسان جي حوالي ڪري ٿو. ٻنهي صورتن ۾، توهان فنڪشن ڏانهن پيراگراف پاس ڪري سگهو ٿا.

اچو ته هڪ سادي مثال سان شروع ڪريون جيڪو شايع ٿيڻ جي صورت ۾ ڪم ڪندو، پر ان ۾ ڪو به فنڪشنل لوڊ نه آهي.

() recv_internal(slice in_msg) impure {
    ;; TODO: implementation 
}

() recv_external(slice in_msg) impure {
    ;; TODO: implementation  
}

هتي اسان کي وضاحت ڪرڻ جي ضرورت آهي ته اهو ڇا آهي slice. TON Blockchain ۾ محفوظ ڪيل سڀئي ڊيٽا هڪ مجموعو آهي TVM cell يا بس cell, اهڙي سيل ۾ توهان 1023 بٽس تائين ڊيٽا ذخيرو ڪري سگهو ٿا ۽ 4 لنڪس تائين ٻين سيلن ڏانهن.

TVM cell slice يا slice هي موجوده هڪ جو حصو آهي cell ان کي پارس ڪرڻ لاءِ استعمال ڪيو ويندو آهي، اهو بعد ۾ واضح ٿيندو. اسان لاء بنيادي شيء اها آهي ته اسان منتقل ڪري سگهون ٿا slice ۽ پيغام جي قسم تي منحصر ڪري، ڊيٽا کي پروسيس ڪريو recv_external() يا recv_internal().

impure - هڪ لفظ جيڪو ظاهر ڪري ٿو ته فنڪشن سمارٽ معاهدي ڊيٽا کي تبديل ڪري ٿو.

اچو ته ان ۾ ڪانٽريڪٽ ڪوڊ محفوظ ڪريون lottery-code.fc ۽ گڏ ڪرڻ.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

جھنڊو جي معني کي حڪم استعمال ڪندي ڏسي سگھجي ٿو

~/TON/build/crypto/func -help

اسان ان ۾ ففٽ اسمبلر ڪوڊ مرتب ڪيو آهي lottery-compiled.fif:

// lottery-compiled.fif

"Asm.fif" include
// automatically generated from `/Users/rajymbekkapisev/TON/ton/crypto/smartcont/stdlib.fc` `./lottery-code.fc` 
PROGRAM{
  DECLPROC recv_internal
  DECLPROC recv_external
  recv_internal PROC:<{
    //  in_msg
    DROP    // 
  }>
  recv_external PROC:<{
    //  in_msg
    DROP    // 
  }>
}END>c

ان کي مقامي طور تي لانچ ڪري سگهجي ٿو، ان لاءِ ماحول تيار ڪنداسين.

نوٽ ڪريو ته پهرين لائن ڳنڍي ٿي Asm.fif، هي ڪوڊ آهي ففٽ ۾ لکيل آهي ففٽ جمع ڪندڙ لاءِ.

جيئن ته اسان سمارٽ معاهدي کي مقامي طور تي هلائڻ ۽ جانچڻ چاهيون ٿا، اسان هڪ فائيل ٺاهينداسين lottery-test-suite.fif ۽ اتي مرتب ڪيل ڪوڊ کي نقل ڪريو، ان ۾ آخري لائين کي تبديل ڪندي، جيڪو سمارٽ ڪانٽريڪٽ ڪوڊ لکي ٿو مستقل codeان کان پوء ان کي مجازي مشين ڏانهن منتقل ڪرڻ لاء:

"TonUtil.fif" include
"Asm.fif" include

PROGRAM{
  DECLPROC recv_internal
  DECLPROC recv_external
  recv_internal PROC:<{
    //  in_msg
    DROP    // 
  }>
  recv_external PROC:<{
    //  in_msg
    DROP    // 
  }>
}END>s constant code

هينئر تائين اهو واضح لڳي ٿو، هاڻي اچو ته ساڳئي فائل ۾ ڪوڊ شامل ڪريو جيڪو اسان TVM لانچ ڪرڻ لاءِ استعمال ڪنداسين.

0 tuple 0x076ef1ea , // magic
0 , 0 , // actions msg_sents
1570998536 , // unix_time
1 , 1 , 3 , // block_lt, trans_lt, rand_seed
0 tuple 100000000000000 , dictnew , , // remaining balance
0 , dictnew , // contract_address, global_config
1 tuple // wrap to another tuple
constant c7

0 constant recv_internal // to run recv_internal() 
-1 constant recv_external // to invoke recv_external()

В c7 اسان ان حوالي سان رڪارڊ ڪريون ٿا، يعني ڊيٽا جنهن سان TVM (يا نيٽ ورڪ اسٽيٽ) شروع ڪئي ويندي. جيتوڻيڪ مقابلي دوران، هڪ ڊولپر ڏيکاريو ته ڪيئن ٺاهيو c7 ۽ مون نقل ڪيو. هن آرٽيڪل ۾ اسان کي شايد تبديل ڪرڻ جي ضرورت آهي rand_seed جيئن ته هڪ بي ترتيب نمبر جي نسل ان تي منحصر آهي ۽ جيڪڏهن تبديل نه ڪيو وڃي، ساڳيو نمبر هر وقت واپس ڪيو ويندو.

recv_internal и recv_external 0 ۽ -1 سان constants سمارٽ ڪانٽريڪٽ ۾ لاڳاپيل ڪمن کي ڪال ڪرڻ جا ذميوار هوندا.

هاڻي اسان تيار آهيون اسان جي خالي سمارٽ معاهدي لاءِ پهرين ٽيسٽ ٺاهڻ لاءِ. وضاحت لاءِ، ھاڻي اسان سڀني ٽيسٽن کي ساڳي فائل ۾ شامل ڪنداسين lottery-test-suite.fif.

اچو ته هڪ متغير ٺاهي storage ۽ ان ۾ هڪ خالي لکو cell, هي هوندو سمارٽ ڪانٽريڪٽ اسٽوريج.

message اهو پيغام آهي ته اسان ٻاهران سمارٽ رابطي ڏانهن منتقل ڪنداسين. اسان به ان کي هاڻي لاءِ خالي ڪري ڇڏينداسين.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

ان کان پوءِ اسان مستقل ۽ متغير تيار ڪيو، اسان حڪم استعمال ڪندي TVM لانچ ڪيو runvmctx ۽ ٺاهيل پيرا ميٽرز کي ان پٽ ڏانهن منتقل ڪريو.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

آخر ۾ اسان ڪامياب ٿينداسين هن وانگر وچولي ڪوڊ لاء Fift.

هاڻي اسان نتيجو ڪوڊ هلائي سگهون ٿا.

export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняем один раз для удобства 
~/TON/build/crypto/fift -s lottery-test-suite.fif 

پروگرام کي بغير ڪنهن غلطي جي هلڻ گهرجي ۽ آئوٽ پٽ ۾ اسان کي عمل جي لاگ ڏسڻ ۾ ايندي:

execute SETCP 0
execute DICTPUSHCONST 19 (xC_,1)
execute DICTIGETJMPZ
execute DROP
execute implicit RET
[ 3][t 0][1582281699.325381279][vm.cpp:479]     steps: 5 gas: used=304, max=9223372036854775807, limit=9223372036854775807, credit=0

عظيم، اسان سمارٽ معاهدي جو پهريون ڪم ڪندڙ نسخو لکيو آهي.

هاڻي اسان کي ڪارڪردگي شامل ڪرڻ جي ضرورت آهي. پهرين اچو ته انهن پيغامن سان ڊيل ڪريون جيڪي ٻاهرين دنيا کان ايندا آهن 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 منتقل ٿيل پيغام مان.

اڳيون اسان سمارٽ ڪانٽريڪٽ اسٽوريج مان 32 بٽ لوڊ ڪريون ٿا. اسان چيڪ ڪريون ٿا ته لوڊ ٿيل نمبر منظور ٿيل نمبر سان ملي ٿو؛ جيڪڏهن نه، اسان هڪ استثنا اڇليندا آهيون. اسان جي صورت ۾، ڇاڪاڻ ته اسان هڪ غير ميچ پاس ڪري رهيا آهيون، هڪ استثنا اڇلايو وڃي.

هاڻي اچو ته گڏ ڪريون.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

نتيجو ڪوڊ کي نقل ڪريو lottery-test-suite.fif، آخري لائين کي تبديل ڪرڻ نه وساريو.

اسان چيڪ ڪريون ٿا ته امتحان پاس ڪري ٿو:

~/TON/build/crypto/fift -s lottery-test-suite.fif

ھتي صحيح آھي توهان موجوده نتيجن سان لاڳاپيل عزم ڏسي سگهو ٿا.

ياد رهي ته سمارٽ ڪانٽريڪٽ جي مرتب ڪيل ڪوڊ کي ٽيسٽن سان گڏ فائل ۾ مسلسل نقل ڪرڻ مشڪل آهي، تنهن ڪري اسان هڪ اسڪرپٽ لکنداسين جيڪو ڪوڊ اسان جي لاءِ مستقل ۾ لکندو، ۽ اسان صرف ترتيب ڏنل ڪوڊ کي اسان جي ٽيسٽن سان ڳنڍينداسين. "include".

پروجيڪٽ فولڊر ۾ هڪ فائل ٺاهيو build.sh هيٺ ڏنل مواد سان.

#!/bin/bash

~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc

اچو ته ان کي قابل عمل بڻايون.

chmod +x ./build.sh

هاڻي، صرف اسان جي اسڪرپٽ کي هلائڻ لاء معاهدو گڏ ڪرڻ لاء. پر ان کان علاوه، اسان کي ان کي مسلسل لکڻ جي ضرورت آهي 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، ۽ پوءِ ٽيسٽ ڪريو.

touch test.sh
chmod +x test.sh

اسان اندر لکندا آهيون

./build.sh 

echo "nCompilation completedn"

export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif

اچو ته اهو ڪريون test.sh ۽ ان کي هلائڻ لاءِ پڪ ڪريو ته ٽيسٽ ڪم ڪن ٿيون.

chmod +x ./test.sh
./test.sh

اسان چيڪ ڪريون ٿا ته معاهدو مرتب ڪيو ويو آهي ۽ ٽيسٽ تي عمل ڪيو ويو آهي.

چڱو، هاڻي شروعاتي تي test.sh ٽيسٽ مرتب ڪيا ويندا ۽ فوري طور تي هلندا. هتي جي لنڪ آهي انجام ڏيڻ.

ٺيڪ آهي، ان کان اڳ جو اسان جاري رکون، اچو ته سهولت لاءِ هڪ ٻيو ڪم ڪريون.

اچو ته هڪ فولڊر ٺاهي build جتي اسان ڪاپي ٿيل معاهدو ۽ ان جي ڪلون کي مستقل طور تي محفوظ ڪنداسين lottery-compiled.fif, lottery-compiled-for-test.fif. اچو ته هڪ فولڊر پڻ ٺاهيو test ٽيسٽ فائل ڪٿي محفوظ ڪئي ويندي؟ lottery-test-suite.fif ۽ ممڪن طور تي ٻيون سپورٽ فائلون. لاڳاپيل تبديلين لاء لنڪ.

اچو ته سمارٽ معاهدي جي ترقي جاري رکون.

اڳتي هلي هڪ ٽيسٽ ٿيڻ گهرجي جيڪا چيڪ ڪري ٿي ته پيغام موصول ٿيو آهي ۽ ڪائونٽر اسٽور ۾ اپڊيٽ ڪيو ويندو آهي جڏهن اسان صحيح نمبر موڪليندا آهيون. پر اسان اهو بعد ۾ ڪنداسين.

هاڻي اچو ته سوچيو ته ڪهڙي ڊيٽا جي جوڙجڪ ۽ ڪهڙي ڊيٽا کي سمارٽ معاهدي ۾ محفوظ ڪرڻ جي ضرورت آهي.

مان هر شي کي بيان ڪندس جيڪو اسان ذخيرو ڪندا آهيون.

`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() سمارٽ معاهدي جي اسٽوريج ۾.

cell packed_state = pack_state(arg_1, .., arg_n); 
set_data(packed_state);

هاڻي ته اسان وٽ ڊيٽا لکڻ ۽ پڙهڻ لاءِ آسان ڪم آهن، اسان اڳتي هلي سگهون ٿا.

اسان کي جانچڻ جي ضرورت آهي ته پيغام ٻاهران اچڻ واري معاهدي جي مالڪ طرفان دستخط ٿيل آهي (يا ٻيو صارف جنهن کي نجي ڪني تائين رسائي آهي).

جڏهن اسان هڪ سمارٽ معاهدو شايع ڪندا آهيون، اسان ان کي شروع ڪري سگھون ٿا ان ڊيٽا سان جيڪو اسان کي اسٽوريج ۾ گهربل هجي، جيڪو مستقبل جي استعمال لاءِ محفوظ ڪيو ويندو. اسان اتي پبلڪ ڪيچ کي رڪارڊ ڪنداسين ته جيئن اسان تصديق ڪري سگهون ته ايندڙ پيغام لاڳاپيل نجي چيڪ سان سائن ڪيو ويو.

اڳتي وڌڻ کان اڳ، اچو ته ھڪ خانگي ڪيچ ٺاھيون ۽ ان کي لکون test/keys/owner.pk. هن کي ڪرڻ لاء، اچو ته انٽرايڪٽو موڊ ۾ ففٽ لانچ ڪريو ۽ چار حڪمن تي عمل ڪريو.

`newkeypair` генерация публичного и приватного ключа и запись их в стек. 

`drop` удаления из стека верхнего элемента (в данном случае публичный ключ)  

`.s` просто посмотреть что лежит в стеке в данный момент 

`"owner.pk" B>file` запись приватного ключа в файл с именем `owner.pk`. 

`bye` завершает работу с Fift. 

اچو ته هڪ فولڊر ٺاهي keys فولڊر اندر test ۽ اتي نجي چيڪ لکو.

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.

variable owner_private_key
variable owner_public_key 

"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !

اسان کي ٻنهي ڪنجين جي ضرورت پوندي.

اسان سمارٽ ڪانٽريڪٽ اسٽوريج کي صوابديدي ڊيٽا سان شروع ڪريون ٿا ساڳئي ترتيب ۾ جيئن فنڪشن ۾ pack_state()۽ ان کي متغير ۾ لکو storage.

variable owner_private_key
variable owner_public_key 
variable orders
variable owner_wc
variable owner_account_id

"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !
dictnew orders !
0 owner_wc !
0 owner_account_id !

<b 0 32 u, owner_public_key @ B, 0 32 u, 0 32 u, 0 Gram, 0 Gram, owner_wc @ 32 i, owner_account_id @ 256 u,  orders @ dict, b> storage !

اڳيون، اسان هڪ دستخط ٿيل پيغام ٺاهينداسين، اهو صرف دستخط ۽ انسداد قيمت تي مشتمل هوندو.

پهرين، اسان اهو ڊيٽا ٺاهيندا آهيون جيڪو اسان منتقل ڪرڻ چاهيون ٿا، پوء اسان ان کي هڪ خانگي چيڪ سان سائن ڪيو ۽ آخرڪار اسان هڪ دستخط ٿيل پيغام ٺاهي.

variable message_to_sign
variable message_to_send
variable signature
<b 0 32 u, b> message_to_sign !
message_to_sign @ hashu owner_private_key @ ed25519_sign_uint signature !
<b signature @ B, 0 32 u, b> <s  message_to_send !  

نتيجي طور، پيغام جيڪو اسان موڪلينداسين سمارٽ معاهدي کي متغير ۾ رڪارڊ ڪيو ويو آهي message_to_send، افعال جي باري ۾ hashu, ed25519_sign_uint توهان پڙهي سگهو ٿا پنجن دستاويزن ۾.

۽ ٽيسٽ کي هلائڻ لاءِ اسان ٻيهر سڏين ٿا.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

هن وانگر ٽيسٽ سان فائل هن اسٽيج تي هن وانگر ڏسڻ گهرجي.

اچو ته ٽيسٽ هلون ۽ اهو ناڪام ٿي ويندو، تنهنڪري اسان سمارٽ معاهدي کي تبديل ڪنداسين ته جيئن اهو هن فارميٽ جا پيغام وصول ڪري ۽ دستخط جي تصديق ڪري سگهي.

پهرين، اسان پيغام مان دستخط جي 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 پنجن ۾. متغيرن جي ڊيسيريلائيزيشن کي ففٽ دستاويزن ۾ بيان ڪيو ويو آهي.

وابستگي لنڪ شامل ٿيل مٽي سان.

اچو ته ٽيسٽ هلون ۽ پڪ ڪريو ته اهو ناڪام ٿيو. هاڻي اچو ته لاٽري جي مالڪ جي ايڊريس کي تبديل ڪرڻ لاءِ منطق شامل ڪريون.

سمارٽ معاهدي ۾ اسان کي پارس ڪرڻ جاري رکون ٿا message، ۾ پڙهو action. اچو ته توهان کي ياد ڏياريون ته اسان وٽ ٻه هوندا action: پتو تبديل ڪريو ۽ گرام موڪليو.

ان کان پوء اسان معاهدي جي مالڪ جو نئون پتو پڙهو ۽ ان کي اسٽوريج ۾ محفوظ ڪريو.
اسان ٽيسٽ هلائيندا آهيون ۽ ڏسو ته ٽيون ٽيسٽ ناڪام ٿي. اهو حادثو ان حقيقت جي ڪري ٿيو آهي ته معاهدو هاڻي پيغام مان 7 بٽ پڻ پارس ڪري ٿو، جيڪي ٽيسٽ ۾ غائب آهن. پيغام ۾ ھڪڙو غير موجود شامل ڪريو action. اچو ته ٽيسٽ هلون ۽ ڏسو ته سڀ ڪجهه گذري ٿو. تُوت تبديلين جو عزم. زبردست.

هاڻي اچو ته اڳئين محفوظ ڪيل ايڊريس تي گرامن جي مخصوص نمبر موڪلڻ لاءِ منطق لکون.

پهرين، اچو ته هڪ امتحان لکون. اسان ٻه ٽيسٽ لکنداسين، هڪ جڏهن ڪافي توازن نه هجي، ٻيو جڏهن هر شيء ڪاميابي سان گذري وڃي. ٽيسٽ ڏسي سگھجي ٿو هن انجام ۾.

هاڻي اچو ته ڪوڊ شامل ڪريو. پهرين، اچو ته ٻه مددگار طريقا لکون. پهريون حاصل ڪرڻ جو طريقو اهو آهي ته معلوم ڪرڻ لاءِ موجوده توازن سمارٽ معاهدي جي.

int balance() inline_ref method_id {
    return get_balance().pair_first();
}

۽ ٻيو آهي گرام موڪلڻ لاءِ ٻئي سمارٽ معاهدي تي. مون مڪمل طور تي نقل ڪيو هي طريقو ڪنهن ٻئي سمارٽ معاهدي کان.

() send_grams(int wc, int addr, int grams) impure {
    ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
    cell msg = begin_cell()
    ;;  .store_uint(0, 1) ;; 0 <= format indicator int_msg_info$0 
    ;;  .store_uint(1, 1) ;; 1 <= ihr disabled
    ;;  .store_uint(1, 1) ;; 1 <= bounce = true
    ;;  .store_uint(0, 1) ;; 0 <= bounced = false
    ;;  .store_uint(4, 5)  ;; 00100 <= address flags, anycast = false, 8-bit workchain
        .store_uint (196, 9)
        .store_int(wc, 8)
        .store_uint(addr, 256)
        .store_grams(grams)
        .store_uint(0, 107) ;; 106 zeroes +  0 as an indicator that there is no cell with the data.
        .end_cell(); 
    send_raw_message(msg, 3); ;; mode, 2 for ignoring errors, 1 for sender pays fees, 64 for returning inbound message value
}

اچو ته انهن ٻن طريقن کي سمارٽ معاهدي ۾ شامل ڪريون ۽ منطق لکون. پهريون، اسان پيغام مان گرامن جو تعداد پارس ڪريون ٿا. اڳيون اسان بيلنس چيڪ ڪريون ٿا، جيڪڏهن اهو ڪافي نه آهي ته اسان هڪ استثنا اڇلايو. جيڪڏهن سڀ ڪجهه ٺيڪ آهي، پوء اسان گرام موڪليندا آهيون محفوظ ڪيل ايڊريس تي ۽ ڪائونٽر کي اپڊيٽ ڪريو.

int amount_to_send = message~load_grams();
throw_if(36, amount_to_send + 500000000 > balance());
accept_message();
send_grams(owner_wc, owner_account_id, amount_to_send);
set_data(pack_state(stored_seqno + 1, pubkey, order_seqno, number_of_wins, incoming_amount, outgoing_amount, owner_wc, owner_account_id, orders));

هن وانگر هن وقت سمارٽ معاهدي وانگر ڏسڻ ۾ اچي ٿو. اچو ته ٽيسٽ هلون ۽ پڪ ڪريو ته اهي پاس ٿين ٿا.

رستي جي ذريعي، هڪ پروسيس ٿيل پيغام لاء هر وقت سمارٽ معاهدي مان هڪ ڪميشن ڪٽيو ويندو آهي. سمارٽ معاهدي جي پيغامن لاءِ درخواست تي عمل ڪرڻ لاءِ، بنيادي چيڪن کان پوءِ توهان کي ڪال ڪرڻ جي ضرورت آهي accept_message().

هاڻي اچو ته اندروني پيغامن ڏانهن وڃو. حقيقت ۾، اسان صرف گرام قبول ڪنداسين ۽ ٻيڻو رقم واپس موڪلينداسين پليئر کي جيڪڏهن هو کٽي ٿو ۽ ٽيون مالڪ کي جيڪڏهن هو هارائي ٿو.

پهرين، اچو ته هڪ سادي ٽيسٽ لکون. هن کي ڪرڻ لاءِ، اسان کي سمارٽ ڪانٽريڪٽ جي هڪ ٽيسٽ ايڊريس جي ضرورت آهي جنهن مان اسان سمجهون ٿا ته گرام سمارٽ ڪانٽريڪٽ ڏانهن.

سمارٽ ڪانٽريڪٽ ايڊريس ٻن نمبرن تي مشتمل آهي، هڪ 32-bit انٽيجر جيڪو ڪم چين لاءِ ذميوار آهي ۽ هڪ 256-bit غير منفي انٽيجر منفرد اڪائونٽ نمبر هن ورڪ چين ۾. مثال طور، -1 ۽ 12345، هي اهو پتو آهي جيڪو اسان فائل ۾ محفوظ ڪنداسين.

مان ايڊريس کي محفوظ ڪرڻ لاءِ فنڪشن ڪاپي ڪيو TonUtil.fif.

// ( wc addr fname -- )  Save address to file in 36-byte format
{ -rot 256 u>B swap 32 i>B B+ swap B>file } : save-address

اچو ته ڏسو ته فنڪشن ڪيئن ڪم ڪري ٿو، اهو سمجھندو ته ففٽ ڪيئن ڪم ڪري ٿو. انٽرايڪٽو موڊ ۾ ففٽ لانچ ڪريو.

~/TON/build/crypto/fift -i 

پهرين اسان -1، 12345 کي دٻايو ۽ مستقبل جي فائل جو نالو "sender.addr" اسٽيڪ تي:

-1 12345 "sender.addr" 

ايندڙ قدم فنڪشن تي عمل ڪرڻ آهي -rot، جيڪو اسٽيڪ کي اهڙي طرح تبديل ڪري ٿو ته اسٽيڪ جي چوٽي تي هڪ منفرد سمارٽ معاهدو نمبر آهي:

"sender.addr" -1 12345

256 u>B 256-bit غير منفي انٽيجر کي بائيٽ ۾ تبديل ڪري ٿو.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap اسٽيڪ جي مٿين ٻن عناصر کي تبديل ڪري ٿو.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B 32-bit انٽيجر کي بائيٽ ۾ تبديل ڪري ٿو.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ بائيٽ جي ٻن تسلسل کي ڳنڍي ٿو.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

ٻيهر swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

۽ آخر ۾ بائيٽ فائل ۾ لکيل آهن B>file. ان کان پوء اسان جو اسٽيڪ خالي آهي. اسان روڪيو Fift. موجوده فولڊر ۾ هڪ فائل ٺاهي وئي آهي sender.addr. اچو ته فائل کي ٺاهيل فولڊر ۾ منتقل ڪريو test/addresses/.

اچو ته هڪ سادي ٽيسٽ لکون جيڪو گرامن کي سمارٽ معاهدي ڏانهن موڪليندو. هتي جو عزم آهي.

هاڻي اچو ته لاٽري جي منطق کي ڏسو.

پهرين شيء اسان ڪندا آهيون پيغام چيڪ ڪريو bounced يا نه جيڪڏهن bounced، پوءِ اسان ان کي نظرانداز ڪريون ٿا. bounced مطلب ته معاهدو گرام واپس ڪندو جيڪڏهن ڪجهه غلطي ٿئي ٿي. اسان گرام واپس نه ڪنداسين جيڪڏهن ڪو غلطي اوچتو ٿئي ٿي.

اسان چيڪ ڪريون ٿا، جيڪڏهن بيلنس اڌ گرام کان گهٽ آهي، ته اسان صرف پيغام کي قبول ڪريون ٿا ۽ ان کي نظرانداز ڪريون ٿا.

اڳيون، اسان سمارٽ معاهدي جي ايڊريس کي پارس ڪريون ٿا جتان پيغام آيو.

اسان اسٽوريج مان ڊيٽا پڙهون ٿا ۽ پوء تاريخ مان پراڻي شرطن کي حذف ڪريو جيڪڏهن انهن مان ويهن کان وڌيڪ آهن. سهولت لاءِ، مون ٽي اضافي ڪم لکيا pack_order(), unpack_order(), remove_old_orders().

اڳيون، اسان ڏسون ٿا ته بيلنس ادائگي لاء ڪافي نه آهي، پوء اسان سمجهون ٿا ته هي هڪ شرط نه آهي، پر هڪ replenishment ۽ بچاء orders.

پوء آخرڪار سمارٽ معاهدي جو بنياد.

پهرين، جيڪڏهن پليئر وڃائي ٿو، اسان ان کي بيٽنگ جي تاريخ ۾ محفوظ ڪريون ٿا ۽ جيڪڏهن رقم 3 گرام کان وڌيڪ آهي، اسان 1/3 سمارٽ معاهدي جي مالڪ ڏانهن موڪليندا آهيون.

جيڪڏهن پليئر کٽي ٿو، ته پوءِ اسان پليئر جي ايڊريس تي ٻيڻو رقم موڪليندا آهيون ۽ پوءِ تاريخ ۾ شرط بابت معلومات محفوظ ڪندا آهيون.

() recv_internal(int order_amount, cell in_msg_cell, slice in_msg) impure {
    var cs = in_msg_cell.begin_parse();
    int flags = cs~load_uint(4);  ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
    if (flags & 1) { ;; ignore bounced
        return ();
    }
    if (order_amount < 500000000) { ;; just receive grams without changing state 
        return ();
    }
    slice src_addr_slice = cs~load_msg_addr();
    (int src_wc, int src_addr) = parse_std_addr(src_addr_slice);
    (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();
    orders = remove_old_orders(orders, order_seqno);
    if (balance() < 2 * order_amount + 500000000) { ;; not enough grams to pay the bet back, so this is re-fill
        builder order = pack_order(order_seqno, 1, now(), order_amount, src_wc, src_addr);
        orders~udict_set_builder(32, order_seqno, order);
        set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
        return ();
    }
    if (rand(10) >= 4) {
        builder order = pack_order(order_seqno, 3, now(), order_amount, src_wc, src_addr);
        orders~udict_set_builder(32, order_seqno, order);
        set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
        if (order_amount > 3000000000) {
            send_grams(owner_wc, owner_account_id, order_amount / 3);
        }
        return ();
    }
    send_grams(src_wc, src_addr, 2 * order_amount);
    builder order = pack_order(order_seqno, 2, now(), order_amount, src_wc, src_addr);
    orders~udict_set_builder(32, order_seqno, order);
    set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins + 1, incoming_amount, outgoing_amount + 2 * order_amount, owner_wc, owner_account_id, orders));
}

اهو سڀ ڪجهه آهي. ملندڙ وابستگي.

هاڻي اهو سڀ ڪجهه سادو آهي، اچو ته حاصل ڪرڻ جا طريقا ٺاهيون ته جيئن اسان ٻاهرين دنيا کان معاهدي جي حالت بابت معلومات حاصل ڪري سگهون (حقيقت ۾، انهن جي سمارٽ ڪانٽريڪٽ اسٽوريج مان ڊيٽا پڙهو).

اچو ته حاصل ڪرڻ جا طريقا شامل ڪريو. اسان هيٺ لکنداسين ته ڪيئن حاصل ڪجي معلومات سمارٽ ڪانٽريڪٽ بابت.

مون اهو ڪوڊ شامل ڪرڻ به وساري ڇڏيو آهي جيڪو پهرين درخواست تي عمل ڪندو جيڪو سمارٽ معاهدو شايع ڪرڻ وقت ٿئي ٿو. ملندڙ وابستگي. ۽ اڳتي درست ڪيو مالڪ جي اڪائونٽ ۾ رقم جو 1/3 موڪلڻ سان بگ.

ايندڙ قدم سمارٽ معاهدي کي شايع ڪرڻ آهي. اچو ته هڪ فولڊر ٺاهي requests.

مون پبليڪيشن ڪوڊ کي بنياد طور ورتو simple-wallet-code.fc ڪهڙو ملي سگهي ٿو سرڪاري مخزن ۾.

ڪجهه ڌيان ڏيڻ جي قابل. اسان ٺاھيون ٿا سمارٽ ڪانٽريڪٽ اسٽوريج ۽ ھڪ ان پٽ پيغام. ان کان پوء، سمارٽ معاهدي جو پتو ٺاھيو ويندو آھي، اھو آھي، پتو TON ۾ اشاعت کان اڳ به معلوم ٿئي ٿو. اڳيون، توهان کي هن ايڊريس تي ڪيترائي گرام موڪلڻ جي ضرورت آهي، ۽ صرف ان کان پوء توهان کي سمارٽ معاهدي سان هڪ فائل موڪلڻ جي ضرورت آهي، ڇو ته نيٽورڪ سمارٽ ڪانٽريڪٽ ۽ ان ۾ آپريشنز کي محفوظ ڪرڻ لاءِ ڪميشن وٺندو آهي (تصديق ڪندڙ جيڪي سمارٽ کي اسٽور ۽ ان تي عمل ڪندا آهن. معاهدو). ڪوڊ ڏسي سگھجي ٿو هتي.

اڳيون اسان پبلشنگ ڪوڊ تي عمل ڪيو ۽ حاصل ڪيو lottery-query.boc سمارٽ معاهدي فائل ۽ پتو.

~/TON/build/crypto/fift -s requests/new-lottery.fif 0

پيدا ٿيل فائلن کي محفوظ ڪرڻ نه وساريو: lottery-query.boc, lottery.addr, lottery.pk.

ٻين شين مان، اسان ڏسنداسين سمارٽ معاهدي جو پتو لڳائڻ جي لاگن ۾.

new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a 
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY

صرف تفريح لاءِ، اچو ته TON کي درخواست ڪريون

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json 
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

۽ اسان ڏسنداسين ته هن ايڊريس سان کاتو خالي آهي.

account state is empty

اسان ايڊريس تي موڪليندا آهيون 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 گرام ۽ ڪجھ سيڪنڊن کان پوء اسان ساڳيو حڪم جاري ڪريون ٿا. گرام موڪلڻ لاءِ آئون استعمال ڪريان ٿو سرڪاري پرس، ۽ توهان ڪنهن کي چيٽ مان ٽيسٽ گرام لاءِ پڇي سگهو ٿا، جنهن بابت آئون مضمون جي آخر ۾ ڳالهائيندس.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

لڳي ٿو اڻ شروع ٿيل (state:account_uninit) هڪ سمارٽ معاهدو ساڳئي پتي سان ۽ 1 نانوگرامس جو بيلنس.

account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:1)
      bits:(var_uint len:1 value:103)
      public_cells:(var_uint len:0 value:0)) last_paid:1583257959
    due_payment:nothing)
  storage:(account_storage last_trans_lt:3825478000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:2000000000))
      other:(extra_currencies
        dict:hme_empty))
    state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng

هاڻي اچو ته سمارٽ معاهدو شايع ڪريون. اچو ته لائيٽ ڪلائنٽ لانچ ڪريو ۽ عمل ڪريو.

> sendfile lottery-query.boc
[ 1][t 2][1583008371.631410122][lite-client.cpp:966][!testnode] sending query from file lottery-query.boc
[ 3][t 1][1583008371.828550100][lite-client.cpp:976][!query]    external message status is 1 

اچو ته چيڪ ڪريو ته معاهدو شايع ڪيو ويو آهي.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

ٻين شين جي وچ ۾ اسان حاصل ڪندا آهيون.

  storage:(account_storage last_trans_lt:3825499000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:1987150999))
      other:(extra_currencies
        dict:hme_empty))
    state:(account_active

اسان اهو ڏسون ٿا account_active.

تبديلين سان مطابقت ھتي صحيح آھي.

هاڻي اچو ته سمارٽ معاهدي سان رابطو ڪرڻ لاءِ درخواستون ٺاهيون.

وڌيڪ واضح طور تي، اسان پهرين کي ڇڏينداسين ايڊريس کي تبديل ڪرڻ لاءِ هڪ آزاد ڪم جي طور تي، ۽ ٻيو ڪنداسين مالڪ جي ايڊريس تي گرام موڪلڻ لاءِ. حقيقت ۾، اسان کي ساڳيو ڪم ڪرڻو پوندو جيئن گرام موڪلڻ جي امتحان ۾.

اھو اھو پيغام آھي جيڪو اسان سمارٽ معاهدي ڏانھن موڪلينداسين، جتي msg_seqno 165، action موڪلڻ لاء 2 ۽ 9.5 گرام.

<b 165 32 u, 2 7 u, 9500000000 Gram, b>

پيغام کي سائن ان ڪرڻ نه وساريو پنهنجي خانگي چاٻي سان lottery.pk، جيڪو سمارٽ معاهدو ٺاهڻ وقت اڳ ۾ ٺاهيو ويو هو. هتي لاڳاپيل عهدو آهي.

حاصل ڪرڻ جا طريقا استعمال ڪندي سمارٽ معاهدي کان معلومات حاصل ڪرڻ

هاڻي اچو ته ڏسو سمارٽ ڪانٽريڪٽ حاصل ڪرڻ جا طريقا ڪيئن هلايا وڃن.

لانچ lite-client ۽ حاصل ڪرڻ جا طريقا ھلايو جيڪي اسان لکيون آھن.

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments:  [ 104128 ] 
result:  [ 64633878952 ] 
...

В result قيمت تي مشتمل آهي جيڪو فنڪشن واپس ڪري ٿو balance() اسان جي سمارٽ معاهدي کان.
اسان ڪيترن ئي طريقن سان ساڳيو ڪنداسين.

> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments:  [ 77871 ] 
result:  [ 1 ] 

اچو ته توهان جي شرط جي تاريخ جي درخواست ڪريو.

> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_orders
...
arguments:  [ 67442 ] 
result:  [ ([0 1 1583258284 10000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [1 3 1583258347 4000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [2 1 1583259901 50000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308]) ] 

اسان لائٽ ڪلائنٽ استعمال ڪنداسين ۽ سائيٽ تي سمارٽ معاهدي بابت معلومات ڏيکارڻ لاءِ طريقا حاصل ڪنداسين.

ويب سائيٽ تي سمارٽ معاهدي جي ڊيٽا کي ڏيکاريندي

مون پيٿون ۾ هڪ سادي ويب سائيٽ لکي سمارٽ ڪانٽريڪٽ مان ڊيٽا کي آسان طريقي سان ظاهر ڪرڻ لاءِ. هتي آئون ان تي تفصيل سان نه ڳالهائيندس ۽ سائيٽ شايع ڪندس هڪ عهد ۾.

TON کان درخواستون ڪيون ويون آهن Python مدد سان lite-client. سهولت لاءِ، سائيٽ ڊاڪر ۾ پيڪ ٿيل آهي ۽ گوگل ڪلائوڊ تي شايع ٿيل آهي. ڳنڍ.

ڪوشش ڪندي

ھاڻي ڪوشش ڪريون ته اُتي گرام موڪلڻ لاءِ اُتي کان ڀرڻ لاءِ پرس. اسان 40 گرام موڪلينداسين. ۽ اچو ته وضاحت لاءِ ڪجهه شرط رکون. اسان ڏسون ٿا ته سائيٽ ڏيکاري ٿي شرطن جي تاريخ، موجوده کٽڻ جو سيڪڙو ۽ ٻيو مفيد معلومات.

اسان ڏسون ٿاته اسان پهريون کٽيو، ٻيو هارايو.

پوء

مضمون منهنجي توقع کان گهڻو ڊگهو نڪتو، ٿي سگهي ٿو اهو ننڍو هجي، يا ٿي سگهي ٿو صرف ان شخص لاءِ جيڪو TON بابت ڪجهه به نه ٿو ڄاڻي ۽ لکڻ ۽ شايع ڪرڻ چاهي ٿو هڪ غير معمولي سمارٽ معاهدو لکڻ ۽ شايع ڪرڻ جي صلاحيت سان. اهو. شايد ڪجهه شيون وڌيڪ آسانيءَ سان بيان ڪري سگهجن ٿيون.

ٿي سگهي ٿو ته ان تي عملدرآمد جا ڪجهه پهلو وڌيڪ موثر ۽ خوبصورتيءَ سان ڪيا وڃن ها، پر پوءِ به مضمون تيار ڪرڻ ۾ اڃا وڌيڪ وقت لڳي ها. اهو پڻ ممڪن آهي ته مون ڪٿي غلطي ڪئي هجي يا ڪجهه سمجهي نه سگهيو، تنهنڪري جيڪڏهن توهان ڪجهه سنجيده ڪم ڪري رهيا آهيو، توهان کي TON ڪوڊ سان سرڪاري دستاويز يا سرڪاري مخزن تي ڀروسو ڪرڻو پوندو.

اهو ياد رکڻ گهرجي ته TON پاڻ اڃا تائين ترقي جي فعال اسٽيج ۾ آهي، تبديليون ٿي سگهن ٿيون جيڪي هن مضمون جي ڪنهن به مرحلن کي ٽوڙي ڇڏيندا آهن (جيڪو مون لکڻ دوران ٿيو، اهو اڳ ۾ ئي درست ڪيو ويو آهي)، پر عام طريقو آهي. تبديل ٿيڻ ممڪن ناهي.

مان TON جي مستقبل بابت نه ڳالهائيندس. شايد پليٽ فارم ڪجهه وڏو بڻجي ويندو ۽ اسان کي ان جي مطالعي ۾ وقت گذارڻ گهرجي ۽ هاڻي اسان جي شين سان هڪ جڳهه ڀريو.

فيس بڪ کان ليبرا پڻ آهي، جنهن ۾ صارفين جو امڪاني سامعين TON کان وڏو آهي. مان لبرا جي باري ۾ تقريبن ڪجھ به نه ڄاڻان ٿو، فورم طرفان فيصلو ڪيو ويو ته اتي TON ڪميونٽي جي ڀيٽ ۾ تمام گهڻو سرگرمي آهي. جيتوڻيڪ TON جي ڊولپرز ۽ ڪميونٽي وڌيڪ زير زمين وانگر آهن، جيڪو پڻ ٿڌو آهي.

حوالن

  1. TON تي سرڪاري دستاويز: https://test.ton.org
  2. سرڪاري TON مخزن: https://github.com/ton-blockchain/ton
  3. مختلف پليٽ فارمن لاءِ سرڪاري پرس: https://wallet.ton.org
  4. هن آرٽيڪل مان سمارٽ معاهدو مخزن: https://github.com/raiym/astonished
  5. سمارٽ معاهدي جي ويب سائيٽ ڏانهن لنڪ: https://ton-lottery.appspot.com
  6. بصري اسٽوڊيو ڪوڊ جي واڌ لاءِ مخزن فن سي لاءِ: https://github.com/raiym/func-visual-studio-plugin
  7. ٽيليگرام ۾ TON بابت چيٽ، جنهن واقعي ان کي شروعاتي اسٽيج تي معلوم ڪرڻ ۾ مدد ڪئي. مان سمجهان ٿو ته اها غلطي نه ٿيندي جيڪڏهن مان چوان ته هرڪو جيڪو TON لاء ڪجهه لکيو آهي اتي موجود آهي. توھان پڻ پڇي سگھو ٿا ٽيسٽ گرام لاءِ اتي. https://t.me/tondev_ru
  8. TON بابت هڪ ٻي چيٽ جنهن ۾ مون کي مفيد معلومات ملي. https://t.me/TONgramDev
  9. مقابلي جو پهريون مرحلو: https://contest.com/blockchain
  10. مقابلي جو ٻيو مرحلو: https://contest.com/blockchain-2

جو ذريعو: www.habr.com

تبصرو شامل ڪريو