Suia le FunC i le FunCtional ma Haskell: Na faapefea ona manumalo Serokell i le Telegram Blockchain Competition

Masalo ua e faalogo i lena Telegram ua lata ona fa'alauiloa le Ton blockchain platform. Ae atonu na e misia le tala fou e leʻi leva Telegram faasilasila atu se tauvaga mo le faʻatinoina o se tasi pe sili atu konekarate atamai mo lenei faʻavae.

O le au a Serokell, ma le poto masani i le atinaʻeina o poloketi tetele poloka poloka, e le mafai ona tuʻu ese. Na matou faamatuu atu tagata faigaluega se toalima i le tauvaga, ma i le lua vaiaso mulimuli ane na latou maua ai le tulaga muamua i lalo o le (i) igoa tauvalaau tauagafau Sexy Chameleon. I lenei tusiga o le a ou talanoa e uiga i le auala na latou faia ai. Matou te faʻamoemoe o le isi sefulu minute e te faitau ai i se tala manaia, ma o le tele o le ae mauaina se mea aoga i totonu e mafai ona e faʻaaogaina i lau galuega.

Ae tatou amata i sina talaaga itiiti.

Tauvaga ma ona tulaga

O le mea lea, o galuega autu a le au auai o le faʻatinoina lea o se tasi pe sili atu o konekarate atamai fuafuaina, faʻapea foʻi ma le faia o talosaga e faʻaleleia ai le faʻaogaina o le TON. O le tauvaga na amata mai ia Setema 24 e oo atu ia Oketopa 15, ma na o le aso 15 o Novema na faalauiloa ai faaiuga. O se taimi umi lava, mafaufau i le taimi lea na mafai ai e Telegram ona taofi ma faʻasalalau iʻuga o tauvaga i luga o le mamanu ma le atinaʻeina o talosaga ile C ++ mo le suʻeina ma le iloiloga o le lelei o le VoIP telefoni i Telegram.

Na matou filifilia ni konekarate atamai se lua mai le lisi na faʻatulagaina e le faʻalapotopotoga. Mo se tasi oi latou, na matou faʻaogaina meafaigaluega na tufatufa atu i le TON, ma o le lona lua na faʻatinoina i se gagana fou na atiaʻe e a matou inisinia faʻapitoa mo TON ma fausia i Haskell.

Ole filifiliga ole gagana fa'apolokalame fa'atino e le'o fa'afuase'i. I la tatou blog kamupani E masani ona tatou talanoa e uiga i le mafuaʻaga tatou te manatu ai o le lavelave o gagana faʻatino o se faʻateleina tele ma pe aisea tatou te masani ai ona sili atu i latou i mea faʻapitoa. I le ala, o loʻo i ai foi uluai o lenei tusiga.

Aisea na matou filifili ai e auai?

I se faapuupuuga, ona o la matou faʻapitoa e le faʻapitoa ma lavelave galuega faatino e manaʻomia ai tomai faʻapitoa ma e masani ona aoga faʻasaienisi i le IT community. Matou te lagolagoina malosi le atinaʻeina o punaoa tatala ma o loʻo auai i lona faʻalauiloaina, ma galulue faʻatasi ma le taʻitaʻia o iunivesite a Rusia i le matata o le saienisi komepiuta ma le matematika.

O galuega manaia o le tauvaga ma le auai i la tatou galuega pele Telegram sa i ai ia i latou lava o se faaosofiaga sili ona lelei, ae o le faʻailoga tupe na avea ma faʻamalosiaga faaopoopo. 🙂

suʻesuʻega poloka poloka TON

Matou te vaʻavaʻai totoʻa atinaʻe fou i poloka poloka, atamai faʻapitoa ma aʻoaʻoga masini ma taumafai e aua neʻi misia se faʻasalalauga taua se tasi i vaega taʻitasi matou te galulue ai. O le mea lea, e oo atu i le taimi na amata ai le tauvaga, ua masani le matou 'au i manatu mai TON pepa paepae. Ae ui i lea, aʻo leʻi amataina le galuega ma le TON, matou te leʻi suʻesuʻeina faʻamaumauga faʻapitoa ma le faʻamatalaga moni o le faʻavae, o lea na manino ai le laasaga muamua - o se suʻesuʻega maeʻaeʻa o faʻamaumauga aloaia i luga. saite ma i totonu fale teu oloa.

E oo atu i le taimi na amata ai le tauvaga, ua uma ona lolomiina le code, ina ia sefe le taimi, na matou filifili e suʻe se taʻiala poʻo se aotelega na tusia e tagata fa'aoga. Ae paga lea, e leʻi maua ai ni faʻaiʻuga - e ese mai i faʻatonuga mo le faʻapipiʻiina o le faʻavae i luga o le Ubuntu, matou te leʻi mauaina nisi mea.

O faʻamaumauga lava ia na suʻesuʻeina lelei, ae sa faigata ona faitau i nisi o vaega. O le tele o taimi e tatau ai ona matou toe fo'i i nisi vaega ma sui mai fa'amatalaga maualuga o manatu fa'apitoa i fa'amatalaga fa'atino tulaga maualalo.

O le a sili atu ona faigofie pe afai e le aofia ai i le faʻamatalaga se faʻamatalaga auiliili o le faʻatinoga. O faʻamatalaga e uiga i le faʻatusaina e se masini komepiuta lona faʻapipiʻi e sili atu ona faʻalavelaveina le au atiaʻe e faia konekarate atamai mo le TON platform nai lo le fesoasoani ia i latou.

Nix: tu'u fa'atasi le poloketi

I Serokell o matou o tagata fiafia tele leai. Matou te aoina a matou poloketi faʻatasi ma faʻapipiʻi i latou e faʻaaoga NixOps, ma fa'apipi'i i luga oa matou 'au'aunaga uma Nix OS. Faʻafetai i lenei mea, o matou fale uma e toe faʻaleleia ma galue i soʻo se faiga faʻaogaina e mafai ona faʻapipiʻi ai Nix.

O lea na matou amata i le fatuina Nix fa'apipi'i ma fa'amatalaga mo le fa'apotopotoga TON. Faatasi ai ma lana fesoasoani, o le tuufaatasia o le TON e faigofie lava pe a mafai:

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

Manatua e te le manaʻomia le faʻapipiʻiina o soʻo se faʻalagolago. O le a faia fa'amaneta e Nix mea uma mo oe, pe oe fa'aaogaina NixOS, Ubuntu, po'o macOS.

Polokalama mo TON

O le tulafono faakonekarate atamai i le TON Network o loʻo faʻaogaina i luga o le TON Virtual Machine (TVM). O le TVM e sili atu le lavelave nai lo le tele o isi masini komepiuta, ma e sili ona manaia galuega, mo se faʻataʻitaʻiga, e mafai ona galue ma fa'aauau и so'oga i fa'amaumauga.

E le gata i lea, na faia e tama mai le TON ni gagana fou e tolu:

Lima ose gagana fa'apolokalame fa'aputuga lautele e fa'atusa Ova. O lona tomai sili o le mafai lea ona fegalegaleai ma le TVM.

FiafiaC ose gagana polokalame konekarate atamai e tutusa ma C ma ua tuufaatasia i se isi gagana - Fift Assembler.

Fa'apotopotoga Lona Lima — Lima faletusi mo le fa'atupuina o tulafono fa'atino e lua mo le TVM. O le Fifth Assembler e leai se faʻapipiʻi. Lenei Gagana Fa'apitoa Fa'atonu (eDSL).

E aoga a tatou tauvaga

Mulimuli ane, ua oo i le taimi e vaavaai ai i taunuuga oa tatou taumafaiga.

Auala totogi fa'aasynchronous

Totogi auala o se konekarate atamai lea e mafai ai e tagata faʻaoga e toʻalua ona lafo tupe i fafo atu o le poloka poloka. O se taunuuga, e te faʻasaoina e le gata o tupe (e leai se komisi), ae faʻapea foi le taimi (e te le tau faʻatali mo le isi poloka e faʻatautaia). Totogi e mafai ona laʻititi pe a manaʻomia ma i taimi uma e manaʻomia ai. I lenei tulaga, e le tatau ona faʻalagolago le tasi i le isi, talu ai o le saʻo o le faʻaiuga mulimuli e faʻamaonia e le konekarate atamai.

Na matou mauaina se fofo faigofie i le faafitauli. E mafai e itu e lua ona faafesuiai fe'au ua sainia, e tofu uma ma numera e lua—o le aofa'iga atoa e totogi e pati ta'itasi. O nei numera e lua e galue pei o uati vector i faiga fa'asoa fa'aleaganu'u ma fa'atulaga le fa'atonuga "na tupu muamua" i fefa'atauaiga. O le fa'aaogaina o nei fa'amaumauga, o le a mafai ai e le konekarate ona fo'ia so'o se fete'ena'iga e ono tula'i mai.

O le mea moni, e tasi le numera e lava e faʻatino ai lenei manatu, ae na matou tuʻua uma ona o le auala lea e mafai ai ona matou faia se faʻaoga sili atu ona faigofie. E le gata i lea, na matou filifili e faʻapipiʻi le aofaʻi o tupe totogi i feʻau taʻitasi. A aunoa ma lea, afai e leiloa le feʻau mo nisi mafuaʻaga, e ui lava o le aofaʻi uma ma le faʻatusatusaga mulimuli o le a saʻo, e le mafai e le tagata faʻaoga ona iloa le leiloa.

Ina ia faʻataʻitaʻi lo matou manatu, matou te suʻeina ni faʻataʻitaʻiga o le faʻaogaina o se faʻaoga faigofie ma le faʻapitoa o auala totogi. O le mea e ofo ai, na o le lua na matou mauaina:

  1. faʻamatalaga se faiga fa'apena, na'o le tulaga o se alale'a e tasi.
  2. A'oa'oga, o loʻo faʻamatalaina le manatu tutusa e pei o matou, ae aunoa ma le faʻamatalaina o le tele o faʻamatalaga taua, e pei o le saʻo lautele ma faiga faʻavae feteʻenaʻiga.

Na manino mai e talafeagai le faʻamatalaina auiliili o la matou faʻasalalauga, faʻapitoa i lona saʻo. A maeʻa le tele o faʻamatalaga, ua saunia le faʻamatalaga, ma o lea e mafai foi ona e faia. vaai ia te ia.

Na matou fa'atinoina le konekarate i FunC, ma sa matou tusia le fa'atonuga mo le fegalegaleai ma le matou konekarate atoa i le Fift, e pei ona fautuaina e le au fa'atonu. Semanu e mafai ona matou filifilia se isi gagana mo la matou CLI, ae sa matou fiafia e taumafai ia Fit e iloa ai pe na faapefea ona faatino i le faatinoga.

Ina ia faʻamaoni, ina ua maeʻa ona galulue ma le Lima, matou te leʻi vaʻaia ni mafuaaga faʻamalosi e sili atu ai lenei gagana i gagana taʻutaʻua ma faʻaaogaina ma mea faigaluega ma faletusi. O le fa'apolokalameina i se gagana fa'avae fa'aputuga e fai lava si le fiafia, talu ai e tatau ona e teu pea i lou ulu mea o lo'o i luga o le fa'aputuga, ma e le fesoasoani le tu'ufa'atasi i lenei mea.

O le mea lea, i lo matou manatu, na o le pau lava le faʻamaoniga mo le i ai o le Fift o lana matafaioi o se gagana talimalo mo le Fift Assembler. Ae e le sili atu ea le fa'aofiina o le TVM assembler i se gagana o lo'o iai, nai lo le fa'atupuina o se gagana fou mo lenei fa'amoemoe?

TVM Haskell eDSL

O le taimi nei e talanoa ai e uiga i la matou konekarate atamai lona lua. Na matou filifili e atiaʻe se atotupe e tele saini, ae o le tusiaina o se isi konekarate atamai i FunC o le a le manaia tele. Na matou manana'o e fa'aopoopo sina tofo, ma o la matou lava gagana fa'apotopotoga mo le TVM.

E pei o le Fift Assembler, o la tatou gagana fou ua faʻapipiʻiina, ae na matou filifilia Haskell e fai ma talimalo nai lo le Fift, faʻatagaina i matou e faʻaoga atoatoa i lona tulaga maualuga. Pe a galue ma konekarate atamai, lea o le tau e oʻo lava i sina mea sese e mafai ona maualuga tele, static typing, i lo matou manatu, o se avanoa tele.

Ina ia faʻaalia foliga o le TVM assembler o loʻo faʻapipiʻiina i Haskell, matou te faʻatinoina se atotupe masani i luga. O nai mea nei e fa'alogo i ai:

  • O lenei konekarate e aofia ai le tasi galuega, ae e mafai ona e faʻaogaina le tele e te manaʻo ai. A e faauigaina se galuega fou i le gagana talimalo (e pei o Haskell), o la matou eDSL e mafai ai ona e filifili pe e te manaʻo e avea ma se masani masani i le TVM pe faʻapipiʻi i le nofoaga o le telefoni.
  • E pei o Haskell, o galuega e iai ituaiga e siaki ile taimi fa'aopoopo. I la matou eDSL, o le ituaiga faʻapipiʻi o se galuega o le ituaiga o faaputuga o loʻo faʻamoemoeina e le galuega, ma o le iʻuga o le ituaiga o faaputuga o le a gaosia pe a uma le valaau.
  • O loʻo i ai faʻamatalaga i le code stacktype, fa'amatala le ituaiga fa'aputuga o lo'o fa'amoemoeina i le vala'au. I le ulua'i fa'akonekarate atotupe na'o ni fa'amatalaga, ae i totonu o la matou eDSL o latou moni lava o se vaega o le tulafono ma siaki i le taimi fa'aopoopo. E mafai ona avea o ni faʻamaumauga poʻo ni faʻamatalaga e fesoasoani i le atinaʻe e suʻe le faʻafitauli pe a suia le code ma suia le ituaiga faaputuga. Ioe, o ia fa'amatalaga e le a'afia ai le fa'atinoga o le ta'aloga talu ai e leai se code TVM e faia mo i latou.
  • O se fa'ata'ita'iga lava lea ua tusia i le lua vaiaso, o lea o lo'o tele pea galuega e tatau ona fa'atino i le galuega. Mo se faʻataʻitaʻiga, o faʻataʻitaʻiga uma o vasega o loʻo e vaʻaia i le faʻailoga o loʻo i lalo e tatau ona gaosia otometi.

O le mea lea e foliga mai o le faʻatinoina o se atotupe multisig i la matou 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

E mafai ona maua le fa'asinomaga atoa o le matou eDSL ma le tele-signature wallet contract i lenei faleoloa. Ma sili atu faamatala auiliili e uiga i gagana ua fausia, o le matou paaga o Georgy Agapov.

Fa'ai'uga e uiga i le tauvaga ma le TON

I le aotelega, o la matou galuega e 380 itula (e aofia ai le faamasani i faʻamaumauga, fonotaga ma atinaʻe moni). E toalima le au atinaʻe na auai i le tauvaga poloketi: CTO, taʻitaʻi o le au, tagata tomai faʻapitoa poloka poloka ma Haskell software developers.

Na matou mauaina ni punaoa e auai ai i le tauvaga e aunoa ma se faigata, talu ai o le agaga o le hackathon, vavalalata le galulue faatasi, ma le manaʻoga ia vave faʻatofuina i tatou lava i vaega o tekinolosi fou e fiafia i taimi uma. Le tele o po e leai se moe e ausia ai taunuuga aupito maualuga i tulaga o punaoa utiuti e tauia e le aoga taua ma manatuaga sili ona lelei. E le gata i lea, o le galue i ia galuega e masani lava o se suʻega lelei o faiga a le kamupani, talu ai e matua faigata lava ona ausia taunuʻuga lelei moni e aunoa ma se fesoʻotaʻiga lelei i totonu.

Fa'a'ese'ese upu: sa matou maofa i le tele o galuega na fa'atino e le 'au a le TON. Na mafai ona latou fausia se lavelave, matagofie, ma sili ona taua, faiga galue. TON ua faʻaalia o ia lava o se faʻavae e iai le gafatia tele. Ae ui i lea, ina ia mafai ona atiaʻe lenei siosiomaga faʻanatura, e tele mea e manaʻomia ona fai, e le gata i lona faʻaogaina i poloka poloka poloka ma i tulaga o le faʻaleleia atili o meafaigaluega. Matou te mitamita i le avea nei ma se vaega o lenei faagasologa.

Afai a uma ona faitau lenei tusiga o loʻo i ai pea ni au fesili pe iai ni manatu ile faʻaogaina o le TON e foia ai ou faʻafitauli, tusi mai ia i matou — o le a tatou fiafia e faasoa atu o tatou aafiaga.

puna: www.habr.com

Faaopoopo i ai se faamatalaga