Nibdlu FunC f'FunCzzjonali ma' Haskell: Kif Serokell rebaħ il-Kompetizzjoni Telegram Blockchain

Probabbilment smajt dak it-Telegram wasal biex tniedi l-pjattaforma Ton blockchain. Imma forsi tlift l-aħbar li ftit ilu Telegram ħabbar kompetizzjoni għall-implimentazzjoni ta’ kuntratt intelliġenti wieħed jew aktar għal din il-pjattaforma.

It-tim ta 'Serokell, b'esperjenza estensiva fl-iżvilupp ta' proġetti kbar ta 'blockchain, ma setax joqgħod fil-ġenb. Iddelegajna ħames impjegati għall-kompetizzjoni, u ġimgħatejn wara ħadu l-ewwel post fiha taħt il-laqam (in)modest każwali Sexy Chameleon. F'dan l-artikolu ser nitkellem dwar kif għamlu dan. Nittamaw li fl-għaxar minuti li ġejjin mill-inqas taqra storja interessanti, u l-aktar issib xi ħaġa utli fiha li tista’ tapplika fix-xogħol tiegħek.

Imma ejja nibdew bi ftit kuntest.

Il-kompetizzjoni u l-kundizzjonijiet tagħha

Għalhekk, il-kompiti ewlenin tal-parteċipanti kienu l-implimentazzjoni ta 'wieħed jew aktar mill-kuntratti intelliġenti proposti, kif ukoll li jagħmlu proposti biex tittejjeb l-ekosistema TON. Il-kompetizzjoni saret mill-24 ta’ Settembru sal-15 ta’ Ottubru, u r-riżultati tħabbru biss fil-15 ta’ Novembru. Żmien pjuttost twil, meta wieħed iqis li matul dan iż-żmien Telegram irnexxielu jżomm u jħabbar ir-riżultati tal-konkorsi dwar id-disinn u l-iżvilupp ta 'applikazzjonijiet f'C++ għall-ittestjar u l-valutazzjoni tal-kwalità tas-sejħiet VoIP f'Telegram.

Aħna għażilna żewġ kuntratti intelliġenti mil-lista proposta mill-organizzaturi. Għal waħda minnhom, użajna għodda mqassma b'TON, u t-tieni ġiet implimentata f'lingwa ġdida żviluppata mill-inġiniera tagħna speċifikament għal TON u mibnija f'Haskell.

L-għażla ta 'lingwa ta' programmar funzjonali mhix aċċidentali. Fil tagħna blog korporattiv Ħafna drabi nitkellmu dwar għaliex naħsbu li l-kumplessità tal-lingwi funzjonali hija eżaġerazzjoni kbira u għaliex ġeneralment nippreferuhom minn dawk orjentati lejn l-oġġetti. Mill-mod, fih ukoll oriġinali ta’ dan l-artikolu.

Għaliex iddeċidejna li nieħdu sehem?

Fil-qosor, għaliex l-ispeċjalizzazzjoni tagħna hija proġetti mhux standard u kumplessi li jeħtieġu ħiliet speċjali u ħafna drabi huma ta 'valur xjentifiku għall-komunità tal-IT. Aħna nappoġġaw bil-qawwa l-iżvilupp ta 'sors miftuħ u aħna impenjati fil-popolarizzazzjoni tiegħu, u nikkooperaw ukoll ma' universitajiet Russi ewlenin fil-qasam tax-xjenza tal-kompjuter u l-matematika.

Il-kompiti interessanti tal-kompetizzjoni u l-involviment fil-proġett maħbub tagħna Telegram kienu fihom infushom motivazzjoni eċċellenti, iżda l-fond tal-premju sar inċentiv addizzjonali. 🙂

Riċerka blockchain TON

Aħna nissorveljaw mill-qrib żviluppi ġodda fil-blockchain, l-intelliġenza artifiċjali u t-tagħlim tal-magni u nippruvaw ma nitilfux rilaxx sinifikanti wieħed f'kull wieħed mill-oqsma li naħdmu fihom. Għalhekk, sa meta bdiet il-kompetizzjoni, it-tim tagħna kien diġà familjari ma 'ideat minn TON karta bajda. Madankollu, qabel ma bdejna x-xogħol ma 'TON, aħna ma analizzajniex id-dokumentazzjoni teknika u l-kodiċi tas-sors attwali tal-pjattaforma, għalhekk l-ewwel pass kien pjuttost ovvju - studju bir-reqqa tad-dokumentazzjoni uffiċjali dwar Online u repożitorji tal-proġetti.

Sakemm bdiet il-kompetizzjoni, il-kodiċi kien diġà ġie ppubblikat, għalhekk biex niffrankaw il-ħin, iddeċidejna li nfittxu gwida jew sommarju miktub minn mill-utenti. Sfortunatament, dan ma ta l-ebda riżultat - apparti l-istruzzjonijiet għall-assemblaġġ tal-pjattaforma fuq Ubuntu, ma sibna l-ebda materjal ieħor.

Id-dokumentazzjoni nnifisha kienet riċerkata tajjeb, iżda kienet diffiċli biex tinqara f'xi oqsma. Ħafna drabi kellna nerġgħu lura għal ċerti punti u naqilbu minn deskrizzjonijiet ta 'livell għoli ta' ideat astratti għal dettalji ta 'implimentazzjoni ta' livell baxx.

Ikun aktar faċli jekk l-ispeċifikazzjoni ma tinkludi xejn deskrizzjoni dettaljata tal-implimentazzjoni. Informazzjoni dwar kif magna virtwali tirrappreżenta l-munzell tagħha hija aktar probabbli li tfixkel lill-iżviluppaturi li joħolqu kuntratti intelliġenti għall-pjattaforma TON milli tgħinhom.

Nix: tpoġġi l-proġett flimkien

F'Serokell aħna fans kbar NIX. Aħna niġbru l-proġetti tagħna magħha u niskjerawhom bl-użu NixOps, u installati fuq is-servers kollha tagħna Nix OS. Grazzi għal dan, il-bini kollu tagħna huwa riproduċibbli u jaħdem fuq kwalunkwe sistema operattiva li fuqha jista 'jiġi installat Nix.

Allura bdejna billi noħolqu Nix overlay b'espressjoni għall-assemblaġġ TON. Bl-għajnuna tagħha, il-kumpilazzjoni ta 'TON hija sempliċi kemm jista' jkun:

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

Innota li m'għandekx bżonn tinstalla xi dipendenzi. Nix se jagħmel kollox għalik b'mod maġiku, kemm jekk qed tuża NixOS, Ubuntu, jew macOS.

Ipprogrammar għal TON

Il-kodiċi tal-kuntratt intelliġenti fin-Netwerk TON jaħdem fuq il-Magni Virtwali TON (TVM). TVM huwa aktar kumpless mill-biċċa l-kbira tal-magni virtwali l-oħra, u għandu funzjonalità interessanti ħafna, pereżempju, jista’ jaħdem ma’ kontinwazzjonijiet и links għad-dejta.

Barra minn hekk, in-nies minn TON ħolqu tliet lingwi ġodda ta' programmar:

Ħamsa hija lingwa ta 'programmar universali li tixbaħ Ir-raba’. Il-ħila super tiegħu hija l-abbiltà li jinteraġixxi ma 'TVM.

FunC hija lingwa ta 'programmar ta' kuntratt intelliġenti li hija simili għal C u huwa miġbur f'lingwa oħra - Fift Assembler.

Il-Ħames Assembler — Ħames librerija għall-ġenerazzjoni ta’ kodiċi binarju eżekutibbli għal TVM. Il-Ħames Assembler m'għandux kompilatur. Dan Lingwa Speċifika tad-Dominju Inkorporat (eDSL).

Il-kompetizzjoni tagħna taħdem

Fl-aħħarnett, wasal iż-żmien li nħarsu lejn ir-riżultati tal-isforzi tagħna.

Kanal ta 'ħlas mhux sinkroniku

Il-kanal tal-ħlas huwa kuntratt intelliġenti li jippermetti li żewġ utenti jibagħtu ħlasijiet barra l-blockchain. Bħala riżultat, inti tiffranka mhux biss flus (m'hemm l-ebda kummissjoni), iżda wkoll ħin (m'għandekx għalfejn tistenna li l-blokk li jmiss jiġi pproċessat). Il-ħlasijiet jistgħu jkunu żgħar kemm mixtieq u kemm-il darba jkun meħtieġ. F'dan il-każ, il-partijiet m'għandhomx għalfejn jafdaw lil xulxin, peress li l-ġustizzja tas-saldu finali hija garantita mill-kuntratt intelliġenti.

Sibna soluzzjoni pjuttost sempliċi għall-problema. Żewġ partijiet jistgħu jiskambjaw messaġġi ffirmati, kull wieħed ikun fih żewġ numri—l-ammont sħiħ imħallas minn kull parti. Dawn iż-żewġ numri jaħdmu bħal arloġġ tal-vettur f'sistemi mqassma tradizzjonali u ssettja l-ordni "ġara qabel" fuq it-tranżazzjonijiet. Bl-użu ta' din id-dejta, il-kuntratt ikun jista' jsolvi kwalunkwe kunflitt possibbli.

Fil-fatt, numru wieħed huwa biżżejjed biex timplimenta din l-idea, iżda ħallejna t-tnejn għax b'dan il-mod nistgħu nagħmlu user interface aktar konvenjenti. Barra minn hekk, iddeċidejna li ninkludu l-ammont tal-ħlas f'kull messaġġ. Mingħajrha, jekk il-messaġġ jintilef għal xi raġuni, allura, għalkemm l-ammonti kollha u l-kalkolu finali jkunu korretti, l-utent jista 'ma jindunax it-telf.

Biex nittestjaw l-idea tagħna, fittixna eżempji ta 'użu ta' protokoll tal-kanal tal-ħlas sempliċi u konċiż. B'mod sorprendenti, sibna tnejn biss:

  1. Deskrizzjoni approċċ simili, biss għall-każ ta 'kanal unidirezzjonali.
  2. Tutorja, li tiddeskrivi l-istess idea bħal tagħna, iżda mingħajr ma tispjega ħafna dettalji importanti, bħall-korrettezza ġenerali u l-proċeduri tar-riżoluzzjoni tal-kunflitti.

Deher ċar li jagħmel sens li tiddeskrivi l-protokoll tagħna fid-dettall, filwaqt li tingħata attenzjoni speċjali għall-korrettezza tiegħu. Wara diversi iterazzjonijiet, l-ispeċifikazzjoni kienet lesta, u issa tista 'wkoll. ħares lejha.

Implimentajna l-kuntratt f'FunC, u ktibna l-utilità tal-linja tal-kmand għall-interazzjoni mal-kuntratt tagħna kompletament f'Fift, kif rakkomandat mill-organizzaturi. Stajna għażilna kwalunkwe lingwa oħra għas-CLI tagħna, iżda konna interessati li nippruvaw Fit biex naraw kif wettaq fil-prattika.

Biex inkun onest, wara li ħdimna ma 'Fift, ma rajna l-ebda raġuni konvinċenti biex nippreferu din il-lingwa għal lingwi popolari u użati b'mod attiv b'għodod u libreriji żviluppati. L-ipprogrammar f'lingwa bbażata fuq munzell hija pjuttost spjaċevoli, peress li trid iżżomm f'rasek kontinwament dak li hemm fuq il-munzell, u l-kompilatur ma jgħinx f'dan.

Għalhekk, fl-opinjoni tagħna, l-unika ġustifikazzjoni għall-eżistenza ta’ Fift hija r-rwol tagħha bħala lingwa ospitanti għal Fift Assembler. Imma ma jkunx aħjar li l-assembler ta' TVM jiġi mdaħħal f'xi lingwa eżistenti, aktar milli tivvinta waħda ġdida għal dan l-iskop essenzjalment uniku?

TVM Haskell eDSL

Issa wasal iż-żmien li nitkellmu dwar it-tieni kuntratt intelliġenti tagħna. Iddeċidejna li niżviluppaw kartiera b'ħafna firem, iżda l-kitba ta 'kuntratt intelliġenti ieħor f'FunC tkun wisq boring. Ridna nżidu ftit togħma, u dik kienet il-lingwaġġ tal-assemblaġġ tagħna stess għal TVM.

Bħal Fift Assembler, il-lingwa l-ġdida tagħna hija inkorporata, iżda għażilna lil Haskell bħala l-ospitant minflok Fift, li jippermettilna nieħdu vantaġġ sħiħ mis-sistema tat-tip avvanzat tagħha. Meta taħdem ma 'kuntratti intelliġenti, fejn l-ispiża ta' anki żball żgħir tista 'tkun għolja ħafna, it-tajpjar statiku, fl-opinjoni tagħna, huwa vantaġġ kbir.

Biex nuru kif jidher TVM assembler inkorporat f'Haskell, implimentajna kartiera standard fuqha. Hawn huma ftit affarijiet li għandek tagħti attenzjoni għalihom:

  • Dan il-kuntratt jikkonsisti f'funzjoni waħda, iżda tista' tuża kemm trid. Meta tiddefinixxi funzjoni ġdida fil-lingwa ospitanti (jiġifieri Haskell), l-eDSL tagħna jippermettilek tagħżel jekk tridx li ssir rutina separata f'TVM jew sempliċement inlined fil-punt tat-telefonata.
  • Bħal Haskell, il-funzjonijiet għandhom tipi li huma kkontrollati fil-ħin tal-kompilazzjoni. Fl-eDSL tagħna, it-tip ta 'input ta' funzjoni huwa t-tip ta 'munzell li l-funzjoni tistenna, u t-tip ta' riżultat huwa t-tip ta 'munzell li se jiġi prodott wara s-sejħa.
  • Il-kodiċi għandu annotazzjonijiet stacktype, li jiddeskrivi t-tip ta' munzell mistenni fil-punt tas-sejħa. Fil-kuntratt oriġinali tal-kartiera dawn kienu biss kummenti, iżda fl-eDSL tagħna huma fil-fatt parti mill-kodiċi u huma kkontrollati fil-ħin tal-kompilazzjoni. Jistgħu jservu bħala dokumentazzjoni jew dikjarazzjonijiet li jgħinu lill-iżviluppatur isib il-problema jekk il-kodiċi jinbidel u t-tip ta 'munzell jinbidel. Naturalment, annotazzjonijiet bħal dawn ma jaffettwawx il-prestazzjoni tar-runtime, peress li l-ebda kodiċi TVM ma jiġi ġġenerat għalihom.
  • Dan għadu prototip miktub f'ġimagħtejn, għalhekk għad fadal ħafna xogħol xi jsir fuq il-proġett. Pereżempju, l-istanzi kollha tal-klassijiet li tara fil-kodiċi hawn taħt għandhom jiġu ġġenerati awtomatikament.

Hekk tidher l-implimentazzjoni ta' kartiera multisig fuq l-eDSL tagħna:

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

Il-kodiċi tas-sors sħiħ tal-kuntratt tal-kartiera eDSL u b'ħafna firem tagħna jista' jinstab fuq dan ir-repożitorju. U iktar qal fid-dettall dwar il-lingwi integrati, il-kollega tagħna Georgy Agapov.

Konklużjonijiet dwar il-kompetizzjoni u TON

B'kollox, ix-xogħol tagħna ħa 380 siegħa (inkluża l-familjarizzazzjoni mad-dokumentazzjoni, il-laqgħat u l-iżvilupp attwali). Ħames żviluppaturi ħadu sehem fil-proġett tal-kompetizzjoni: CTO, team lead, speċjalisti tal-pjattaforma blockchain u żviluppaturi tas-softwer Haskell.

Sibna riżorsi biex nipparteċipaw fil-konkors mingħajr diffikultà, peress li l-ispirtu ta 'hackathon, ħidma f'tim mill-qrib, u l-ħtieġa li ngħaddu malajr f'aspetti ta' teknoloġiji ġodda huwa dejjem eċċitanti. Diversi iljieli bla rqad biex jinkisbu riżultati massimi f'kundizzjonijiet ta 'riżorsi limitati huma kkumpensati minn esperjenza imprezzabbli u memorji eċċellenti. Barra minn hekk, ix-xogħol fuq kompiti bħal dawn huwa dejjem test tajjeb tal-proċessi tal-kumpanija, peress li huwa estremament diffiċli li jinkisbu riżultati tassew deċenti mingħajr komunikazzjoni interna li taħdem tajjeb.

Lyrics aside: konna impressjonat bl-ammont ta 'xogħol imqiegħed fit-tim TON. Irnexxielhom jibnu sistema kumplessa, sabiħa, u l-aktar importanti, ta’ ħidma. TON wriet ruħha li hija pjattaforma b'potenzjal kbir. Madankollu, sabiex din l-ekosistema tiżviluppa, jeħtieġ li jsir ħafna aktar, kemm f’termini tal-użu tagħha fi proġetti blockchain kif ukoll f’termini ta’ titjib tal-għodod tal-iżvilupp. Aħna kburin li issa nkunu parti minn dan il-proċess.

Jekk wara li taqra dan l-artikolu għad għandek xi mistoqsijiet jew għandek ideat dwar kif tuża TON biex issolvi l-problemi tiegħek, ikteb lilna — se nkunu kuntenti li naqsmu l-esperjenza tagħna.

Sors: www.habr.com

Żid kumment