Haskell සමඟින් FunC, FunCtional බවට පත් කිරීම: සෙරොකල් ටෙලිග්‍රාම් බ්ලොක්චේන් තරඟය ජයග්‍රහණය කළ ආකාරය

ඔයාලා සමහරවිට අහලා ඇති ඒ ටෙලිග්‍රෑම් එක කියලා ටොන් බ්ලොක්චේන් වේදිකාව දියත් කිරීමට සැලසුම් කරමින් සිටී.නමුත් බොහෝ කලකට පෙර ටෙලිග්‍රාම් හි පළ වූ පුවත ඔබට මග හැරෙන්නට ඇත තරඟයක් නිවේදනය කළා මෙම වේදිකාව සඳහා ස්මාර්ට් කොන්ත්‍රාත්තු එකක් හෝ කිහිපයක් ක්‍රියාත්මක කිරීමට.

මහා පරිමාණ බ්ලොක්චේන් ව්‍යාපෘති සංවර්ධනය කිරීමේ පුළුල් අත්දැකීම් ඇති සෙරොකල් කණ්ඩායමට එයට විරුද්ධ විය නොහැකි විය. අපි තරඟයට සේවකයින් පස් දෙනෙකු පවරන ලද අතර, සති දෙකකට පසුව, ඔවුන් (මූලික) අහඹු අන්වර්ථ නාමයක් වන "සරාගී චමිලියන්" යටතේ පළමු ස්ථානය ලබා ගත්හ. මෙම ලිපියෙන්, ඔවුන් එය කළ ආකාරය මම ඔබට කියමි. ඊළඟ මිනිත්තු දහය තුළ ඔබ අවම වශයෙන් රසවත් කතාවක් කියවනු ඇතැයි අපි බලාපොරොත්තු වෙමු, උපරිම වශයෙන්, ඔබේම කාර්යයේදී ඔබට යෙදිය හැකි ප්‍රයෝජනවත් දෙයක් එහි සොයා ගනු ඇත.

නමුත් අපි කුඩා සන්දර්භයකින් පටන් ගනිමු.

තරඟය සහ එහි කොන්දේසි

මේ අනුව, සහභාගිවන්නන්ගේ ප්‍රධාන කාර්යයන් වූයේ යෝජිත ස්මාර්ට් කොන්ත්‍රාත්තු එකක් හෝ කිහිපයක් ක්‍රියාත්මක කිරීම මෙන්ම TON පරිසර පද්ධතිය වැඩිදියුණු කිරීම සඳහා යෝජනා ඉදිරිපත් කිරීමයි. තරඟය සැප්තැම්බර් 24 සිට ඔක්තෝබර් 15 දක්වා පැවති අතර ප්‍රතිඵල ප්‍රකාශයට පත් කරන ලද්දේ නොවැම්බර් 15 වන දින පමණි. මෙම කාලය තුළ, ටෙලිග්‍රාම් විසින් ටෙලිග්‍රාම් හි VoIP ඇමතුම්වල ගුණාත්මකභාවය පරීක්ෂා කිරීම සහ ඇගයීම සඳහා නිර්මාණ තරඟ සහ C++ යෙදුම් සංවර්ධන තරඟවල ප්‍රතිඵල දැනටමත් පවත්වා ප්‍රකාශයට පත් කර ඇති බව සලකන විට මෙය තරමක් දිගු කාලයකි.

සංවිධායකයින් විසින් සපයන ලද ලැයිස්තුවෙන් අපි ස්මාර්ට් කොන්ත්‍රාත් දෙකක් තෝරා ගත්තෙමු. එකක් සඳහා, අපි TON සමඟ බෙදා හරින ලද මෙවලම් භාවිතා කළ අතර, දෙවැන්න අපගේ ඉංජිනේරුවන් විසින් විශේෂයෙන් TON සඳහා සංවර්ධනය කරන ලද සහ Haskell හි ඇතුළත් කර ඇති නව භාෂාවකින් ක්‍රියාත්මක කළෙමු.

ක්‍රියාකාරී ක්‍රමලේඛන භාෂාවක් තෝරා ගැනීම අහම්බයක් නොවේ. අපගේ ආයතනික බ්ලොගය අපි බොහෝ විට කතා කරන්නේ ක්‍රියාකාරී භාෂාවල සංකීර්ණත්වය අතිශයෝක්තියක් ලෙස සලකන්නේ ඇයි සහ අපි සාමාන්‍යයෙන් ඒවා වස්තු-නැඹුරු භාෂාවලට වඩා කැමති ඇයි යන්න ගැන ය. මාර්ගය වන විට, එයට ද ඇත මෙම ලිපියේ මුල් පිටපත.

අපි මුලින්ම සහභාගී වීමට තීරණය කළේ ඇයි?

කෙටියෙන් කිවහොත්, අපි විශේෂිත කුසලතා අවශ්‍ය වන සහ බොහෝ විට IT ප්‍රජාව සඳහා විද්‍යාත්මක වටිනාකමක් ඇති සාම්ප්‍රදායික නොවන සහ සංකීර්ණ ව්‍යාපෘති සඳහා විශේෂඥයින් වන බැවිනි. අපි විවෘත මූලාශ්‍ර සංවර්ධනයට දැඩි ලෙස සහාය දක්වන අතර එය ප්‍රවර්ධනය කරන අතර, පරිගණක විද්‍යාව සහ ගණිත ක්ෂේත්‍රවල ප්‍රමුඛ පෙළේ රුසියානු විශ්ව විද්‍යාල සමඟ සහයෝගයෙන් කටයුතු කරන්නෙමු.

තරඟයේ සිත්ගන්නාසුලු අභියෝග සහ අපගේ ආදරණීය ටෙලිග්‍රාම් ව්‍යාපෘතියට සම්බන්ධ වීම විශිෂ්ට අභිප්‍රේරණයක් වූ අතර, ත්‍යාග අරමුදල අමතර දිරිගැන්වීමක් ලබා දුන්නේය. 🙂

ටොන් බ්ලොක්චේන් පර්යේෂණ

අපි blockchain, කෘත්‍රිම බුද්ධිය සහ යන්ත්‍ර ඉගෙනීමේ නව වර්ධනයන් සමීපව නිරීක්ෂණය කරන අතර අප වැඩ කරන සෑම ක්ෂේත්‍රයකම ඕනෑම සැලකිය යුතු නිකුතුවක ඉහළින්ම සිටීමට උත්සාහ කරමු. එබැවින්, තරඟය ආරම්භ වන විට, අපගේ කණ්ඩායම දැනටමත් අදහස් සමඟ හුරුපුරුදු විය. ටොන් සුදු කඩදාසියකෙසේ වෙතත්, අපි TON සමඟ වැඩ කිරීමට පෙර, අපි තාක්ෂණික ලියකියවිලි හෝ වේදිකාවේ සත්‍ය මූලාශ්‍ර කේතය විශ්ලේෂණය කර නොතිබුණි, එබැවින් පළමු පියවර තරමක් පැහැදිලි විය - නිල ලියකියවිලි පිළිබඳ ගැඹුරු අධ්‍යයනයක් වෙබ් අඩවිය හා ඇතුළත ව්යාපෘති ගබඩා.

තරඟය ආරම්භ වන විට, කේතය දැනටමත් ප්‍රකාශයට පත් කර තිබුණි, එබැවින් කාලය ඉතිරි කර ගැනීම සඳහා, අපි විසින් ලියන ලද අත්පොතක් හෝ සාරාංශයක් සෙවීමට තීරණය කළෙමු පරිශීලකයන්අවාසනාවකට, මෙය කිසිදු ප්‍රතිඵලයක් ලබා දුන්නේ නැත - උබුන්ටු මත වේදිකාව ගොඩනැගීම සඳහා උපදෙස් හැර වෙනත් ද්‍රව්‍ය අපට සොයාගත නොහැකි විය.

ලියකියවිලි හොඳින් පර්යේෂණ කරන ලද නමුත් සමහර විට කියවීමට අපහසු විය. අපට බොහෝ විට යම් යම් කරුණු වෙත ආපසු ගොස් වියුක්ත අදහස් පිළිබඳ ඉහළ මට්ටමේ විස්තර වලින් පහළ මට්ටමේ ක්‍රියාත්මක කිරීමේ විස්තර වෙත මාරු වීමට සිදු විය.

පිරිවිතරයේ කිසිදු සවිස්තරාත්මක ක්‍රියාත්මක කිරීමේ විස්තරයක් ඇතුළත් නොකළේ නම් එය සරල වනු ඇත. අථත්‍ය යන්ත්‍රය එහි තොගය නියෝජනය කරන ආකාරය පිළිබඳ තොරතුරු TON වේදිකාව සඳහා ස්මාර්ට් කොන්ත්‍රාත්තු නිර්මාණය කරන සංවර්ධකයින්ට උපකාරයකට වඩා අවධානය වෙනතකට යොමු කිරීමකි.

නික්ස්: ව්‍යාපෘතිය එකට එකතු කිරීම

සෙරොකල්හිදී අපි ලොකු රසිකයෝ. නික්ස්අපි ඔවුන් සඳහා අපගේ ව්‍යාපෘති එකතු කර ඒවා යොදවන්නේ නික්ස්ඕප්ස්, සහ අපගේ සියලුම සේවාදායකයන් එය ස්ථාපනය කර ඇත නික්සෝස්මෙය අපගේ සියලුම ගොඩනැගීම් ප්‍රතිනිෂ්පාදනය කළ හැකි බවත් Nix සඳහා සහය දක්වන ඕනෑම මෙහෙයුම් පද්ධතියක ක්‍රියා කරන බවත් සහතික කරයි.

ඉතින් අපි නිර්මාණය කරන්න පටන් ගත්තා TON එකලස් කිරීම සඳහා ප්‍රකාශනය සහිත නික්ස් ආවරණයක්. එය TON සම්පාදනය කිරීම අතිශයින් පහසු කරයි:

$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && make

ඔබට කිසිදු පරායත්තතාවයක් ස්ථාපනය කිරීමට අවශ්‍ය නොවන බව සලකන්න. ඔබ NixOS, Ubuntu හෝ macOS භාවිතා කළත්, Nix ඔබ වෙනුවෙන් සියල්ල ඉන්ද්‍රජාලිකව හසුරුවනු ඇත.

TON සඳහා ක්‍රමලේඛනය

TON ජාලයේ ස්මාර්ට් කොන්ත්‍රාත් කේතය TON අතථ්‍ය යන්ත්‍රය (TVM) මත ක්‍රියාත්මක වේ. TVM අනෙකුත් බොහෝ අථත්‍ය යන්ත්‍රවලට වඩා සංකීර්ණ වන අතර ඒවා සමඟ වැඩ කිරීමේ හැකියාව වැනි රසවත් ක්‍රියාකාරීත්වයක් ලබා දෙයි. අඛණ්ඩව и දත්ත වලට සබැඳි.

එපමණක් නොව, TON හි පුද්ගලයින් නව ක්‍රමලේඛන භාෂා තුනක් නිර්මාණය කර ඇත:

පස් — විශ්වීය ස්ටැක්-පාදක ක්‍රමලේඛන භාෂාවක් සිහිගන්වයි ඉදිරියටඔහුගේ සුපිරි බලය වන්නේ TVM සමඟ අන්තර් ක්‍රියා කිරීමේ හැකියාවයි.

විනෝදය — සමාන ස්මාර්ට් කොන්ත්‍රාත් ක්‍රමලේඛන භාෂාවක් C සහ වෙනත් භාෂාවකට සම්පාදනය කරයි - පස්වන එකලස් කරන්නා.

පස්වන එකලස් කරන්නා — TVM සඳහා ද්විමය ක්‍රියාත්මක කළ හැකි කේතය ජනනය කිරීම සඳහා Fift පුස්තකාලයක්. Fift Assembler සතුව සම්පාදකයක් නොමැත. embedded domain-specific language (eDSL).

අපගේ තරඟ ඇතුළත් කිරීම්

අවසාන වශයෙන්, අපගේ උත්සාහයේ ප්‍රතිඵල දෙස බැලීමට කාලයයි.

අසමමුහුර්ත ගෙවීම් නාලිකාව

ගෙවීම් නාලිකාවක් යනු පරිශීලකයින් දෙදෙනෙකුට ගෙවීම් දාමයෙන් පිටත යැවීමට ඉඩ සලසන ස්මාර්ට් කොන්ත්‍රාත්තුවකි. මෙය මුදල් පමණක් නොව (ගාස්තු නැත) කාලයද ඉතිරි කරයි (එක් එක් කොටස සැකසීමට බලා සිටීමක් නැත). ගෙවීම් අවශ්‍ය තරම් කුඩා විය හැකි අතර අවශ්‍ය තරම් නිතර සිදුවිය හැකිය. අවසාන බේරුම්කරණයේ සාධාරණත්වය ස්මාර්ට් කොන්ත්‍රාත්තුව මගින් සහතික කර ඇති බැවින්, කිසිදු පාර්ශ්වයක් එකිනෙකා විශ්වාස කිරීමට අවශ්‍ය නොවේ.

ගැටලුවට අපි තරමක් සරල විසඳුමක් සොයා ගත්තෙමු. පාර්ශව දෙකකට අත්සන් කළ පණිවිඩ හුවමාරු කර ගත හැකි අතර, ඒ සෑම එකක්ම අංක දෙකක් අඩංගු වේ - එක් එක් සහභාගිවන්නා විසින් ගෙවන ලද මුළු මුදල. මෙම අංක දෙක ක්‍රියා කරන්නේ දෛශික ඔරලෝසුව සාම්ප්‍රදායික බෙදා හරින ලද පද්ධතිවල, ඔවුන් ගනුදෙනුවල "පෙර සිදු වූ" අනුපිළිවෙල අර්ථ දක්වයි. මෙම දත්ත භාවිතා කරමින්, කොන්ත්‍රාත්තුවට ඕනෑම විභව ගැටුම් විසඳා ගත හැකිය.

යථාර්ථයේ දී, මෙම අදහස ක්‍රියාත්මක කිරීම සඳහා තනි අංකයක් ප්‍රමාණවත් වනු ඇත, නමුත් අපි දෙකම ඇතුළත් කළේ මෙය අපට වඩාත් පරිශීලක-හිතකාමී අතුරු මුහුණතක් නිර්මාණය කිරීමට ඉඩ සලසන බැවිනි. සෑම පණිවිඩයකම ගෙවීම් මුදල ඇතුළත් කිරීමට ද අපි තීරණය කළෙමු. එය නොමැතිව, කිසියම් හේතුවක් නිසා පණිවිඩය නැති වුවහොත්, සියලු මුදල් සහ අවසාන ගෙවීම නිවැරදි වුවද, පරිශීලකයාට පාඩුව නොපෙනී යා හැකිය.

අපගේ අදහස පරීක්ෂා කිරීම සඳහා, අපි එවැනි සරල හා සංක්ෂිප්ත ගෙවීම් නාලිකා ප්‍රොටෝකෝලයක් භාවිතා කිරීම පිළිබඳ උදාහරණ සෙව්වෙමු. පුදුමයට කරුණක් නම්, අපට හමු වූයේ දෙකක් පමණි:

  1. විස්තර සමාන ප්‍රවේශයක්, ඒක දිශානුගත නාලිකාවක් සඳහා පමණි.
  2. නිබන්ධනය, එය අපගේ අදහසම විස්තර කරයි, නමුත් සාමාන්‍ය නිවැරදි බව සහ ගැටුම් නිරාකරණ ක්‍රියා පටිපාටිය වැනි බොහෝ වැදගත් තොරතුරු පැහැදිලි නොකර.

අපගේ ප්‍රොටෝකෝලය විස්තරාත්මකව විස්තර කිරීම අර්ථවත් බව පැහැදිලි විය, එහි නිවැරදි බව කෙරෙහි විශේෂ අවධානයක් යොමු කරමින්. පුනරාවර්තන කිහිපයකට පසු, පිරිවිතර සූදානම් වූ අතර දැන් ඔබටත් එය කළ හැකිය. ඇය දෙස බලන්න..

අපි FunC හි කොන්ත්‍රාත්තුව ක්‍රියාත්මක කළ අතර, සංවිධායකයින් විසින් නිර්දේශ කරන ලද පරිදි, අපගේ කොන්ත්‍රාත්තුව සමඟ අන්තර් ක්‍රියා කිරීම සඳහා විධාන රේඛා උපයෝගීතාව සම්පූර්ණයෙන්ම Fift හි ලිව්වෙමු. අපගේ CLI සඳහා අපට වෙනත් ඕනෑම භාෂාවක් තෝරා ගත හැකිව තිබුණි, නමුත් එය ප්‍රායෝගිකව ක්‍රියාත්මක වන්නේ කෙසේදැයි බැලීමට අපි Fift උත්සාහ කිරීමට උනන්දු විය.

අවංකවම, Fift සමඟ වැඩ කිරීමෙන් පසු, හොඳින් සංවර්ධනය වූ මෙවලම් දාම සහ පුස්තකාල සහිත ජනප්‍රිය සහ ක්‍රියාශීලීව භාවිතා වන භාෂාවලට වඩා එයට කැමති වීමට කිසිදු ප්‍රබල හේතුවක් අපට නොපෙනුණි. ස්ටැක්-පාදක භාෂාවකින් ක්‍රමලේඛනය කිරීම තරමක් කලකිරීමට කරුණකි, මන්ද ඔබට සෑම දෙයක්ම ස්ටැක් එකේ ඇති ස්ථානය නිරන්තරයෙන් මතක තබා ගත යුතු අතර, සම්පාදකය ඒ සඳහා උදව් නොකරයි.

එමනිසා, අපගේ මතය අනුව, Fift හි පැවැත්ම සඳහා ඇති එකම සාධාරණීකරණය වන්නේ Fift Assembler සඳහා සත්කාරක භාෂාවක් ලෙස එහි භූමිකාවයි. නමුත් මෙම, අත්‍යවශ්‍යයෙන්ම එකම අරමුණ සඳහා නව එකක් නිර්මාණය කිරීමට වඩා TVM Assembler පවතින භාෂාවකට ඇතුළත් කිරීම වඩා හොඳ නොවේද?

TVM හැස්කල් eDSL

දැන් අපේ දෙවන ස්මාර්ට් කොන්ත්‍රාත්තුව ගැන කතා කිරීමට කාලයයි. අපි බහු-අත්සන මුදල් පසුම්බියක් සංවර්ධනය කිරීමට තීරණය කළෙමු, නමුත් FunC හි තවත් ස්මාර්ට් කොන්ත්‍රාත්තුවක් ලිවීම ඉතා කම්මැලි වනු ඇත. අපට ටිකක් දක්ෂතාවයක් එක් කිරීමට අවශ්‍ය විය, ඒ අපි ඉදිරිපත් කළේ: අපේම TVM එකලස් කිරීමේ භාෂාව.

Fifth Assembler වගේම, අපේ අලුත් භාෂාව embeddable, නමුත් Fifth වෙනුවට, අපි Haskell සත්කාරක ලෙස තෝරා ගත්තා, ඒකෙන් අපිට එහි උසස් වර්ගයේ පද්ධතිය සම්පූර්ණයෙන්ම භාවිතා කරන්න පුළුවන්. කුඩාම දෝෂයට පවා ඉතා ඉහළ පිරිවැයක් දැරීමට සිදුවන ස්මාර්ට් කොන්ත්‍රාත්තු සමඟ වැඩ කරන විට, ස්ථිතික ටයිප් කිරීම සැලකිය යුතු වාසියක් බව අපි විශ්වාස කරනවා.

Haskell තුළට ඇතුළත් කළ විට TVM එකලස් කිරීම කෙබඳුදැයි පෙන්වීමට, අපි එහි සම්මත පසුම්බියක් ක්‍රියාත්මක කළෙමු. සටහන් කළ යුතු කරුණු කිහිපයක් මෙන්න:

  • මෙම කොන්ත්‍රාත්තුවේ තනි ශ්‍රිතයක් අඩංගු වේ, නමුත් ඔබට කැමති තරම් ගණනක් භාවිතා කළ හැකිය. ඔබ සත්කාරක භාෂාවෙන් (Haskell) නව ශ්‍රිතයක් අර්ථ දක්වන විට, එය TVM හි වෙනම උප චර්යාවක් බවට පත් කිරීමට හෝ ඇමතුම් අඩවියේ සරලව ඇතුළත් කිරීමට ඔබට අවශ්‍යද යන්න තෝරා ගැනීමට අපගේ eDSL ඔබට ඉඩ සලසයි.
  • Haskell හි මෙන්, ශ්‍රිතවලට සම්පාදනය කරන අවස්ථාවේදී පරීක්ෂා කරන වර්ග තිබේ. අපගේ eDSL හි, ශ්‍රිතයක ආදාන වර්ගය යනු ශ්‍රිතය අපේක්ෂා කරන ස්ටැක් වර්ගය වන අතර, එහි ප්‍රතිලාභ වර්ගය යනු ඇමතුමෙන් පසු ශ්‍රිතය නැවත ලබා දෙන ස්ටැක් වර්ගයයි.
  • කේතයේ විවරණ තිබේ. stacktype, ඇමතුම් අඩවියේ අපේක්ෂිත ස්ටැක් වර්ගය විස්තර කරයි. මුල් පසුම්බි කොන්ත්‍රාත්තුවේ, මේවා හුදෙක් අදහස් පමණි, නමුත් අපගේ eDSL හි, ඒවා ඇත්ත වශයෙන්ම කේතයේ කොටසක් වන අතර සම්පාදනය කරන අවස්ථාවේදී පරීක්ෂා කරනු ලැබේ. කේත වෙනස්වීම් අතරතුර ස්ටැක් වර්ගය වෙනස් වුවහොත් ගැටළු හඳුනා ගැනීමට සංවර්ධකයාට උපකාර වන ලියකියවිලි හෝ ප්‍රකාශයන් ලෙස ඒවා සේවය කළ හැකිය. ස්වාභාවිකවම, එවැනි විවරණ ධාවන කාල ක්‍රියාකාරිත්වයට බලපාන්නේ නැත, මන්ද ඒවා සඳහා කිසිදු TVM කේතයක් ජනනය නොවේ.
  • මෙය තවමත් මූලාකෘතියක් වන අතර සති දෙකකින් ලියා ඇත, එබැවින් තවමත් කළ යුතු වැඩ ගොඩක් තිබේ. උදාහරණයක් ලෙස, පහත කේතයේ ඔබ දකින සියලුම පන්ති අවස්ථා ස්වයංක්‍රීයව ජනනය විය යුතුය.

අපගේ eDSL හි multisig wallet ක්‍රියාත්මක කිරීමක් පෙනෙන්නේ කෙසේද යන්න මෙන්න:

main :: IO ()
main = putText $ pretty $ declProgram procedures methods
  where
    procedures =
      [ ("recv_external", decl recvExternal)
      , ("recv_internal", decl recvInternal)
      ]
    methods =
      [ ("seqno", declMethod getSeqno)
      ]

data Storage = Storage
  { sCnt :: Word32
  , sPubKey :: PublicKey
  }

instance DecodeSlice Storage where
  type DecodeSliceFields Storage = [PublicKey, Word32]
  decodeFromSliceImpl = do
    decodeFromSliceImpl @Word32
    decodeFromSliceImpl @PublicKey

instance EncodeBuilder Storage where
  encodeToBuilder = do
    encodeToBuilder @Word32
    encodeToBuilder @PublicKey

data WalletError
  = SeqNoMismatch
  | SignatureMismatch
  deriving (Eq, Ord, Show, Generic)

instance Exception WalletError

instance Enum WalletError where
  toEnum 33 = SeqNoMismatch
  toEnum 34 = SignatureMismatch
  toEnum _ = error "Uknown MultiSigError id"

  fromEnum SeqNoMismatch = 33
  fromEnum SignatureMismatch = 34

recvInternal :: '[Slice] :-> '[]
recvInternal = drop

recvExternal :: '[Slice] :-> '[]
recvExternal = do
  decodeFromSlice @Signature
  dup
  preloadFromSlice @Word32
  stacktype @[Word32, Slice, Signature]
  -- cnt cs sign

  pushRoot
  decodeFromCell @Storage
  stacktype @[PublicKey, Word32, Word32, Slice, Signature]
  -- pk cnt' cnt cs sign

  xcpu @1 @2
  stacktype @[Word32, Word32, PublicKey, Word32, Slice, Signature]
  -- cnt cnt' pk cnt cs sign

  equalInt >> throwIfNot SeqNoMismatch

  push @2
  sliceHash
  stacktype @[Hash Slice, PublicKey, Word32, Slice, Signature]
  -- hash pk cnt cs sign

  xc2pu @0 @4 @4
  stacktype @[PublicKey, Signature, Hash Slice, Word32, Slice, PublicKey]
  -- pubk sign hash cnt cs pubk

  chkSignU
  stacktype @[Bool, Word32, Slice, PublicKey]
  -- ? cnt cs pubk

  throwIfNot SignatureMismatch
  accept

  swap
  decodeFromSlice @Word32
  nip

  dup
  srefs @Word8

  pushInt 0
  if IsEq
  then ignore
  else do
    decodeFromSlice @Word8
    decodeFromSlice @(Cell MessageObject)
    stacktype @[Slice, Cell MessageObject, Word8, Word32, PublicKey]
    xchg @2
    sendRawMsg
    stacktype @[Slice, Word32, PublicKey]

  endS
  inc

  encodeToCell @Storage
  popRoot

getSeqno :: '[] :-> '[Word32]
getSeqno = do
  pushRoot
  cToS
  preloadFromSlice @Word32

අපගේ eDSL සහ බහු-අත්සන පසුම්බි කොන්ත්‍රාත්තුව සඳහා සම්පූර්ණ මූලාශ්‍ර කේතය ඔබට සොයාගත හැකිය මෙම ගබඩාවේ. සහ තවත් විස්තරාත්මකව කිව්වා අපගේ සගයා වන ජෝර්ජි අගපොව් එම්බෙඩඩ් භාෂා ගැන කතා කරයි.

තරඟය සහ TON පිළිබඳ නිගමන

සමස්තයක් වශයෙන්, අපගේ කාර්යයට පැය 380ක් ගත විය (ලේඛනගත කිරීම, රැස්වීම් සහ සැබෑ සංවර්ධනය සමඟ හුරුපුරුදු වීම ඇතුළුව). තරඟ ව්‍යාපෘතියට සංවර්ධකයින් පස් දෙනෙකු සහභාගී විය: CTO, කණ්ඩායම් නායකයෙකු, blockchain වේදිකා විශේෂඥයින් සහ Haskell මෘදුකාංග සංවර්ධකයින්.

හැකතන් ආත්මය, සමීප කණ්ඩායම් වැඩ සහ නව තාක්ෂණයන් තුළ ඉක්මනින් ගිලී යාමේ අවශ්‍යතාවය සැමවිටම උද්යෝගිමත් බැවින්, තරඟයට සහභාගී වීමට අපට අපහසුවකින් තොරව සම්පත් හමු විය. සීමිත සම්පත් සමඟ උපරිම ප්‍රතිඵල ලබා ගැනීම සඳහා ගත කරන නිදි නැති රාත්‍රීන් කිහිපයක් මිල කළ නොහැකි අත්දැකීම් සහ අපූරු මතකයන් මගින් වන්දි ලබා ගනී. තවද, හොඳින් ක්‍රියාත්මක වන අභ්‍යන්තර සන්නිවේදනයකින් තොරව සැබවින්ම වටිනා ප්‍රතිඵල ලබා ගැනීම අතිශයින් දුෂ්කර බැවින්, එවැනි කාර්යයන් සඳහා වැඩ කිරීම සැමවිටම සමාගමක ක්‍රියාවලීන් පිළිබඳ හොඳ පරීක්ෂණයකි.

පද රචනයෙන් ඔබ්බට: TON කණ්ඩායම ඉටු කර ඇති කාර්යයන් ප්‍රමාණය ගැන අපි පැහැදුණා. ඔවුන් සංකීර්ණ, ලස්සන සහ වඩාත්ම වැදගත් ලෙස ක්‍රියාකාරී පද්ධතියක් ගොඩනගා ඇත. TON විශාල විභවයක් සහිත වේදිකාවක් බව ඔප්පු කර ඇත. කෙසේ වෙතත්, මෙම පරිසර පද්ධතිය සංවර්ධනය වීමට නම්, blockchain ව්‍යාපෘතිවල එහි භාවිතය සහ සංවර්ධන මෙවලම් වැඩිදියුණු කිරීමේදී තවත් බොහෝ දේ කළ යුතුය. දැන් මෙම ක්‍රියාවලියේ කොටසක් වීමට ලැබීම ගැන අපි ආඩම්බර වෙමු.

මෙම ලිපිය කියවීමෙන් පසුවත් ඔබේ ගැටළු විසඳීම සඳහා TON යොදන ආකාරය පිළිබඳව ඔබට තවමත් කිසියම් ප්‍රශ්නයක් හෝ අදහසක් තිබේ නම්, අපට ලියන්න — අපගේ අත්දැකීම් බෙදා ගැනීමට අපි සතුටු වන්නෙමු.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න