TON တွင် စမတ်ကျသည့် စာချုပ်ကို မည်သို့ရေးနိုင်မည်နည်း။
ဒီဆောင်းပါးက ဘာအကြောင်းလဲ။
ဤဆောင်းပါးတွင်၊ ကျွန်ုပ်သည် Telegram blockchain ပြိုင်ဆိုင်မှုတွင် ပထမဆုံး (နှစ်ခု) တွင် ပါဝင်ခဲ့ပုံ၊ ဆုမရခဲ့ဘဲ မေ့ပျောက်ခြင်းသို့ နစ်မြုပ်မသွားစေရန် ဆောင်းပါးတစ်ပုဒ်တွင် အတွေ့အကြုံကို မှတ်တမ်းတင်ရန် ဆုံးဖြတ်ခဲ့ပြီး တစ်စုံတစ်ဦးကို ကူညီပေးခဲ့သည်။
စိတ္တဇကုဒ်ကို မရေးချင်သော်လည်း အလုပ်တစ်ခုခုလုပ်ရန်၊ ဆောင်းပါးအတွက် စမတ်စာချုပ်လက်ငင်းထီတစ်စောင်နှင့် အလယ်အလတ်သိုလှောင်မှုအသုံးမပြုဘဲ TON ထံမှ စမတ်စာချုပ်ဒေတာကို တိုက်ရိုက်ပြသသည့် ဝဘ်ဆိုက်တစ်ခုကို ရေးသားခဲ့သည်။
TON တွင် ၎င်းတို့၏ ပထမဆုံးသော စမတ်စာချုပ်ကို ပြုလုပ်လိုသူများအတွက် ဆောင်းပါးသည် အသုံးဝင်လိမ့်မည်၊ သို့သော် မည်သည့်နေရာတွင် စတင်ရမည်ကို မသိသောသူများအတွက် အသုံးဝင်မည်ဖြစ်ပါသည်။
ကံစမ်းမဲကို နမူနာအဖြစ် အသုံးပြု၍ ပတ်ဝန်းကျင်ကို ထည့်သွင်းခြင်းမှ စမတ်ကန်ထရိုက်တစ်ခု ထုတ်ဝေခြင်း၊ ၎င်းနှင့် အပြန်အလှန်ဆက်ဆံခြင်း၊ ဒေတာလက်ခံခြင်းနှင့် ထုတ်ဝေခြင်းအတွက် ဝဘ်ဆိုဒ်တစ်ခုရေးပါမည်။
ပြိုင်ပွဲတွင်ပါဝင်ခြင်းအကြောင်း
ပြီးခဲ့သည့်အောက်တိုဘာလတွင် Telegram သည်ဘာသာစကားအသစ်များဖြင့် blockchain ယှဉ်ပြိုင်မှုကိုကြေငြာခဲ့သည်။ Fift и FunC. စမတ်ကျတဲ့ စာချုပ်ငါးခုကြားကို ရွေးခဲ့ရတယ်။ အနာဂတ်မှာ တခြားဘာမှရေးစရာ မလိုတော့ရင်တောင် ထူးထူးခြားခြား တစ်ခုခုလုပ်၊ ဘာသာစကားတစ်ခု သင်ယူပြီး တစ်ခုခုလုပ်ရတာ ကောင်းမယ်ထင်တယ်။ ထို့အပြင် ခေါင်းစဉ်သည် လူတိုင်း၏ ပါးစပ်ဖျားတွင် အမြဲရှိနေပါသည်။
စမတ်ကန်ထရိုက်များ ရေးဆွဲရာတွင် အတွေ့အကြုံမရှိဟု ဆိုရကျိုးနပ်ပါသည်။
ကျွန်တော် တတ်နိုင်သလောက် အဆုံးအထိ ပါဝင်ဖို့ စီစဉ်ပြီး သုံးသပ်ချက် ဆောင်းပါးတစ်ပုဒ် ရေးခဲ့ပေမယ့် ပထမတစ်ပုဒ်မှာ ချက်ချင်း မအောင်မြင်ခဲ့ပါဘူး။ လက်မှတ်ပေါင်းများစွာဖြင့် ဖွင့်ထားသည်။ FunC ယေဘုယျအားဖြင့် အလုပ်လုပ်တယ်။ အခြေခံအဖြစ်ယူခဲ့တယ်။ .
အဲဒီတုန်းကတော့ အနည်းဆုံး ဆုနေရာတစ်ခုယူဖို့ လုံလောက်ပြီလို့ ထင်ပါတယ်။ နောက်ဆုံးတော့ ပါဝင်သူ 40 မှာ 60 လောက်က ဆုတွေရရှိခဲ့ပြီး ကျွန်တော်လည်း သူတို့ထဲမှာ မပါဝင်ပါဘူး။ ယေဘူယျအားဖြင့်၊ ဒီအတွက် ကြောက်စရာကောင်းတဲ့ အရာတစ်ခုမှ မရှိပါဘူး၊ ဒါပေမယ့် တစ်ခုတော့ စိတ်ရှုပ်စရာပါ။ ကျွန်ုပ်၏စာချုပ်အတွက် စစ်ဆေးမှုရလဒ်များအား ပြန်လည်သုံးသပ်ခြင်းရလဒ်များကို ကြေငြာချိန်တွင်၊ ကျွန်ုပ်သည် ချက်တင်တွင်ပါဝင်သူများအား အခြားမည်သူမျှမရှိ၊ မရှိကို မေးမြန်းခဲ့ပါသည်။
ကျွန်ုပ်၏စာများကို သတိပြုမိသည်မှာ နှစ်ရက်အကြာတွင် တရားသူကြီးများသည် မှတ်ချက်တစ်ခု ထုတ်ပြန်ခဲ့ပြီး တရားသူကြီးများသည် စီရင်ချက်ချစဉ်အတွင်း ကျွန်ုပ်၏ စမတ်ကျသော စာချုပ်ကို မတော်တဆ လွဲချော်သွားခြင်း ရှိ၊ မရှိ နားမလည်နိုင်ဘဲ ဖြစ်နေသည် သို့မဟုတ် မှတ်ချက်ပေးရန်မလိုတော့လောက်အောင် ဆိုးရွားသည်ဟု ရိုးရိုးရှင်းရှင်း ထင်မြင်မိပါသည်။ Page မှာ မေးခွန်းတစ်ခုမေးခဲ့ပေမယ့် အဖြေမရခဲ့ပါဘူး။ ဘယ်သူက လျှို့ဝှက်စွာ တရားစီရင်တာမှ မဟုတ်ပေမယ့် ကိုယ်ရေးကိုယ်တာ မက်ဆေ့ချ်တွေ ရေးဖို့ မလိုအပ်ဘူးလို့ ထင်ပါတယ်။
နားလည်ဖို့ အချိန်အများကြီးယူရတဲ့အတွက် ဆောင်းပါးတစ်ပုဒ်ရေးဖို့ ဆုံးဖြတ်ခဲ့ပါတယ်။ သတင်းအချက်အလက်များစွာမရှိသေးသောကြောင့်၊ ဆောင်းပါးသည်စိတ်ဝင်စားသူတိုင်းအတွက်အချိန်ကုန်သက်သာစေလိမ့်မည်။
TON တွင် စမတ်စာချုပ်များ၏ သဘောတရား
ဘာမှ မရေးခင်မှာ ဒီအရာကို ချဉ်းကပ်ဖို့ ဘယ်ဘက်ခြမ်းကနေ အဖြေရှာဖို့ လိုပါတယ်။ ဒါကြောင့် အခု System မှာ ဘယ်အပိုင်းတွေ ပါဝင်လဲဆိုတာ ပြောပြပါမယ်။ ပိုတိတိကျကျပြောရရင် အနည်းဆုံး အလုပ်သဘောတူစာချုပ်ကို ရေးနိုင်ဖို့ ဘယ်အပိုင်းတွေ သိထားဖို့ လိုလဲ။
ကျွန်ုပ်တို့သည် စမတ်ကျသော စာချုပ်တစ်ခုကို ရေးသားပြီး လက်တွဲလုပ်ဆောင်ရန် အာရုံစိုက်ပါမည်။ TON Virtual Machine (TVM), Fift и FunCထို့ကြောင့် ဆောင်းပါးသည် ပုံမှန်ပရိုဂရမ်တစ်ခု၏ ဖွံ့ဖြိုးတိုးတက်မှုဖော်ပြချက်နှင့် ပိုတူသည်။ ပလက်ဖောင်းကိုယ်တိုင်က ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာကို ဒီမှာနေမှာမဟုတ်ဘူး။
ယေဘုယျအားဖြင့်၎င်းသည်မည်သို့အလုပ်လုပ်သည်နှင့် ပတ်သက်၍ TVM နှင့် ဘာသာစကား Fift တရားဝင်စာရွက်စာတမ်းကောင်းတွေရှိတယ်။ ပြိုင်ပွဲကာလအတွင်းနှင့် ယခုလက်ရှိစာချုပ်ကို ရေးသားနေစဉ်၊ ကျွန်တော်သည် ၎င်းကို မကြာခဏ ရည်ညွှန်းပါသည်။
စမတ်စာချုပ်များကို ရေးသားသည့် အဓိကဘာသာစကားမှာ FunC. ၎င်းတွင် လောလောဆယ် စာရွက်စာတမ်းမရှိသောကြောင့် တစ်ခုခုရေးရန်အတွက်၊ တရားဝင်သိုလှောင်မှုမှ စမတ်စာချုပ်များနမူနာများကို လေ့လာရန် လိုအပ်ပြီး ထိုနေရာတွင် ဘာသာစကားကိုယ်တိုင် အကောင်အထည်ဖော်ခြင်းအပြင် ပြီးခဲ့သော ပြိုင်ပွဲနှစ်ခုအတွက် စမတ်စာချုပ်များ နမူနာများကို သင်ကြည့်ရှုနိုင်ပါသည်။ ဆောင်းပါး၏အဆုံးတွင်လင့်ခ်များ။
ကျွန်ုပ်တို့သည် စမတ်ကျသော စာချုပ်ကို ရေးပြီးပြီ ဆိုကြပါစို့ FunCပြီးနောက်၊ ကျွန်ုပ်တို့သည် ကုဒ်ကို Fift assembler တွင် စုစည်းသည်။
ပြုစုထားသော စမတ်စာချုပ်ကို ထုတ်ပြန်ရန် ကျန်နေသေးသည်။ ဒီလိုလုပ်ဖို့၊ သင်က function ကိုရေးဖို့လိုအပ်ပါတယ်။ Fiftစမတ်စာချုပ်ကုဒ်နှင့် ထည့်သွင်းမှုအဖြစ် အချို့သော ကန့်သတ်ချက်များကို လက်ခံမည်ဖြစ်ပြီး ရလဒ်သည် တိုးချဲ့မှုနှင့်အတူ ဖိုင်တစ်ခု ဖြစ်လိမ့်မည်၊ .boc (ဆိုလိုသည်မှာ "ဆဲလ်အိတ်များ" ဟု အဓိပ္ပါယ်ရသော)၊ ၎င်းကို ကျွန်ုပ်တို့ ရေးထားပုံပေါ် မူတည်၍ လျှို့ဝှက်သော့နှင့် စမတ်စာချုပ်ကုဒ်ကို အခြေခံ၍ ထုတ်လုပ်သည့် လိပ်စာတစ်ခု၊ ထုတ်ပြန်ခြင်းမပြုရသေးသည့် စမတ်စာချုပ်လိပ်စာသို့ ဂရမ်ကို သင် ပေးပို့နိုင်ပါသည်။
TON တွင် စမတ်စာချုပ်တစ်ခု ထုတ်ဝေရန် လက်ခံရရှိခဲ့သည်။ .boc ဖိုင်ကို light client ကိုအသုံးပြုပြီး blockchain သို့ပေးပို့ရန်လိုအပ်သည် (အောက်ပါအချက်အပေါ်ပိုမို) ။ သို့သော် ထုတ်ဝေခြင်းမပြုမီ၊ သင်သည် ထုတ်လုပ်ထားသော လိပ်စာသို့ ဂရမ်လွှဲပြောင်းရန် လိုအပ်သည်၊ သို့မဟုတ်ပါက စမတ်စာချုပ်ကို ထုတ်ပြန်မည်မဟုတ်ပါ။ ထုတ်ဝေပြီးနောက်၊ ပြင်ပမှ မက်ဆေ့ဂျ်များ ပေးပို့ခြင်းဖြင့် (ဥပမာ၊ ပေါ့ပါးသော ကလိုင်းယင့်) သို့မဟုတ် အတွင်းမှ (ဥပမာ၊ စမတ်စာချုပ်တစ်ခုသည် TON အတွင်းရှိ အခြားမက်ဆေ့ဂျ်တစ်ခု ပေးပို့ခြင်း) ဖြင့် အပြန်အလှန် တုံ့ပြန်နိုင်ပါသည်။
ကုဒ်ကို မည်သို့ထုတ်ဝေကြောင်း ကျွန်ုပ်တို့နားလည်ပြီးနောက်၊ ၎င်းသည် ပိုမိုလွယ်ကူလာသည်။ ကျွန်တော်တို့ ဘာရေးချင်လဲ ဆိုတာကို အကြမ်းဖျင်း သိပါတယ်။ စာရေးနေစဉ်တွင်၊ ၎င်းကို လက်ရှိစမတ်ကန်ထရိုက်များတွင် မည်သို့အကောင်အထည်ဖော်နေပြီဖြစ်သည် သို့မဟုတ် အကောင်အထည်ဖော်မှုကုဒ်ကို ကျွန်ုပ်တို့ရှာဖွေနေပါသည်။ Fift и FunC တရားဝင် repository တွင် သို့မဟုတ် တရားဝင်စာရွက်စာတမ်းများတွင် ကြည့်ရှုပါ။
ပြိုင်ပွဲတွင်ပါဝင်သူများနှင့် Telegram ဝန်ထမ်းများစုဝေးရာ Telegram chat တွင် သော့ချက်စကားလုံးများကို ကျွန်ုပ်ရှာဖွေလေ့ရှိသည်၊ ထို့ကြောင့် ပြိုင်ပွဲကာလအတွင်း လူတိုင်းစုပြီး Fift နှင့် FunC ကို စတင်ဆွေးနွေးခဲ့ကြပါသည်။ ဆောင်းပါး၏အဆုံးတွင်လင့်ခ်။
သီအိုရီမှ လက်တွေ့သို့ ရွှေ့ရန် အချိန်ရောက်ပြီ။
TON နှင့် အလုပ်လုပ်ရန်အတွက် ပတ်ဝန်းကျင်ကို ပြင်ဆင်ခြင်း။
MacOS မှာ ဆောင်းပါးမှာ ဖော်ပြမယ့် အရာအားလုံးကို ကျွန်တော် လုပ်ခဲ့ပြီး နှစ်ခါပြန်စစ်ဆေးခဲ့ပါတယ် Ubuntu Docker မှာ 18.04 LTS ရှိပါတယ်။
ပထမဆုံးလုပ်ရမှာက ဒေါင်းလုဒ်လုပ်ပြီး install လုပ်ပါ။ lite-client သင် TON သို့တောင်းဆိုမှုများပေးပို့နိုင်သည်။
တရားဝင်ဝက်ဘ်ဆိုက်ရှိ ညွှန်ကြားချက်များတွင် ထည့်သွင်းခြင်းလုပ်ငန်းစဉ်ကို အတော်လေးပြည့်စုံစွာဖော်ပြထားပြီး အသေးစိတ်အချက်အလက်အချို့ကို ချန်လှပ်ထားသည်။ ဤနေရာတွင် ညွှန်ကြားချက်များကို လိုက်နာပြီး လမ်းတစ်လျှောက်တွင် ပျောက်ဆုံးနေသော dependencies များကို ထည့်သွင်းပါသည်။ ကျွန်တော်ကိုယ်တိုင် ပရောဂျက်တစ်ခုချင်းစီကို compile မလုပ်ဘဲ တရားဝင် repository မှ ထည့်သွင်းခဲ့ခြင်းမဟုတ်ပါ။ 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 repository ကိုပွားများပါ။ အဆင်ပြေစေရန်၊ ကျွန်ုပ်တို့သည် ဖိုင်တွဲတွင် အရာအားလုံးကို လုပ်ဆောင်ပါမည်။ ~/TON.
cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursiveသိုလှောင်မှုတွင် အကောင်အထည်ဖော်မှုများကိုလည်း သိမ်းဆည်းထားသည်။ Fift и FunC.
အခု ကျွန်တော်တို့ စီမံကိန်းကို တည်ဆောက်ဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။ သိုလှောင်ကုဒ်ကို ဖိုဒါထဲသို့ ကူးထည့်ထားသည်။ ~/TON/ton။ အဆိုပါ ~/TON folder တစ်ခုဖန်တီးပါ။ 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ထို့နောက်၊ မည်သည့် node နှင့်ပတ်သက်သည့်ဒေတာများပါရှိသော configuration ဖိုင်ကိုကျွန်ုပ်တို့ဒေါင်းလုဒ်လုပ်ပါ။ lite-client ချိတ်ဆက်ပါလိမ့်မယ်။
wget https://test.ton.org/ton-lite-client-test1.config.jsonTON သို့ ဦးစွာတောင်းဆိုမှုများ ပြုလုပ်ခဲ့သည်။
ကဲ စလိုက်ကြရအောင် lite-client.
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.jsonတည်ဆောက်မှုအောင်မြင်ပါက၊ စတင်ပြီးနောက်တွင် light client ၏ချိတ်ဆက်မှုမှတ်တမ်းကို node သို့တွေ့ရပါမည်။
[ 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)
...သင် command ကို execute လုပ်နိုင်ပါတယ်။ help မည်သည့် command များရရှိနိုင်သည်ကိုကြည့်ပါ။
helpဤဆောင်းပါးတွင်ကျွန်ုပ်တို့အသုံးပြုမည့် command များကိုစာရင်းပြုစုကြပါစို့။
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 parameterslast получает последний созданный блок с сервера.
sendfile <filename> отправляет в TON файл с сообщением, именно с помощью этой команды публикуется смарт-контракт и запрсосы к нему.
getaccount <addr> загружает текущее состояние смарт-контракта с указанным адресом.
runmethod <addr> [<block-id-ext>] <method-id> <params> запускает get-методы смартконтракта. အခု စာချုပ်ကို ကိုယ်တိုင်ရေးဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။
အကောင်အထည်ဖော်မှု
စိတ်ကူး
အထက်မှာ ရေးခဲ့သလိုပဲ၊ ငါတို့ရေးနေတဲ့ စမတ်စာချုပ်ဟာ ထီပေါက်တယ်။
ထို့အပြင်၊ ၎င်းသည် သင်လက်မှတ်ဝယ်ပြီး တစ်နာရီ၊ တစ်ရက် သို့မဟုတ် တစ်လစောင့်ရန် လိုအပ်သည့်ထီမဟုတ်သော်လည်း သုံးစွဲသူက စာချုပ်လိပ်စာသို့ လွှဲပြောင်းပေးသည့် ချက်ခြင်းတစ်ခုဖြစ်သည်။ N ဂရမ်၊ ချက်ခြင်းပြန်ရနိုင်သည်။ 2 * N ဂရမ် သို့မဟုတ် ရှုံးသည်။ ကျွန်ုပ်တို့သည် အနိုင်ရရန် ဖြစ်နိုင်ခြေ 40% ခန့်ကို ပြုလုပ်ပါမည်။ ငွေပေးချေရန် ဂရမ်မလုံလောက်ပါက၊ ငွေပေးငွေယူကို ဖြည့်ဆည်းမှုအဖြစ် ထည့်သွင်းစဉ်းစားပါမည်။
ထို့အပြင်၊ အလောင်းအစားများကို အချိန်နှင့်တပြေးညီ အဆင်ပြေသောပုံစံဖြင့် မြင်တွေ့နိုင်စေရန်အတွက် အသုံးပြုသူသည် အနိုင်ရသည်ဖြစ်စေ ရှုံးသည်ဖြစ်စေ ချက်ချင်းနားလည်နိုင်စေရန် အရေးကြီးပါသည်။ ထို့ကြောင့် TON မှ လောင်းကစားများနှင့် ရလဒ်များကို တိုက်ရိုက်ပြသမည့် ဝဘ်ဆိုဒ်တစ်ခုကို ဖန်တီးရန် လိုအပ်ပါသည်။
စမတ်ကျတဲ့ စာချုပ်တစ်ခုရေးပါ။
အဆင်ပြေစေရန်အတွက်၊ ကျွန်ုပ်သည် FunC အတွက် ကုဒ်မီးမောင်းထိုးပြထားပါသည်၊ ပလပ်အင်ကို Visual Studio ကုဒ်ရှာဖွေမှုတွင် ရှာတွေ့နိုင်ပြီး တစ်ခုခုကို ရုတ်တရက်ထည့်လိုပါက၊ ထို့နောက်တွင် ပလပ်အင်ကို အများသူငှာ ဒိုမိန်းတွင် တင်ပေးထားပါသည်။ ထို့အပြင်၊ တစ်စုံတစ်ဦးသည် ယခင်က Fift နှင့်အလုပ်လုပ်ရန်အတွက် ပလပ်အင်တစ်ခုပြုလုပ်ခဲ့ပြီး၊ သင်သည် ၎င်းကိုထည့်သွင်းပြီး VSC တွင်ရှာဖွေနိုင်သည်။
အလယ်အလတ်ရလဒ်များကို ကျွန်ုပ်တို့လုပ်ဆောင်မည့် သိုလှောင်ခန်းတစ်ခုကို ချက်ချင်းဖန်တီးကြပါစို့။
ကျွန်ုပ်တို့၏ဘဝပိုမိုလွယ်ကူစေရန်၊ ကျွန်ုပ်တို့သည် စမတ်စာချုပ်တစ်ခုရေးပြီး အဆင်သင့်မဖြစ်မီအထိ ၎င်းကို ပြည်တွင်း၌ စမ်းသပ်မည်ဖြစ်သည်။ သို့မှသာ ကျွန်ုပ်တို့သည် ၎င်းကို TON ဖြင့် ထုတ်ဝေပါမည်။
စမတ်စာချုပ်တွင် ခေါ်နိုင်သော ပြင်ပနည်းလမ်းနှစ်ခုရှိသည်။ ပထမဆုံး, recv_external() စာချုပ်ကို ပြင်ပကမ္ဘာမှ တောင်းဆိုမှုတစ်ခုသည် TON မှမဟုတ်ဘဲ ဥပမာအားဖြင့် ကျွန်ုပ်တို့ကိုယ်တိုင် မက်ဆေ့ချ်တစ်ခုဖွဲ့ကာ lite-client မှတစ်ဆင့် ပေးပို့သည့်အခါ ဤလုပ်ဆောင်ချက်ကို လုပ်ဆောင်ပါသည်။ ဒုတိယ၊ recv_internal() TON အတွင်းရှိ အချို့သော စာချုပ်များသည် ကျွန်ုပ်တို့၏ လုပ်ငန်းကို ရည်ညွှန်းသည့်အခါ ဖြစ်ပါသည်။ နှစ်ခုလုံးတွင်၊ ဘောင်များကို function သို့ကူးနိုင်သည်။
ထုတ်ဝေလိုက်လျှင် အလုပ်ဖြစ်မည့် ရိုးရှင်းသော ဥပမာတစ်ခုဖြင့် စတင်ကြပါစို့၊ သို့သော် ၎င်းသည် မည်သည့်လုပ်ဆောင်နိုင်စွမ်းကိုမျှ မပေးဆောင်ပါ။
() 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 compile လုပ်ပါ။
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc အလံများ၏အဓိပ္ပာယ်ကို command ဖြင့်ကြည့်ရှုနိုင်သည်။
~/TON/build/crypto/func -helpစုစည်းထားသော Fift assembler ကုဒ်ကို ကျွန်ုပ်တို့ ရရှိပါသည်။ 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၎င်းသည် Fift assembler အတွက် Fift ဖြင့်ရေးထားသောကုဒ်ဖြစ်သည်။
ကျွန်ုပ်တို့သည် စမတ်စာချုပ်ကို စက်တွင်းတွင် လုပ်ဆောင်ပြီး စမ်းသပ်လိုသောကြောင့်၊ ဖိုင်တစ်ခု ဖန်တီးပါမည်။ lottery-test-suite.fif ထိုနေရာတွင် စုစည်းထားသော ကုဒ်ကို ကူးယူပြီး ၎င်းရှိ နောက်ဆုံးစာကြောင်းကို အစားထိုးကာ၊ စမတ်စာချုပ်ကုဒ်ကို ကိန်းသေအဖြစ် ရေးပေးသည်။ codeထို့နောက် ၎င်းကို virtual machine သို့ လွှဲပြောင်းနိုင်စေရန်၊
"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 ကို စတင်မည့် ဒေတာ (သို့မဟုတ် ကွန်ရက်အခြေအနေ) ဟူသော စကားရပ်ကို မှတ်တမ်းတင်ပါသည်။ ပြိုင်ပွဲကာလအတွင်းမှာပင် developer တစ်ဦးက ဖန်တီးပုံကို ပြသခဲ့သည်။ c7 ကော်ပီကူးတယ်။ ဤဆောင်းပါး၌ကျွန်ုပ်တို့ပြောင်းလဲရန်လိုအပ်နိုင်ပါသည်။ rand_seed ကျပန်းနံပါတ်တစ်ခု၏ မျိုးဆက်သည် ၎င်းပေါ်တွင်မူတည်ပြီး မပြောင်းလဲနိုင်သောကြောင့် အကြိမ်တိုင်း တူညီသောနံပါတ်ကို ပြန်ပေးမည်ဖြစ်သည်။
recv_internal и recv_external တန်ဖိုး 0 နှင့် -1 ရှိသော ကိန်းသေများသည် စမတ်စာချုပ်တွင် သက်ဆိုင်သည့် လုပ်ဆောင်ချက်များကို ခေါ်ဆိုရန်အတွက် တာဝန်ယူပါမည်။
ယခု ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ အချည်းနှီးသော စမတ်စာချုပ်အတွက် ပထမဆုံးစမ်းသပ်မှုကို ဖန်တီးရန် အဆင်သင့်ဖြစ်နေပါပြီ။ ရှင်းရှင်းလင်းလင်းသိရန်၊ ကျွန်ုပ်တို့သည် လက်ရှိတွင် တူညီသောဖိုင်တွင် စမ်းသပ်မှုအားလုံးကို ပေါင်းထည့်ပါမည်။ lottery-test-suite.fif.
variable တစ်ခုဖန်တီးကြည့်ရအောင် storage အလွတ်တစ်ခုကို ရေးပါ။ cell၎င်းသည် စမတ်စာချုပ်၏ သိုလှောင်မှုဖြစ်လိမ့်မည်။
message ဤသည်မှာ ပြင်ပမှ စမတ်အဆက်အသွယ်ထံသို့ ပေးပို့မည့် မက်ဆေ့ချ်ဖြစ်သည်။ လောလောဆယ်တော့ အဲဒါကို အလွတ်ထားခဲ့မယ်။
variable storage
<b b> storage !
variable message
<b b> message ! ကျွန်ုပ်တို့သည် ကိန်းသေများနှင့် ကိန်းရှင်များကို ပြင်ဆင်ပြီးပါက၊ ကျွန်ုပ်တို့သည် TVM ကို command ကို အသုံးပြု၍ လုပ်ဆောင်သည်။ runvmctx နှင့် ဖန်တီးထားသော ဘောင်များကို ထည့်သွင်းရန်။
message @
recv_external
code
storage @
c7
runvmctx အဆုံးတွင်ကျွန်ုပ်တို့အောင်မြင်လိမ့်မည်။ အလယ်အလတ်ကုဒ်ကို ဖွင့်ပါ။ Fift.
ယခုကျွန်ုပ်တို့ရရှိလာသောကုဒ်ကို run နိုင်သည်။
export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняем один раз для удобства
~/TON/build/crypto/fift -s lottery-test-suite.fif ပရိုဂရမ်သည် အမှားအယွင်းမရှိဘဲ လုပ်ဆောင်သင့်ပြီး output တွင် execution log ကိုတွေ့ရပါမည်။
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 ပြီးတော့ စာမေးပွဲကို error တစ်ခုနဲ့ လုပ်ဆောင်တာကို တွေ့ရပါလိမ့်မယ်။
[ 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 ရလာတဲ့ကုဒ်ကို Copy ကူးလိုက်ပါ။ lottery-test-suite.fifနောက်ဆုံးစာကြောင်းကို အစားထိုးဖို့ မမေ့ပါနဲ့။
စာမေးပွဲ အောင်မြင်ကြောင်း စစ်ဆေးကြည့်ရအောင်။
~/TON/build/crypto/fift -s lottery-test-suite.fifလက်ရှိရလဒ်များနှင့်အတူ သက်ဆိုင်ရာ ကတိကဝတ်ကို သင်တွေ့မြင်နိုင်ပါသည်။
စမ်းသပ်မှုများဖြင့် ဖိုင်ထဲသို့ စမတ်စာချုပ်၏ စုစည်းကုဒ်ကို အဆက်မပြတ်ကူးယူရန် အဆင်မပြေကြောင်း သတိပြုပါ၊ ထို့ကြောင့် ကျွန်ုပ်တို့အတွက် ကုဒ်ကို ကိန်းသေအဖြစ်သို့ ရေးပေးမည့် script တစ်ခုကို ရေးသားမည်ဖြစ်ပြီး၊ စုစည်းထားသော ကုဒ်ကို ကျွန်ုပ်တို့အသုံးပြု၍ စမ်းသပ်မှုများနှင့် ရိုးရိုးရှင်းရှင်းချိတ်ဆက်ပါမည်။ "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.
compiled ဖိုင်ကို ရိုးရိုးလေးပွားမယ့် sh script မှာ ကုဒ်တချို့ထည့်ကြည့်ရအောင် 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ယခုစစ်ဆေးရန် ရလဒ် script ကို run ကြပါစို့၊ ဖိုင်တစ်ခုထုတ်ပေးလိမ့်မည်။ 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 စာမေးပွဲများကို စုစည်းပြီး ချက်ချင်းလုပ်ဆောင်ပေးပါမည်။ ဒီမှာ link တစ်ခုရှိတယ်။ .
ကောင်းပြီ၊ ငါတို့ရှေ့မဆက်ခင်၊ အဆင်ပြေဖို့အတွက် နောက်ထပ်တစ်ခုလုပ်ရအောင်။
ဖိုင်တွဲတစ်ခုဖန်တီးကြပါစို့ 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` переменная типа словарь, хранит последние двадцать ставок. နောက်တစ်ခုက function နှစ်ခုကိုရေးရမယ်။ ငါတို့က ပထမတစ်ယောက်ကို ခေါ်မယ်။ 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;
}ကျွန်ုပ်တို့သည် စမတ်စာချုပ်၏အစတွင် ဤလုပ်ဆောင်ချက်နှစ်ခုကို ပေါင်းထည့်ပါသည်။ ကျွန်တော်တို အလယ်အလတ်ရလဒ်။
ဒေတာကိုသိမ်းဆည်းရန် built-in လုပ်ဆောင်ချက်ကိုသင်ခေါ်ဆိုရန်လိုအပ်လိမ့်မည်။ set_data() ၎င်းသည် data များကိုမှတ်တမ်းတင်လိမ့်မည်။ pack_state() စမတ်ကန်ထရိုက်သိုလှောင်မှုတွင်။
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);ယခု ကျွန်ုပ်တို့တွင် ဒေတာရေးသားခြင်းနှင့် ဖတ်ရှုခြင်းအတွက် အဆင်ပြေသောလုပ်ဆောင်ချက်များ ရှိသောကြောင့် ကျွန်ုပ်တို့ ဆက်လက်လုပ်ဆောင်နိုင်ပါပြီ။
ပြင်ပမှဝင်လာသောမက်ဆေ့ဂျ်ကို စာချုပ်ပိုင်ရှင် (သို့မဟုတ် သီးသန့်သော့ကိုအသုံးပြုသူ အခြားအသုံးပြုသူ) မှ လက်မှတ်ရေးထိုးထားကြောင်း စစ်ဆေးရန်လိုသည်။
ကျွန်ုပ်တို့သည် စမတ်စာချုပ်တစ်ခုကို ထုတ်ဝေသောအခါတွင် ကျွန်ုပ်တို့သည် ၎င်းကို သိုလှောင်မှုတွင် လိုအပ်သည့်ဒေတာဖြင့် အစပြုနိုင်သည်၊ ၎င်းကို အနာဂတ်အသုံးပြုရန်အတွက် သိမ်းဆည်းမည်ဖြစ်သည်။ အဝင်မက်ဆေ့ဂျ်၏ လက်မှတ်ကို သက်ဆိုင်ရာ လျှို့ဝှက်သော့ဖြင့် ပြုလုပ်ထားကြောင်း အတည်ပြုနိုင်ရန် ထိုနေရာတွင် အများသူငှာသော့ကို ရေးပါမည်။
ဆက်မလုပ်ခင်မှာ သီးသန့်သော့တစ်ခုကို ဖန်တီးပြီး အဲဒါကို ချရေးလိုက်ကြရအောင် test/keys/owner.pk၎င်းကိုလုပ်ဆောင်ရန်၊ ကျွန်ုပ်တို့သည် အပြန်အလှန်အကျိုးသက်ရောက်မှုမုဒ်တွင် Fift ကိုဖွင့်ပြီး command လေးခုကိုလုပ်ဆောင်ပါမည်။
`newkeypair` генерация публичного и приватного ключа и запись их в стек.
`drop` удаления из стека верхнего элемента (в данном случае публичный ключ)
`.s` просто посмотреть что лежит в стеке в данный момент
`"owner.pk" B>file` запись приватного ключа в файл с именем `owner.pk`.
`bye` завершает работу с Fift. ဖိုင်တွဲတစ်ခုဖန်တီးကြပါစို့ keys folder ထဲမှာ test အဲဒီမှာ private key ရေးမယ်။
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လက်ရှိ folder ထဲမှာ ဖိုင်ကို တွေ့ပါတယ်။ owner.pk.
ကျွန်ုပ်တို့သည် အများသူငှာသော့ကို အစုအစည်းမှ ဖယ်ရှားပြီး လိုအပ်ပါက သီးသန့်တစ်ခုမှ ရယူနိုင်ပါသည်။
ယခု ကျွန်ုပ်တို့သည် လက်မှတ်စစ်ဆေးရန် လိုအပ်ပါသည်။ စမ်းသပ်မှုတစ်ခုနဲ့စလိုက်ရအောင်။ ပထမဦးစွာ ကျွန်ုပ်တို့သည် လုပ်ဆောင်ချက်ကို အသုံးပြု၍ ဖိုင်မှ သီးသန့်သော့ကို ဖတ်သည်။ file>B ၎င်းကို variable တစ်ခုအဖြစ်ရေးပါ။ owner_private_keyထို့နောက် function ကိုအသုံးပြုပါ။ 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()၎င်းကို variable တစ်ခုအဖြစ်ရေးပါ။ 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 bits ကိုဖတ်ပြီး variable တစ်ခုအဖြစ်ရေးပြီးနောက် counter variable ၏ 32 bits ကိုဖတ်သည်။
ကျွန်ုပ်တို့တွင် စမတ်ကန်ထရိုက်သိုလှောင်မှုမှ ဒေတာဖတ်ရှုရန် လုပ်ဆောင်ချက်တစ်ခု ပါရှိသောကြောင့်၊ ကျွန်ုပ်တို့ ၎င်းကို အသုံးပြုပါမည်။
ထို့နောက် သိုလှောင်မှုဖြင့် လွှဲပြောင်းထားသော ကောင်တာကို စစ်ဆေးပြီး လက်မှတ်ကို စစ်ဆေးပါ။ တစ်ခုခု မကိုက်ညီပါက သက်ဆိုင်ရာ ကုဒ်ဖြင့် ခြွင်းချက်တစ်ခု ထားလိုက်ပါ။
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 Fift တွင် Fift documentation တွင် variable များကို Deserialization တွင်ဖော်ပြထားသည်။
မုန့်စိမ်း၏ထပ်ပေါင်းနှင့်အတူ။
စမ်းသပ်ပြီး ပျက်သွားတာ သေချာပါစေ။ အခု ထီပိုင်ရှင်ရဲ့လိပ်စာကို ပြောင်းဖို့ ယုတ္တိဗေဒကို ထည့်ကြည့်ရအောင်။
စမတ်စာချုပ်တွင် ကျွန်ုပ်တို့ ဆက်လက် ခွဲခြမ်းစိတ်ဖြာသည်။ message၊ ငါတို့ဖတ်တယ်။ action. ငါတို့နှစ်ယောက်ရှိမယ် လို့ သတိပေးပါရစေ action: လိပ်စာပြောင်းပြီး ဂရမ်ပို့ခြင်း။
ထို့နောက် စာချုပ်ပိုင်ရှင်၏ လိပ်စာအသစ်ကို ဖတ်ပြီး သိုလှောင်ခန်းတွင် သိမ်းဆည်းပါသည်။
ကျွန်ုပ်တို့သည် စစ်ဆေးမှုများကို လုပ်ဆောင်ပြီး တတိယအကြိမ် စာမေးပွဲ ကျရှုံးသည်ကို မြင်တွေ့ရသည်။ ယခု စာချုပ်သည် စမ်းသပ်မှုတွင် ပျောက်ဆုံးနေသော မက်ဆေ့ဂျ်မှ 7 bits ကို ထပ်မံခွဲခြမ်းစိပ်ဖြာပေးသောကြောင့် ၎င်းသည် မအောင်မြင်ပါ။ နတ္ထိကို ထည့်ကြည့်ရအောင် 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().
အခု Internal Messaging ကို သွားကြည့်ရအောင်။ အမှန်မှာ၊ ကျွန်ုပ်တို့သည် ဂရမ်ကိုသာ လက်ခံပြီး သူအနိုင်ရပါက ကစားသမားထံ ပမာဏ နှစ်ဆနှင့် ရှုံးပါက ပိုင်ရှင်ထံ သုံးပုံတစ်ပုံ ပြန်ပို့ပေးပါမည်။
အရင်ဆုံး ရိုးရှင်းတဲ့ စမ်းသပ်မှုတစ်ခု ရေးကြည့်ရအောင်။ ယင်းအတွက်၊ ကျွန်ုပ်တို့သည် စမတ်စာချုပ်သို့ ဂရမ်ပေးပို့သည့် စမတ်စာချုပ်၏ စမ်းသပ်လိပ်စာတစ်ခု လိုအပ်ပါသည်။
စမတ်စာချုပ်လိပ်စာတွင် နံပါတ်နှစ်ခု၊ workchain အတွက် တာဝန်ရှိသော 32-bit ကိန်းပြည့်နှင့် ဤ workchain ရှိ 256-bit အနုတ်လက္ခဏာမဟုတ်သော ကိန်းပြည့်သီးသန့်အကောင့်နံပါတ်တို့ ပါဝင်သည်။ ဥပမာ-1 နှင့် 12345 သည် ဤလိပ်စာကို ဖိုင်တွင်သိမ်းဆည်းပါ။
လိပ်စာကို သိမ်းဆည်းရန် လုပ်ဆောင်ချက်ကို ကူးယူခဲ့သည်။ .
// ( wc addr fname -- ) Save address to file in 36-byte format
{ -rot 256 u>B swap 32 i>B B+ swap B>file } : save-addressfunction ဘယ်လိုအလုပ်လုပ်လဲဆိုတာကိုကြည့်လိုက်ရအောင်၊ ဒါက Fift အလုပ်လုပ်ပုံကိုနားလည်ပေးလိမ့်မယ်။ အပြန်အလှန်အကျိုးသက်ရောက်မှုမုဒ်တွင် Fift ကိုဖွင့်ပါ။
~/TON/build/crypto/fift -i ပထမဦးစွာကျွန်ုပ်တို့သည် -1၊ 12345 နှင့်အနာဂတ်ဖိုင် "sender.addr" အမည်ကို stack ထဲသို့ထည့်သည်-
-1 12345 "sender.addr" နောက်တစ်ဆင့်မှာ function ကို execute ဖြစ်ပါတယ်။ -rotပြိုင်ဘက်ကင်းသော စမတ်စာချုပ်နံပါတ်သည် stack ၏ထိပ်တွင်ရှိနေစေရန်၊ stack ကိုပြောင်းပေးသော၊
"sender.addr" -1 12345256 u>B 256-bit အနုတ်လက္ခဏာမဟုတ်သော ကိန်းပြည့်ကို bytes အဖြစ် ပြောင်းသည်။
"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039swap stack ၏ ထိပ်တန်းဒြပ်စင်နှစ်ခုကို လဲလှယ်ပါ။
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -132 i>B 32-bit integer ကို bytes အဖြစ် ပြောင်းသည်။
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFFB+ bytes ၏ sequence နှစ်ခုကို ပေါင်းစပ်ထားသည်။
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFFနောက်တဖန် swap.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" နောက်ဆုံးတွင် ဘိုက်များကို ဖိုင်သို့ ရေးပေးသည်။ B>file. ဤပြီးနောက် ကျွန်ုပ်တို့၏ stack သည် ဗလာဖြစ်နေသည်။ ရပ် Fift. လက်ရှိဖိုင်တွဲတွင် ဖိုင်တစ်ခုကို ဖန်တီးပြီးဖြစ်သည်။ sender.addr. ဖိုင်ကို ဖန်တီးထားသော ဖိုဒါသို့ ရွှေ့ကြပါစို့။ test/addresses/.
စမတ်စာချုပ်တစ်ခုသို့ ဂရမ်ပေးပို့မည့် ရိုးရှင်းသောစမ်းသပ်မှုတစ်ခုကို ရေးကြပါစို့။ .
ကဲ ကံစမ်းမဲရဲ့ အတွေးအမြင်ကို စလိုက်ကြရအောင်။
ပထမတစ်ချက်က မက်ဆေ့ချ်ကို စစ်ဆေးပါ။ bounced သို့မဟုတ်လျှင် bouncedအဲဒါကို ကျွန်တော်တို့ လျစ်လျူရှုတယ်။ bounced ဆိုလိုသည်မှာ အမှားအယွင်းတစ်စုံတစ်ရာ ဖြစ်ပေါ်လာပါက စာချုပ်သည် ဂရမ်ကို ပြန်ပေးမည် ဖြစ်သည်။ အမှားအယွင်းတစ်ခုဖြစ်ပေါ်ပါက ဂရမ်ကို ပြန်ပေးမည်မဟုတ်ပါ။
လက်ကျန်ဂရမ်တစ်ဝက်ထက်နည်းပါက ကျွန်ုပ်တို့စစ်ဆေးပါ၊ ထို့နောက် ကျွန်ုပ်တို့သည် စာကိုလက်ခံပြီး လျစ်လျူရှုပါသည်။
ထို့နောက် မက်ဆေ့ချ်မှလာသော စမတ်စာချုပ်၏လိပ်စာကို ခွဲခြမ်းစိတ်ဖြာပါ။
ကျွန်ုပ်တို့သည် သိုလှောင်မှုမှ ဒေတာကို ဖတ်ပြီးနောက် ၎င်းတို့ထဲမှ နှစ်ဆယ်ထက်ပိုပါက အလောင်းအစားဟောင်းများကို ဖျက်ပစ်ပါ။ အဆင်ပြေစေရန်အတွက် နောက်ထပ်လုပ်ဆောင်ချက်သုံးခုကို ကျွန်တော်ရေးခဲ့သည်။ pack_order(), unpack_order(), remove_old_orders().
နောက်တစ်ခုကြည့်တာက၊ ငွေပေးချေမှုအတွက် လက်ကျန်ငွေက မလုံလောက်ဘူးဆိုရင် ဒါက လောင်းကြေးတစ်ခုမဟုတ်ပေမယ့် ဖြည့်သွင်းမှုတစ်ခုဖြစ်ပြီး ဖြည့်ထားတဲ့ပမာဏကို သိမ်းထားတယ်၊ 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.
ထုတ်ဝေမှုကုဒ်ကို အခြေခံအနေနဲ့ ယူခဲ့တယ်။ အရာ တရားဝင် repository ထဲမှာ။
ဘာကို သတိထားရမလဲ။ ကျွန်ုပ်တို့သည် စမတ်ကျသော သိုလှောင်မှုတစ်ခုနှင့် ထည့်သွင်းသည့် မက်ဆေ့ချ်တစ်ခုကို ဖန်တီးထားသည်။ ထို့နောက်တွင်၊ စမတ်စာချုပ်လိပ်စာကို ထုတ်ပေးသည်၊ ဆိုလိုသည်မှာ 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 Gram နှင့် စက္ကန့်အနည်းငယ်ကြာပြီးနောက် တူညီသော command ကို execute လုပ်ပါ။ ဂရမ်ပို့ဖို့ ကျွန်တော်သုံးတယ်။ နှင့် ဆောင်းပါး၏အဆုံးတွင် ကျွန်ုပ်ပြောမည့် စကားပြောခန်းမှ တစ်စုံတစ်ဦးထံမှ စမ်းသပ်ဂရမ်ကို သင် တောင်းနိုင်သည်။
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksydမစဥ်းစားထားပုံရသည် (ကွန်ရက်ပေါ်တွင် ပေါ်လာသည်။state:account_uninit) ထိုသို့သောလိပ်စာတစ်ခုနှင့် 1 nanograms လက်ကျန်ငွေဖြင့် စမတ်ကျသောစာချုပ်။
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ယခု စမတ်စာချုပ်ကို ထုတ်ပြန်လိုက်ရအောင်။ Lite-client ကိုဖွင့်ပြီး execute လုပ်ပါ။
> 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စမတ်စာချုပ်ကို ဖန်တီးရာတွင် အစောပိုင်းက ထုတ်ပေးခဲ့သော၊ .
get နည်းလမ်းများကို အသုံးပြု၍ စမတ်စာချုပ်တစ်ခုမှ အချက်အလက်ရယူခြင်း။
ယခု Smart Contract ရယူနည်းများကို မည်သို့လုပ်ဆောင်ရမည်ကို လေ့လာကြည့်ကြပါစို့။
စတင်လိုက်ပါ lite-client ကျွန်တော်ရေးထားတဲ့ get method ကို run လိုက်ပါ။
$ ./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]) ] ဆိုက်ပေါ်ရှိ စမတ်စာချုပ်အကြောင်း အချက်အလက်များကို ပြသရန် ပေါ့ပေါ့ပါးပါး ဖောက်သည်များနှင့် ရယူသည့်နည်းလမ်းများကို အသုံးပြုပါမည်။
ဝဘ်ဆိုက်တွင် စမတ်ကျသော စာချုပ်အချက်အလက်ကို ပြသထားသည်။
ကျွန်ုပ်သည် စမတ်စာချုပ်ဒေတာကို အဆင်ပြေပြေပြသရန် ရိုးရှင်းသော Python ဝဘ်ဆိုက်ကို ရေးသားခဲ့သည်။ ဤနေရာတွင် အသေးစိတ်မပြောဘဲ ဝဘ်ဆိုဒ်ကို လွှင့်တင်ပါမည်။ .
TON ထံ တောင်းဆိုမှုများ ပြုလုပ်ခဲ့သည်။ Python ဖြတ်. lite-clientအဆင်ပြေစေရန်၊ ဆိုက်ကို Docker တွင် ထုပ်ပိုးထားပြီး Google Cloud တွင် ထုတ်ဝေထားသည်။ .
ကြိုးစားနေပါတယ်။
အခု ပြန်ဖြည့်ဖို့ အဲဒီနေရာကို ဂရမ်ပို့လိုက်ရအောင် . 40 ဂရမ်ပို့မယ်။ ရှင်းရှင်းလင်းလင်းသိရန် အလောင်းအစားအချို့ကို ပြုလုပ်ပါ။ ဝဘ်ဆိုက်သည် လောင်းကစားမှတ်တမ်း၊ လက်ရှိအနိုင်ရရာခိုင်နှုန်းနှင့် အခြားအသုံးဝင်သော အချက်အလက်များကို ပြသသည်ကို ကျွန်ုပ်တို့တွေ့မြင်ရပါသည်။
ကျွန်တော်တို့ ပထမတစ်လုံးကို အနိုင်ရပြီး ဒုတိယတစ်ခုကို ရှုံးခဲ့ပါတယ်။
afterword
ဆောင်းပါးသည် ကျွန်တော်မျှော်လင့်ထားသည်ထက် များစွာရှည်သွားသည်၊ ပိုတိုနိုင်သည်၊ သို့မဟုတ် TON အကြောင်း ဘာမှမသိသော သူနှင့် ၎င်းနှင့် အပြန်အလှန် ဆက်ဆံနိုင်စွမ်းရှိသော အလွန်ရိုးရှင်းသော စမတ်ကျသော စာချုပ်ကို ရေးသားထုတ်ဝေလိုသူအတွက်သာ ဖြစ်နိုင်သည်။ အချို့အရာများကို ပို၍ရိုးရှင်းစွာ ရှင်းပြနိုင်ပေမည်။
အကောင်အထည်ဖော်မှု၏ အချို့သောကဏ္ဍများသည် ပိုမိုထိရောက်ပြီး အံဝင်ခွင်ကျဖြစ်ကောင်းဖြစ်နိုင်သော်လည်း ဆောင်းပါးပြင်ဆင်ရန် အချိန်ပိုယူရပေမည်။ တစ်နေရာရာမှာ အမှားလုပ်မိလိုက်တာ ဒါမှမဟုတ် တစ်ခုခုကို နားမလည်တာကြောင့်လည်း ဖြစ်နိုင်တယ်၊ ဒါကြောင့် သင် လေးနက်တဲ့ တစ်ခုခုကို လုပ်တယ်ဆိုရင် တရားဝင် စာရွက်စာတမ်း ဒါမှမဟုတ် TON ကုဒ်ပါတဲ့ တရားဝင် သိုလှောင်နေရာကို အားကိုးဖို့ လိုပါတယ်။
TON ကိုယ်တိုင်က ဖွံ့ဖြိုးတိုးတက်မှုအဆင့်တွင်ရှိနေဆဲဖြစ်သောကြောင့်၊ ဤဆောင်းပါးပါ အဆင့်များထဲမှ တစ်စုံတစ်ရာကို ချိုးဖျက်သွားမည့် အပြောင်းအလဲများ ဖြစ်ပေါ်နိုင်သည် (ကျွန်တော်ရေးနေစဥ်အချိန်က ဖြစ်ခဲ့သည်မှာ ပြုပြင်ထားပြီးဖြစ်သည်)၊ သို့သော် ယေဘုယျချဉ်းကပ်ပုံမှာ ပြောင်းလဲဖွယ်မရှိပေ။
TON ရဲ့ အနာဂတ်ကို ကျွန်တော် မခန့်မှန်းတတ်ပါဘူး။ ပလပ်ဖောင်းသည် ပိုကြီးသောအရာတစ်ခုဖြစ်လာနိုင်သည်၊ ကျွန်ုပ်တို့သည် ၎င်းကိုလေ့လာပြီး ကျွန်ုပ်တို့၏ထုတ်ကုန်များနှင့်အတူ နယ်ပယ်တစ်ခုကို သိမ်းပိုက်ရန် အချိန်ဖြုန်းသင့်သည်။
TON ထက် ပိုကြီးသော အသုံးပြုသူ အလားအလာရှိသည့် Facebook မှ Libra လည်း ရှိပါသည်။ Libra အကြောင်း ကျွန်တော် ဘာမှ မသိသလောက်ဘဲ၊ ဖိုရမ်က ဆုံးဖြတ်တာက TON အသိုင်းအဝိုင်းမှာထက် အဲဒီမှာ လှုပ်ရှားမှုတွေ အများကြီးရှိတယ်။ developer များနှင့် TON အသိုင်းအဝိုင်းသည် underground နှင့်ပိုတူသော်လည်း၊ ၎င်းသည်အေးမြသည်။
ကိုးကား
- တရားဝင် TON စာရွက်စာတမ်း-
- တရားဝင် TON သိုလှောင်မှု-
- မတူညီသောပလက်ဖောင်းများအတွက်တရားဝင်ပိုက်ဆံအိတ်-
- ဤဆောင်းပါးမှ စမတ်ကန်ထရိုက် သိုလှောင်မှု-
- စမတ်စာချုပ် ဝဘ်ဆိုဒ်သို့ လင့်ခ်-
- FunC အတွက် Visual Studio Code တိုးချဲ့သိုလှောင်မှု
- ပထမအဆင့်မှာ နားလည်ဖို့ အများကြီး အထောက်အကူဖြစ်စေတဲ့ Telegram မှာ TON အကြောင်း chat ပါ။ TON အတွက် တစ်ခုခု ရေးတဲ့သူတိုင်း ရှိတယ် လို့ ပြောရင် မှားမယ် မထင်ပါဘူး။ အဲဒီ့မှာ စမ်းသပ်ဂရမ်ကိုလည်း တောင်းနိုင်ပါတယ်။
- အသုံးဝင်သောအချက်အလက်များကို ကျွန်ုပ်တွေ့ရှိခဲ့သော TON အကြောင်း နောက်ထပ်ချတ်တစ်ခု
- ပြိုင်ပွဲ၏ပထမအဆင့်
- ပြိုင်ပွဲ၏ဒုတိယအဆင့်
source: www.habr.com
