ProHoster > Blogs > AdministrÄcija > FunC pÄrvÄrÅ”ana par funkcionÄlu ar Haskell: kÄ Serokell uzvarÄja Telegram Blockchain konkursÄ
FunC pÄrvÄrÅ”ana par funkcionÄlu ar Haskell: kÄ Serokell uzvarÄja Telegram Blockchain konkursÄ
JÅ«s droÅ”i vien esat dzirdÄjuÅ”i, ka Telegram gatavojas uzsÄkt Ton blockchain platformu. Bet jÅ«s, iespÄjams, palaidÄt garÄm ziÅas, kas pirms neilga laika bija Telegram izsludinÄja konkursu 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 korporatÄ«vais emuÄrs 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Ä« Ŕī raksta oriÄ£inÄls.
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 TON balts papÄ«rs. 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 TieÅ”saistÄ un projektu krÄtuves.
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 uzmanies. MÄs ar to apkopojam savus projektus un izvietojam tos, izmantojot NixOps, un instalÄta visos mÅ«su serveros Nix OS. Pateicoties tam, visas mÅ«su versijas ir reproducÄjamas un darbojas ar jebkuru operÄtÄjsistÄmu, kurÄ var instalÄt Nix.
$ 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 Forth. ViÅa superspÄja ir spÄja mijiedarboties ar TVM.
FunC ir viedÄ lÄ«guma programmÄÅ”anas valoda, kas ir lÄ«dzÄ«ga C 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 Embedded Domain Specific Language (eDSL).
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 vektoru pulkstenis 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:
Apraksts lÄ«dzÄ«ga pieeja, tikai vienvirziena kanÄla gadÄ«jumÄ.
ApmÄcÄ«ba, 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. Paskaties uz viÅu.
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:
Pilnu mÅ«su eDSL un vairÄku parakstu maka lÄ«guma avota kodu var atrast vietnÄ Å”o repozitoriju. Un vÄl sÄ«ki pastÄstÄ«ts 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, raksti mums ā ar prieku dalÄ«simies pieredzÄ.