JÅ«s droÅ”i vien esat dzirdÄjuÅ”i, ka Telegram . Bet jÅ«s, iespÄjams, palaidÄt garÄm ziÅas, kas pirms neilga laika bija Telegram viena vai vairÄku viedo lÄ«gumu ievieÅ”anai Å”ai platformai.
Serokell komanda ar lielu pieredzi lielu blokÄ·Ädes projektu izstrÄdÄ nevarÄja stÄvÄt malÄ. MÄs konkursam deleÄ£ÄjÄm piecus darbiniekus, un pÄc divÄm nedÄļÄm viÅi tajÄ ieÅÄma pirmo vietu ar (ne)pieticÄ«go izlases segvÄrdu Sexy Chameleon. Å ajÄ rakstÄ es runÄÅ”u par to, kÄ viÅi to darÄ«ja. MÄs ceram, ka tuvÄko desmit minūŔu laikÄ jÅ«s vismaz izlasÄ«siet kÄdu interesantu stÄstu un, maksimums, jÅ«s atradÄ«siet tajÄ kaut ko noderÄ«gu, ko varÄsiet pielietot savÄ darbÄ.
Bet sÄksim ar nelielu kontekstu.
SacensÄ«bas un tÄs nosacÄ«jumi
TÄtad dalÄ«bnieku galvenie uzdevumi bija viena vai vairÄku piedÄvÄto viedo lÄ«gumu ievieÅ”ana, kÄ arÄ« priekÅ”likumu sniegÅ”ana TON ekosistÄmas uzlaboÅ”anai. Konkurss norisinÄjÄs no 24. septembra lÄ«dz 15. oktobrim, un rezultÄti tika paziÅoti tikai 15. novembrÄ«. Diezgan ilgu laiku, Åemot vÄrÄ, ka Å”ajÄ laikÄ Telegram izdevÄs noturÄt un paziÅot konkursa rezultÄtus par lietojumprogrammu projektÄÅ”anu un izstrÄdi C++ valodÄ, lai pÄrbaudÄ«tu un novÄrtÄtu VoIP zvanu kvalitÄti Telegram.
MÄs izvÄlÄjÄmies divus viedos lÄ«gumus no organizatoru piedÄvÄtÄ saraksta. Vienam no tiem mÄs izmantojÄm rÄ«kus, kas izplatÄ«ti ar TON, bet otrais tika ieviests jaunÄ valodÄ, ko mÅ«su inženieri izstrÄdÄja Ä«paÅ”i TON un iebÅ«vÄta Haskell.
FunkcionÄlÄs programmÄÅ”anas valodas izvÄle nav nejauÅ”a. MÅ«su MÄs bieži runÄjam par to, kÄpÄc, mÅ«suprÄt, funkcionÄlo valodu sarežģītÄ«ba ir milzÄ«gs pÄrspÄ«lÄjums un kÄpÄc mÄs parasti dodam priekÅ”roku tÄm, nevis objektorientÄtajÄm. Starp citu, tas satur arÄ« .
KÄpÄc mÄs vispÄr nolÄmÄm piedalÄ«ties?
ÄŖsÄk sakot, tÄpÄc, ka mÅ«su specializÄcija ir nestandarta un sarežģīti projekti, kas prasa Ä«paÅ”as prasmes un bieži vien ir zinÄtniski vÄrtÄ«gi IT sabiedrÄ«bai. MÄs stingri atbalstÄm atvÄrtÄ pirmkoda attÄ«stÄ«bu un esam iesaistÄ«ti tÄ popularizÄÅ”anÄ, kÄ arÄ« sadarbojamies ar vadoÅ”ajÄm Krievijas universitÄtÄm datorzinÄtÅu un matemÄtikas jomÄ.
Interesantie konkursa uzdevumi un iesaistīŔanÄs mÅ«su iemīļotajÄ Telegram projektÄ pati par sevi bija lieliska motivÄcija, bet balvu fonds kļuva par papildu stimulu. š
TON blokÄ·Ädes izpÄte
MÄs rÅ«pÄ«gi sekojam jaunÄkajÄm tendencÄm blokÄ·Ädes, mÄkslÄ«gÄ intelekta un maŔīnmÄcīŔanÄs jomÄ un cenÅ”amies nepalaist garÄm nevienu nozÄ«mÄ«gu izlaidumu katrÄ jomÄ, kurÄ strÄdÄjam. TÄpÄc lÄ«dz konkursa sÄkumam mÅ«su komanda jau bija iepazinusies ar idejÄm no . TomÄr pirms darba uzsÄkÅ”anas ar TON mÄs neanalizÄjÄm platformas tehnisko dokumentÄciju un faktisko pirmkodu, tÄpÄc pirmais solis bija diezgan acÄ«mredzams - rÅ«pÄ«ga oficiÄlÄs dokumentÄcijas izpÄte un .
LÄ«dz konkursa sÄkumam kods jau bija publicÄts, tÄpÄc, lai ietaupÄ«tu laiku, nolÄmÄm meklÄt ceļvedi vai kopsavilkumu, ko uzrakstÄ«ja lietotÄji. DiemžÄl tas nedeva nekÄdus rezultÄtus ā izÅemot instrukcijas platformas montÄžai uz Ubuntu, nekÄdus citus materiÄlus neatradÄm.
Pati dokumentÄcija bija labi izpÄtÄ«ta, taÄu dažÄs jomÄs to bija grÅ«ti izlasÄ«t. Diezgan bieži nÄcÄs atgriezties pie noteiktiem punktiem un pÄrslÄgties no augsta lÄ«meÅa abstraktu ideju aprakstiem uz zema lÄ«meÅa Ä«stenoÅ”anas detaļÄm.
BÅ«tu vienkÄrÅ”Äk, ja specifikÄcijÄ vispÄr nebÅ«tu iekļauts detalizÄts ievieÅ”anas apraksts. InformÄcija par to, kÄ virtuÄlÄ maŔīna attÄlo savu kopumu, visticamÄk, novirzÄ«s izstrÄdÄtÄju uzmanÄ«bu, veidojot viedos lÄ«gumus TON platformai, nevis palÄ«dzÄs viÅiem.
Nix: projekta apvienoŔana
MÄs Serokell esam lieli fani . MÄs ar to apkopojam savus projektus un izvietojam tos, izmantojot , un instalÄta visos mÅ«su serveros . Pateicoties tam, visas mÅ«su versijas ir reproducÄjamas un darbojas ar jebkuru operÄtÄjsistÄmu, kurÄ var instalÄt Nix.
TÄpÄc mÄs sÄkÄm ar radīŔanu . Ar tÄs palÄ«dzÄ«bu TON apkopoÅ”ana ir pÄc iespÄjas vienkÄrÅ”Äka:
$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && makeÅ emiet vÄrÄ, ka jums nav jÄinstalÄ nekÄdas atkarÄ«bas. Nix maÄ£iski darÄ«s visu jÅ«su vietÄ neatkarÄ«gi no tÄ, vai izmantojat NixOS, Ubuntu vai macOS.
ProgrammÄÅ”ana TON
Viedais lÄ«guma kods TON tÄ«klÄ darbojas TON virtuÄlajÄ maŔīnÄ (TVM). TVM ir sarežģītÄka nekÄ vairums citu virtuÄlo maŔīnu, un tai ir ļoti interesanta funkcionalitÄte, piemÄram, ar to var strÄdÄt turpinÄjumi Šø saites uz datiem.
TurklÄt puiÅ”i no TON izveidoja trÄ«s jaunas programmÄÅ”anas valodas:
PiektÄ ir universÄla steka programmÄÅ”anas valoda, kas lÄ«dzinÄs . ViÅa superspÄja ir spÄja mijiedarboties ar TVM.
FunC ir viedÄ lÄ«guma programmÄÅ”anas valoda, kas ir lÄ«dzÄ«ga un ir apkopots citÄ valodÄ - Fift Assembler.
Piektais montÄtÄjs ā Fift bibliotÄka binÄra izpildÄmÄ koda Ä£enerÄÅ”anai TVM. Fifth Assembler nav kompilatora. Å is .
Mūsu konkurss darbojas
Visbeidzot, ir pienÄcis laiks aplÅ«kot mÅ«su centienu rezultÄtus.
Asinhronais maksÄjumu kanÄls
MaksÄjumu kanÄls ir vieds lÄ«gums, kas ļauj diviem lietotÄjiem nosÅ«tÄ«t maksÄjumus Ärpus blokÄ·Ädes. RezultÄtÄ jÅ«s ietaupÄt ne tikai naudu (nav komisijas maksas), bet arÄ« laiku (jums nav jÄgaida nÄkamÄ bloka apstrÄde). MaksÄjumi var bÅ«t tik mazi, cik vÄlaties, un tik bieži, cik nepiecieÅ”ams. Å ajÄ gadÄ«jumÄ pusÄm nav jÄuzticas viena otrai, jo gala norÄÄ·inu godÄ«gumu garantÄ viedais lÄ«gums.
MÄs atradÄm diezgan vienkÄrÅ”u problÄmas risinÄjumu. Divas puses var apmainÄ«ties ar parakstÄ«tiem ziÅojumiem, katrÄ no kuriem ir divi numuri ā katras puses maksÄtÄ pilna summa. Å ie divi skaitļi darbojas lÄ«dzÄ«gi tradicionÄlajÄs izplatÄ«tajÄs sistÄmÄs un iestatiet darÄ«jumu secÄ«bu "pirms noticis". Izmantojot Å”os datus, lÄ«gums spÄs atrisinÄt jebkuru iespÄjamo konfliktu.
PatiesÄ«bÄ Å”Ä«s idejas Ä«stenoÅ”anai pietiek ar vienu numuru, bet mÄs atstÄjÄm abus, jo tÄdÄjÄdi varÄjÄm izveidot ÄrtÄku lietotÄja interfeisu. TurklÄt mÄs nolÄmÄm katrÄ ziÅojumÄ iekļaut maksÄjuma summu. Bez tÄ, ja kÄda iemesla dÄļ ziÅa pazÅ«d, tad, lai arÄ« visas summas un gala aprÄÄ·ins bÅ«s pareizs, lietotÄjs zaudÄjumu var nepamanÄ«t.
Lai pÄrbaudÄ«tu savu ideju, meklÄjÄm piemÄrus Å”Äda vienkÄrÅ”a un kodolÄ«ga maksÄjumu kanÄla protokola izmantoÅ”anai. PÄrsteidzoÅ”i, mÄs atradÄm tikai divus:
- lÄ«dzÄ«ga pieeja, tikai vienvirziena kanÄla gadÄ«jumÄ.
- , kas apraksta to paÅ”u ideju, kas mÅ«su, bet nepaskaidrojot daudzas svarÄ«gas detaļas, piemÄram, vispÄrÄ«gu pareizÄ«bu un konfliktu risinÄÅ”anas procedÅ«ras.
Kļuva skaidrs, ka ir jÄga detalizÄti aprakstÄ«t mÅ«su protokolu, Ä«paÅ”u uzmanÄ«bu pievÄrÅ”ot tÄ pareizÄ«bai. PÄc vairÄkÄm iterÄcijÄm specifikÄcija bija gatava, un tagad arÄ« jÅ«s varat. .
MÄs ieviesÄm lÄ«gumu pakalpojumÄ FunC un komandrindas utilÄ«tu, lai pilnÄ«bÄ mijiedarbotos ar mÅ«su lÄ«gumu, Fift, kÄ to ieteikuÅ”i organizatori. MÄs varÄjÄm izvÄlÄties jebkuru citu valodu savai CLI, taÄu mÄs vÄlÄjÄmies izmÄÄ£inÄt Fit, lai redzÄtu, kÄ tas darbojas praksÄ.
GodÄ«gi sakot, pÄc darba ar Fift mÄs neredzÄjÄm nekÄdus pÄrliecinoÅ”us iemeslus, lai dotu priekÅ”roku Å”ai valodai populÄrÄm un aktÄ«vi lietotÄm valodÄm ar izstrÄdÄtiem rÄ«kiem un bibliotÄkÄm. ProgrammÄÅ”ana steka valodÄ ir diezgan nepatÄ«kama, jo jums pastÄvÄ«gi ir jÄtur galvÄ tas, kas atrodas stekÄ, un kompilators ar to nepalÄ«dz.
TÄpÄc, mÅ«suprÄt, vienÄ«gais Fift pastÄvÄÅ”anas attaisnojums ir tÄs kÄ Fift Assembler saimniekvalodas loma. Bet vai nebÅ«tu labÄk iegult TVM montÄtÄju kÄdÄ esoÅ”Ä valodÄ, nevis izgudrot jaunu Å”im bÅ«tÄ«bÄ vienÄ«gajam mÄrÄ·im?
TVM Haskell eDSL
Tagad ir pienÄcis laiks runÄt par mÅ«su otro viedo lÄ«gumu. MÄs nolÄmÄm izstrÄdÄt vairÄku parakstu maku, taÄu rakstÄ«t vÄl vienu viedo lÄ«gumu FunC bÅ«tu pÄrÄk garlaicÄ«gi. MÄs vÄlÄjÄmies pievienot kÄdu garÅ”u, un tÄ bija mÅ«su paÅ”u salikÅ”anas valoda TVM.
TÄpat kÄ Fift Assembler, mÅ«su jaunÄ valoda ir iegulta, taÄu mÄs izvÄlÄjÄmies Haskell kÄ saimniekdatoru, nevis Fift, ļaujot mums pilnÄ«bÄ izmantot tÄs uzlabotÄ tipa sistÄmu. StrÄdÄjot ar viedajiem lÄ«gumiem, kur pat nelielas kļūdas izmaksas var bÅ«t ļoti augstas, statiskÄ rakstīŔana, mÅ«suprÄt, ir liela priekÅ”rocÄ«ba.
Lai parÄdÄ«tu, kÄ izskatÄs TVM montÄtÄjs, kas ir iegults Haskell, mÄs tajÄ ievietojÄm standarta maku. Å eit ir dažas lietas, kurÄm jÄpievÄrÅ” uzmanÄ«ba:
- Å is lÄ«gums sastÄv no vienas funkcijas, taÄu jÅ«s varat izmantot tik daudz, cik vÄlaties. Kad definÄjat jaunu funkciju resursdatora valodÄ (t.i., Haskell), mÅ«su eDSL ļauj jums izvÄlÄties, vai vÄlaties, lai tÄ kļūtu par atseviŔķu TVM rutÄ«nu vai vienkÄrÅ”i iekļauta zvana punktÄ.
- TÄpat kÄ Haskell, funkcijÄm ir veidi, kas tiek pÄrbaudÄ«ti kompilÄÅ”anas laikÄ. MÅ«su eDSL funkcijas ievades veids ir steka veids, ko funkcija sagaida, un rezultÄta veids ir steka veids, kas tiks izveidots pÄc izsaukuma.
- Kodam ir anotÄcijas
stacktype, aprakstot sagaidÄmo steka veidu izsaukuma punktÄ. SÄkotnÄjÄ maka lÄ«gumÄ tie bija tikai komentÄri, bet mÅ«su eDSL tie faktiski ir daļa no koda un tiek pÄrbaudÄ«ti kompilÄÅ”anas laikÄ. Tie var kalpot kÄ dokumentÄcija vai paziÅojumi, kas palÄ«dz izstrÄdÄtÄjam atrast problÄmu, ja mainÄs kods un mainÄs steka veids. Protams, Å”Ädas anotÄcijas neietekmÄ izpildlaika veiktspÄju, jo tÄm netiek Ä£enerÄts TVM kods. - Å is joprojÄm ir divu nedÄļu laikÄ uzrakstÄ«ts prototips, tÄpÄc pie projekta vÄl ir daudz darÄmÄ. PiemÄram, visi tÄlÄk norÄdÄ«tajÄ kodÄ redzamo klaÅ”u gadÄ«jumi ir jÄÄ£enerÄ automÄtiski.
Å Ädi izskatÄs multisig maka ievieÅ”ana mÅ«su 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 @Word32Pilnu mÅ«su eDSL un vairÄku parakstu maka lÄ«guma avota kodu var atrast vietnÄ Un vÄl par iebÅ«vÄtajÄm valodÄm, mÅ«su kolÄÄ£is Georgijs Agapovs.
SecinÄjumi par konkursu un TON
KopÄ mÅ«su darbs aizÅÄma 380 stundas (ieskaitot iepazīŔanos ar dokumentÄciju, sapulces un faktisko izstrÄdi). Konkursa projektÄ piedalÄ«jÄs pieci izstrÄdÄtÄji: CTO, komandas vadÄ«tÄjs, blokÄ·Ädes platformas speciÄlisti un Haskell programmatÅ«ras izstrÄdÄtÄji.
MÄs atradÄm resursus, lai bez grÅ«tÄ«bÄm piedalÄ«tos konkursÄ, jo hakatona gars, cieÅ”s komandas darbs un nepiecieÅ”amÄ«ba Ätri iedziļinÄties jauno tehnoloÄ£iju aspektos vienmÄr ir aizraujoÅ”i. VairÄkas negulÄtÄs naktis, lai sasniegtu maksimÄlu rezultÄtu ierobežotu resursu apstÄkļos, tiek kompensÄtas ar nenovÄrtÄjamu pieredzi un izcilÄm atmiÅÄm. TurklÄt darbs pie Å”Ädiem uzdevumiem vienmÄr ir labs uzÅÄmuma procesu tests, jo bez labi funkcionÄjoÅ”as iekÅ”ÄjÄs mijiedarbÄ«bas ir ÄrkÄrtÄ«gi grÅ«ti sasniegt patiesi pienÄcÄ«gus rezultÄtus.
Dziesmu vÄrdi malÄ: mÅ«s pÄrsteidza TON komandas ieguldÄ«tÄ darba apjoms. ViÅiem izdevÄs izveidot sarežģītu, skaistu un, pats galvenais, strÄdÄjoÅ”u sistÄmu. TON ir pierÄdÄ«jis sevi kÄ platformu ar lielu potenciÄlu. TaÄu, lai Ŕī ekosistÄma attÄ«stÄ«tos, ir jÄdara daudz vairÄk gan attiecÄ«bÄ uz tÄs izmantoÅ”anu blokÄ·Ädes projektos, gan arÄ« attiecÄ«bÄ uz izstrÄdes rÄ«ku uzlaboÅ”anu. MÄs esam lepni, ka tagad esam daļa no Ŕī procesa.
Ja pÄc Ŕī raksta izlasīŔanas jums joprojÄm ir kÄdi jautÄjumi vai idejas par to, kÄ izmantot TON savu problÄmu risinÄÅ”anai, ā ar prieku dalÄ«simies pieredzÄ.
Avots: www.habr.com
