ඔය ටෙලිග්රාම් එක අහලත් ඇති
විශාල බ්ලොක්චේන් ව්යාපෘති සංවර්ධනය කිරීමේ පුළුල් අත්දැකීම් ඇති Serokell කණ්ඩායමට පැත්තකට වී සිටිය නොහැකි විය. අපි සේවකයින් පස් දෙනෙකු තරඟයට පැවරූ අතර, සති දෙකකට පසුව ඔවුන් එහි ප්රථම ස්ථානය ලබා ගත්තේ (in) නිහතමානී අහඹු අන්වර්ථ නාමයක් වන Sexy Chameleon යටතේ ය. මෙම ලිපියෙන් මම ඔවුන් එය කළ ආකාරය ගැන කතා කරමි. මීළඟ මිනිත්තු දහය තුළ ඔබ අවම වශයෙන් රසවත් කතාවක් කියවනු ඇතැයි අපි බලාපොරොත්තු වෙමු, උපරිම වශයෙන් ඔබට ඔබේ කාර්යයට අදාළ විය හැකි ප්රයෝජනවත් යමක් සොයාගත හැකිය.
නමුත් අපි කුඩා සන්දර්භයකින් පටන් ගනිමු.
තරඟය සහ එහි කොන්දේසි
එබැවින්, සහභාගිවන්නන්ගේ ප්රධාන කාර්යයන් වූයේ යෝජිත ස්මාර්ට් කොන්ත්රාත්තු එකක් හෝ කිහිපයක් ක්රියාත්මක කිරීම මෙන්ම TON පරිසර පද්ධතිය වැඩිදියුණු කිරීම සඳහා යෝජනා ඉදිරිපත් කිරීමයි. තරගය සැප්තැම්බර් 24 සිට ඔක්තෝබර් 15 දක්වා පැවති අතර ප්රතිඵල ප්රකාශයට පත් කරනු ලැබුවේ නොවැම්බර් 15 වැනිදා පමණි. මෙම කාලය තුළ ටෙලිග්රාම් හි VoIP ඇමතුම්වල ගුණාත්මකභාවය පරීක්ෂා කිරීම සහ තක්සේරු කිරීම සඳහා C++ හි යෙදුම් සැලසුම් කිරීම සහ සංවර්ධනය කිරීම පිළිබඳ තරඟවල ප්රතිඵල පැවැත්වීමට සහ ප්රකාශයට පත් කිරීමට ටෙලිග්රාම් සමත් වූ බව සලකන විට.
සංවිධායකයින් විසින් යෝජනා කරන ලද ලැයිස්තුවෙන් අපි ස්මාර්ට් ගිවිසුම් දෙකක් තෝරා ගත්තෙමු. ඒවායින් එකක් සඳහා, අපි TON සමඟ බෙදා හරින ලද මෙවලම් භාවිතා කළ අතර, දෙවැන්න අපගේ ඉංජිනේරුවන් විසින් TON සඳහා විශේෂයෙන් සංවර්ධනය කර Haskell තුළට ගොඩනගා ඇති නව භාෂාවකින් ක්රියාත්මක කරන ලදී.
ක්රියාකාරී ක්රමලේඛන භාෂාවක් තෝරාගැනීම අහම්බයක් නොවේ. අපේ
අපි සහභාගී වීමට තීරණය කළේ ඇයි?
කෙටියෙන් කිවහොත්, අපගේ විශේෂීකරණය විශේෂ කුසලතා අවශ්ය වන සහ බොහෝ විට තොරතුරු තාක්ෂණ ප්රජාවට විද්යාත්මක වටිනාකමක් ඇති සම්මත නොවන සහ සංකීර්ණ ව්යාපෘති වන බැවිනි. අපි විවෘත මූලාශ්ර සංවර්ධනයට දැඩි ලෙස සහාය දෙන අතර එය ප්රචලිත කිරීමේ නිරතව සිටින අතර පරිගණක විද්යාව සහ ගණිත ක්ෂේත්රයේ ප්රමුඛ රුසියානු විශ්ව විද්යාල සමඟ සහයෝගයෙන් කටයුතු කරන්නෙමු.
තරඟයේ සිත්ගන්නා කාර්යයන් සහ අපගේ ආදරණීය ටෙලිග්රාම් ව්යාපෘතියට සම්බන්ධ වීම විශිෂ්ට අභිප්රේරණයක් වූ නමුත් ත්යාග අරමුදල අමතර දිරිගැන්වීමක් විය. 🙂
ටොන් බ්ලොක්චේන් පර්යේෂණ
අපි බ්ලොක්චේන්, කෘතිම බුද්ධිය සහ යන්ත්ර ඉගෙනීමේ නව වර්ධනයන් සමීපව නිරීක්ෂණය කරන අතර අප වැඩ කරන සෑම ක්ෂේත්රයකම එක වැදගත් නිකුතුවක්වත් අතපසු නොකිරීමට උත්සාහ කරමු. එබැවින්, තරඟය ආරම්භ වන විට, අපගේ කණ්ඩායම දැනටමත් අදහස් දැන සිටියේය
තරඟය ආරම්භ වන විට, කේතය දැනටමත් ප්රකාශයට පත් කර ඇත, එබැවින් කාලය ඉතිරි කර ගැනීම සඳහා, අපි විසින් ලියන ලද මාර්ගෝපදේශයක් හෝ සාරාංශයක් සෙවීමට තීරණය කළෙමු. පරිශීලකයන් විසින්. අවාසනාවකට, මෙය කිසිදු ප්රතිපලයක් ලබා දුන්නේ නැත - උබුන්ටු මත වේදිකාව එකලස් කිරීම සඳහා උපදෙස් හැරුණු විට, අපට වෙනත් ද්රව්ය කිසිවක් හමු නොවීය.
ලියකියවිලි හොඳින් අධ්යයනය කර ඇති නමුත් සමහර ප්රදේශවල කියවීමට අපහසු විය. බොහෝ විට අපට ඇතැම් කරුණු වෙත ආපසු යාමට සිදු වූ අතර වියුක්ත අදහස්වල ඉහළ මට්ටමේ විස්තරවල සිට පහළ මට්ටමේ ක්රියාත්මක කිරීමේ විස්තර වෙත මාරු විය.
පිරිවිතරයේ ක්රියාත්මක කිරීම පිළිබඳ සවිස්තරාත්මක විස්තරයක් ඇතුළත් නොවේ නම් එය පහසු වනු ඇත. අතථ්ය යන්ත්රයක් එහි තොගය නියෝජනය කරන්නේ කෙසේද යන්න පිළිබඳ තොරතුරු ඔවුන්ට උපකාර කිරීමට වඩා TON වේදිකාව සඳහා ස්මාර්ට් කොන්ත්රාත්තු නිර්මාණය කරන සංවර්ධකයින්ගේ අවධානය වෙනතකට යොමු කිරීමට ඉඩ ඇත.
නික්ස්: ව්යාපෘතිය එකට තැබීම
Serokell හි අපි විශාල රසිකයෝ වෙමු
ඉතින් අපි නිර්මාණය කිරීම ආරම්භ කළා
$ 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 හි යාලුවෝ නව ක්රමලේඛන භාෂා තුනක් නිර්මාණය කළහ:
පස් සමාන වන විශ්ව ස්ටැක් ක්රමලේඛන භාෂාවකි
FunC සමාන වන ස්මාර්ට් කොන්ත්රාත් ක්රමලේඛන භාෂාවකි
පස්වන එකලස් කරන්නා — TVM සඳහා ද්විමය ක්රියාත්මක කළ හැකි කේතය ජනනය කිරීම සඳහා පස් පුස්තකාලය. පස්වන එකලස් කරන්නාට සම්පාදකයක් නොමැත. මෙය
අපගේ තරඟය වැඩ කරයි
අවසාන වශයෙන්, අපගේ උත්සාහයේ ප්රතිඵල දෙස බැලීමට කාලයයි.
අසමමුහුර්ත ගෙවීම් නාලිකාව
ගෙවීම් නාලිකාව යනු පරිශීලකයින් දෙදෙනෙකුට වාරණයෙන් පිටත ගෙවීම් යැවීමට ඉඩ සලසන ස්මාර්ට් කොන්ත්රාත්තුවක් වේ. ප්රති result ලයක් වශයෙන්, ඔබ මුදල් පමණක් ඉතිරි කරයි (කොමිස් මුදලක් නොමැත), නමුත් කාලයද (ඊළඟ වාරණ සැකසීමට ඔබ බලා සිටිය යුතු නැත). ගෙවීම් අවශ්ය තරම් කුඩා විය හැකි අතර අවශ්ය පරිදි නිතර විය හැක. මෙම නඩුවේදී, අවසාන විසඳුමේ සාධාරණත්වය ස්මාර්ට් කොන්ත්රාත්තුවෙන් සහතික කර ඇති බැවින්, පාර්ශවයන් එකිනෙකා විශ්වාස කළ යුතු නැත.
අපි ගැටලුවට තරමක් සරල විසඳුමක් සොයා ගත්තා. පාර්ශ්ව දෙකකට අත්සන් කළ පණිවිඩ හුවමාරු කර ගත හැකිය, එක් එක් අංක දෙකක් අඩංගු වේ - එක් එක් පාර්ශවය විසින් ගෙවන ලද සම්පූර්ණ මුදල. මේ අංක දෙක හරියට වැඩ කරනවා
ඇත්ත වශයෙන්ම, මෙම අදහස ක්රියාත්මක කිරීමට එක් අංකයක් ප්රමාණවත් වේ, නමුත් අපි දෙකම අත්හැරියේ මේ ආකාරයෙන් අපට වඩාත් පහසු පරිශීලක අතුරුමුහුණතක් සෑදිය හැකි බැවිනි. ඊට අමතරව, අපි එක් එක් පණිවිඩයේ ගෙවීම් මුදල ඇතුළත් කිරීමට තීරණය කළෙමු. එය නොමැතිව, කිසියම් හේතුවක් නිසා පණිවිඩය නැති වුවහොත්, සියලු ප්රමාණයන් සහ අවසාන ගණනය කිරීම නිවැරදි වුවද, පරිශීලකයාට අලාභය නොපෙනේ.
අපගේ අදහස පරීක්ෂා කිරීම සඳහා, අපි එවැනි සරල සහ සංක්ෂිප්ත ගෙවීම් නාලිකා ප්රොටෝකෝලයක් භාවිතා කිරීමේ උදාහරණ සෙව්වෙමු. පුදුමයට කරුණක් නම්, අපට හමු වූයේ දෙකක් පමණි:
විස්තර සමාන ප්රවේශයක්, ඒක දිශානුගත නාලිකාවක් සඳහා පමණි.නිබන්ධනය , එය අපගේ අදහස හා සමාන අදහස විස්තර කරයි, නමුත් සාමාන්ය නිවැරදිභාවය සහ ගැටුම් නිරාකරණය කිරීමේ ක්රියා පටිපාටි වැනි බොහෝ වැදගත් තොරතුරු පැහැදිලි නොකර.
එහි නිවැරදි බව කෙරෙහි විශේෂ අවධානයක් යොමු කරමින් අපගේ ප්රොටෝකෝලය විස්තරාත්මකව විස්තර කිරීම අර්ථවත් බව පැහැදිලි විය. පුනරාවර්තන කිහිපයකින් පසු, පිරිවිතරය සූදානම් විය, දැන් ඔබටත් පුළුවන්.
අපි කොන්ත්රාත්තුව FunC හි ක්රියාත්මක කළ අතර, සංවිධායකයින් විසින් නිර්දේශ කරන ලද පරිදි, අපගේ කොන්ත්රාත්තුව සමඟ සම්පුර්ණයෙන්ම අන්තර් ක්රියා කිරීම සඳහා විධාන රේඛා උපයෝගීතාව අපි ලිව්වෙමු. අපගේ CLI සඳහා අපට වෙනත් ඕනෑම භාෂාවක් තෝරාගත හැකිව තිබුණි, නමුත් එය ප්රායෝගිකව ක්රියාත්මක වන ආකාරය බැලීමට Fit උත්සාහ කිරීමට අපි උනන්දු වෙමු.
ඇත්තම කිව්වොත්, ෆිෆ්ට් සමඟ වැඩ කිරීමෙන් පසු, සංවර්ධිත මෙවලම් සහ පුස්තකාල සහිත ජනප්රිය සහ සක්රියව භාවිතා කරන භාෂාවලට වඩා මෙම භාෂාවට කැමති වීමට ප්රබල හේතු කිසිවක් අපට නොපෙනුණි. ස්ටැක් මත පදනම් වූ භාෂාවකින් ක්රමලේඛනය කිරීම තරමක් අප්රසන්න ය, මන්ද ඔබ නිතරම තොගයේ ඇති දේ ඔබේ හිසෙහි තබා ගත යුතු අතර සම්පාදකය මේ සඳහා උදව් නොකරයි.
එබැවින්, අපගේ මතය අනුව, ෆිෆ්ට් හි පැවැත්ම සඳහා ඇති එකම සාධාරණීකරණය වන්නේ ෆිෆ්ට් එකලස් කරන්නා සඳහා සත්කාරක භාෂාවක් ලෙස එහි භූමිකාවයි. නමුත් මෙම අත්යවශ්යයෙන්ම එකම අරමුණ සඳහා නව එකක් නිර්මාණය කරනවාට වඩා TVM එකලස් කරන්නා පවතින භාෂාවකට කාවැද්දීම වඩා හොඳ නොවේද?
TVM Haskell eDSL
දැන් අපගේ දෙවන ස්මාර්ට් ගිවිසුම ගැන කතා කිරීමට කාලයයි. අපි බහු-අත්සන මුදල් පසුම්බියක් සංවර්ධනය කිරීමට තීරණය කළෙමු, නමුත් FunC හි තවත් ස්මාර්ට් කොන්ත්රාත්තුවක් ලිවීම කම්මැලි වනු ඇත. අපට යම් රසයක් එක් කිරීමට අවශ්ය වූ අතර, එය TVM සඳහා අපගේම එකලස් කිරීමේ භාෂාව විය.
ෆිෆ්ට් එකලස් කරන්නා මෙන්, අපගේ නව භාෂාව කාවැදී ඇත, නමුත් අපි ෆිෆ්ට් වෙනුවට හස්කල් ධාරකය ලෙස තෝරා ගත් අතර, එහි උසස් ආකාරයේ පද්ධතියෙන් උපරිම ප්රයෝජන ගැනීමට අපට ඉඩ සලසයි. ස්මාර්ට් කොන්ත්රාත්තු සමඟ වැඩ කරන විට, කුඩා දෝෂයක පිරිවැය ඉතා ඉහළ විය හැකි විට, ස්ථිතික ටයිප් කිරීම අපගේ මතය අනුව විශාල වාසියකි.
TVM එකලස් කරන්නා Haskell හි තැන්පත් කර ඇති ආකාරය නිරූපණය කිරීමට, අපි එය මත සම්මත මුදල් පසුම්බියක් ක්රියාත්මක කළෙමු. අවධානය යොමු කළ යුතු කරුණු කිහිපයක් මෙන්න:
- මෙම කොන්ත්රාත්තුව එක් කාර්යයකින් සමන්විත වේ, නමුත් ඔබට කැමති තරම් භාවිතා කළ හැකිය. ඔබ සත්කාරක භාෂාවෙන් (එනම් Haskell) නව ශ්රිතයක් නිර්වචනය කරන විට, අපගේ eDSL ඔබට එය TVM හි වෙනම දින චර්යාවක් බවට පත් කිරීමට අවශ්යද නැතිනම් ඇමතුම් ස්ථානයේදී සරලව ඇතුළත් කිරීමට අවශ්යද යන්න තෝරා ගැනීමට ඉඩ සලසයි.
- Haskell මෙන්, ශ්රිතවලට සම්පාදනය කරන අවස්ථාවේදී පරීක්ෂා කරන වර්ග තිබේ. අපගේ eDSL හි, ශ්රිතයක ආදාන වර්ගය යනු ශ්රිතය අපේක්ෂා කරන අට්ටි වර්ගය වන අතර ප්රතිඵල වර්ගය යනු ඇමතුමෙන් පසුව නිපදවන අට්ටි වර්ගයයි.
- කේතයට විවරණ ඇත
stacktype
, ඇමතුම් ස්ථානයේ අපේක්ෂිත තොග වර්ගය විස්තර කිරීම. මුල් පසුම්බි කොන්ත්රාත්තුවේ මේවා හුදෙක් අදහස් පමණි, නමුත් අපගේ eDSL හි ඒවා ඇත්ත වශයෙන්ම කේතයේ කොටසක් වන අතර සම්පාදනය කරන අවස්ථාවේදී පරීක්ෂා කරනු ලැබේ. කේතය වෙනස් වුවහොත් සහ අට්ටි වර්ගය වෙනස් වුවහොත් සංවර්ධකයාට ගැටලුව සොයා ගැනීමට උපකාර වන ලේඛන හෝ ප්රකාශයන් ලෙස ඒවා සේවය කළ හැකිය. ඇත්ත වශයෙන්ම, එවැනි අනුසටහන් ධාවන කාල ක්රියාකාරිත්වයට බලපාන්නේ නැත, මන්ද ඒවා සඳහා TVM කේතයක් ජනනය නොවේ. - මෙය තවමත් සති දෙකකින් ලියැවුණු මූලාකෘතියක් බැවින් ව්යාපෘතියේ තවත් බොහෝ වැඩ කොටසක් කිරීමට තිබේ. උදාහරණයක් ලෙස, පහත කේතයේ ඔබ දකින පන්තිවල සියලුම අවස්ථා ස්වයංක්රීයව ජනනය විය යුතුය.
අපගේ eDSL හි මල්ටිසිග් පසුම්බියක් ක්රියාත්මක කිරීම පෙනෙන්නේ මෙයයි:
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 භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ අදහස් තිබේ නම්,
මූලාශ්රය: www.habr.com