Ho fetola FunC hore e be FunCtional le Haskell: Kamoo Serokell a hapileng Tlholisano ea Telegraph Blockchain

Mohlomong u utloile Telegram eo e haufi le ho qala sethala sa Ton blockchain. Empa u ka 'na ua hloloheloa litaba tse seng kae tse fetileng Telegram e phatlalalitse tlholisano bakeng sa ho kenya tshebetsong konteraka e le nngwe kapa tse ngata tse bohlale bakeng sa sethala sena.

Sehlopha sa Serokell, se nang le phihlelo e kholo ea ho hlahisa merero e meholo ea blockchain, se ne se sitoa ho ema ka thōko. Re ile ra abela basebetsi ba bahlano tlholisanong, 'me libeke tse peli hamorao ba ile ba nka sebaka sa pele ho eona tlasa lebitso la bosoasoi la (ka) Sexy Chameleon. Sehloohong sena ke tla bua ka hore na ba e entse joang. Re tšepa hore metsotsong e leshome e tlang bonyane u tla bala pale e thahasellisang, 'me haholo-holo u tla fumana ntho e molemo ho eona eo u ka e sebelisang mosebetsing oa hau.

Empa ha re qaleng ka moelelo o fokolang.

Tlholisano le maemo a eona

Kahoo, mesebetsi ea mantlha ea barupeluoa e ne e le ts'ebetsong ea likonteraka tse bohlale tse reriloeng, hammoho le ho etsa litlhahiso tsa ho ntlafatsa tikoloho ea TON. Tlholisano e ile ea qala ka la 24 Loetse ho fihlela la 15 Mphalane, 'me liphetho li phatlalalitsoe feela ka la 15 Pulungoana. Nako e telele haholo, ho nahanoa hore nakong ena Telegraph e khonne ho tšoara le ho phatlalatsa liphetho tsa litlholisano mabapi le moralo le nts'etsopele ea lits'ebetso ho C++ bakeng sa tlhahlobo le ho lekola boleng ba mehala ea VoIP ho Telegraph.

Re khethile likonteraka tse peli tse bohlale ho tsoa lethathamong le hlahisitsoeng ke bahlophisi. Bakeng sa e 'ngoe ea tsona, re sebelisitse lisebelisoa tse abuoang le TON,' me ea bobeli e ile ea kenngoa ts'ebetsong ka puo e ncha e entsoeng ke baenjiniere ba rona ka ho khetheha bakeng sa TON 'me e hahiloe Haskell.

Khetho ea puo e sebetsang ea lenaneo ha e etsahale ka phoso. Ka tsa rona blog ea khoebo Re atisa ho bua ka hore na ke hobane'ng ha re nahana hore ho rarahana ha lipuo tse sebetsang ke pheteletso e kholo le hore na ke hobane'ng ha ka kakaretso re li khetha ho e-na le tse hanyetsanang le tsona. Ka tsela, e boetse e na le ea mantlha ea sengoloa sena.

Ke hobane’ng ha re ile ra ba ra etsa qeto ea ho kopanela?

Ka bokhutšoanyane, hobane tsebo ea rona ke merero e sa tloaelehang le e rarahaneng e hlokang tsebo e khethehileng 'me hangata e na le bohlokoa ba saense ho sechaba sa IT. Re tšehetsa ka matla ntshetsopele e bulehileng-mohloding 'me ba kopanela ka popularization lona,' me hape sebelisana 'moho le isang diyunivesithi Serussia tšimong ea saense ea k'homphieutha le lipalo.

Mesebetsi e khahlisang ea tlholisano le ho kenya letsoho morerong oa rona o ratoang oa Telegraph e ne e le khothatso e ntle haholo, empa letlole la moputso le ile la fetoha khothatso e eketsehileng. 🙂

TON blockchain lipatlisiso

Re lekola ka hloko lintlafatso tse ncha ho blockchain, bohlale ba maiketsetso le thuto ea mochini mme re leka ho se fetoe tokollo e le 'ngoe ea bohlokoa sebakeng se seng le se seng seo re sebetsang ho sona. Ka hona, ha tlholisano e qala, sehlopha sa rona se ne se se se tloaelane le mehopolo e tsoang ho TON pampiri e tšoeu. Leha ho le joalo, pele re qala mosebetsi le TON, ha rea ​​ka ra sekaseka litokomane tsa tekheniki le khoutu ea mohloli oa sethala, kahoo mohato oa pele o ne o hlakile - thuto e phethahetseng ea litokomane tsa molao tse mabapi le sebaka le ho polokelo ea morero.

Nakong eo tlhōlisano e qalang, khoutu e ne e se e hatisitsoe, kahoo ho boloka nako, re ile ra etsa qeto ea ho batla tataiso kapa kakaretso e ngotsoeng ke basebelisi. Ka bomalimabe, sena ha sea ka sa fana ka liphetho - ntle le litaelo tsa ho bokella sethala ho Ubuntu, ha rea ​​ka ra fumana lisebelisoa tse ling.

Litokomane ka boeona li ne li batlisisitsoe hantle, empa ho ne ho le thata ho li bala libakeng tse ling. Hangata re ne re tlameha ho khutlela lintlheng tse itseng ebe re tloha ho litlhaloso tsa maemo a holimo tsa mehopolo e sa utloahaleng ho ea ho lintlha tse tlase tsa ts'ebetsong.

Ho ne ho tla ba bonolo haeba tlhaloso e sa kenyeletse tlhaloso e qaqileng ea ts'ebetsong ho hang. Tlhahisoleseding e mabapi le hore na mochine oa sebele o emela stack ea oona joang ho ka etsahala hore e sitise baetsi ba ho theha likonteraka tse bohlale bakeng sa sethala sa TON ho feta ho ba thusa.

Nix: ho kopanya morero

Serokell re barati ba kholo nix. Re bokella merero ea rona ka eona ebe re e sebelisa NixOps, mme e kentsoe ho li-server tsohle tsa rona Nix OS. Ka lebaka la sena, meaho eohle ea rona e ka hlahisoa hape 'me e sebetsa ho sistimi efe kapa efe ea ts'ebetso eo Nix e ka kengoang ho eona.

Kahoo re ile ra qala ka ho bopa Nix e koaheletsoeng ka polelo bakeng sa kopano ea TON. Ka thuso ea eona, ho bokella TON ho bonolo kamoo ho ka khonehang:

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

Hlokomela hore ha ho hlokahale hore u kenye li- dependencies leha e le life. Nix e tla u etsetsa ntho e 'ngoe le e' ngoe ka bohlanya, ekaba u sebelisa NixOS, Ubuntu, kapa macOS.

Lenaneo la TON

Khoutu e bohlale ea konteraka ho TON Network e sebetsa ho TON Virtual Machine (TVM). TVM e rarahane ho feta mechine e meng e mengata ea sebele, 'me e na le ts'ebetso e thahasellisang haholo, mohlala, e ka sebetsa le eona tsoelopele и lihokelo tsa data.

Ho feta moo, bashanyana ba TON ba thehile lipuo tse tharo tse ncha tsa lenaneo:

Ea bohlano ke ea bokahohleng stack mananeo a puo e tšoanang Taba. Bokhoni ba hae bo phahameng ke bokhoni ba ho sebelisana le TVM.

FunC ke puo e bohlale ea lenaneo la konteraka e tšoanang le C mme e hlophisitswe ka puo e nngwe - Fift Assembler.

Mokopanyi wa Bohlano - Laeborari ea bohlano bakeng sa ho hlahisa khoutu e sebetsang ea binary bakeng sa TVM. Fifth Assembler ha e na moqapi. Sena Puo e Kgethehileng ea Domain (eDSL).

Tlholisano ea rona ea sebetsa

Qetellong, ke nako ea ho sheba litholoana tsa boiteko ba rona.

Seteishene sa ho lefa sa Asynchronous

Seteishene sa tefo ke konteraka e bohlale e lumellang basebelisi ba babeli ho romella litefo ka ntle ho blockchain. Ka lebaka leo, ha u boloke chelete feela (ha ho na komisi), empa hape le nako (ha ho hlokahale hore u emele hore thibela e latelang e sebetsanoe). Litefiso li ka ba nyane joalo ka ha u lakatseha le hangata kamoo ho hlokahalang. Tabeng ena, lihlopha ha lia lokela ho tšepana, kaha toka ea ho qetela ea ho qetela e tiisitsoe ke konteraka e bohlale.

Re fumane tharollo e bonolo ea bothata. Mekha e ’meli e ka fapanyetsana melaetsa e saennoeng, e ’ngoe le e ’ngoe e na le linomoro tse peli—chelete e felletseng e lefuoang ke mokha ka mong. Linomoro tsena tse peli li sebetsa joalo ka oache ea vector ka mekhoa e tloaelehileng e ajoang le ho beha taelo ea "etsahetse pele" mabapi le litšebelisano. Ka ho sebelisa lintlha tsena, konteraka e tla khona ho rarolla likhohlano leha e le life tse ka bang teng.

Ebile, nomoro e le 'ngoe e lekane ho kenya ts'ebetsong mohopolo ona, empa re tlohetse ka bobeli hobane ka tsela ena re ka etsa sebopeho se bonolo sa mosebelisi. Ho feta moo, re ile ra etsa qeto ea ho kenyelletsa chelete ea tefo molaetsang ka mong. Ntle le eona, haeba molaetsa o lahlehile ka lebaka le itseng, joale, le hoja chelete eohle le palo ea ho qetela e tla nepahala, mosebedisi a ka 'na a se ke a hlokomela tahlehelo.

Ho leka mohopolo oa rona, re ile ra batla mehlala ea ho sebelisa protocol e bonolo le e khuts'oane ea litefo. Ho makatsang ke hore re fumane tse peli feela:

  1. tlhaloso mokhoa o ts'oanang, feela tabeng ea mocha o le mong.
  2. Thuto, e hlalosang maikutlo a tšoanang le a rona, empa ntle le ho hlalosa lintlha tse ngata tsa bohlokoa, tse kang ho nepahala ka kakaretso le mekhoa ea ho rarolla likhohlano.

Ho ile ha hlaka hore hoa utloahala ho hlalosa protocol ea rona ka botlalo, ho ela hloko ka ho khetheha ho nepahala ha eona. Ka mor'a ho pheta-pheta ka makhetlo a 'maloa, litlhaloso li ne li lokile,' me le uena u ka khona. mo shebelle.

Re sebelisitse konteraka ho FunC, 'me re ngotse taelo ea taelo ea ho sebelisana le konteraka ea rona ka ho feletseng ho Fift, joalokaha bahlophisi ba khothalelitsoe. Re ka be re khethile puo efe kapa efe e 'ngoe bakeng sa CLI ea rona, empa re ne re thahasella ho leka Fit ho bona hore na e sebetsa joang.

Ho bua 'nete, kamora ho sebetsa le Fift, ha rea ​​ka ra bona mabaka a tlamang a ho khetha puo ena ho feta lipuo tse tsebahalang le tse sebelisoang ka mafolofolo tse nang le lisebelisoa le lilaeborari tse ntlafalitsoeng. Ho hlophisa ka puo e thehiloeng ho stack ha ho monate, kaha u tlameha ho lula u boloka hlooho ea hau e le ka har'a stack, 'me moqapi ha a thuse ka sena.

Ka hona, ho ea ka maikutlo a rona, lebaka le le leng feela la ho ba teng ha Fift ke karolo ea eona e le puo e amohelang Fift Assembler. Empa na ho ne ho ke ke ha e-ba molemo ho kenya pokello ea TVM puong e seng e ntse e le teng, ho e-na le ho qapa e ncha bakeng sa morero ona o le mong?

TVM Haskell eDSL

Joale ke nako ea ho bua ka konteraka ea rona ea bobeli e bohlale. Re nkile qeto ea ho theha sepache sa mesaeno e mengata, empa ho ngola konteraka e 'ngoe e bohlale ho FunC ho tla tena haholo. Re ne re batla ho eketsa tatso, 'me eo e ne e le puo ea rona ea kopano bakeng sa TVM.

Joalo ka Fift Assembler, puo ea rona e ncha e kentsoe, empa re khethile Haskell joalo ka moamoheli sebakeng sa Fift, e re lumellang ho nka monyetla ka botlalo ba sistimi ea eona ea mofuta o tsoetseng pele. Ha u sebetsa ka likonteraka tse bohlale, moo litšenyehelo tsa esita le phoso e nyenyane e ka ba e phahameng haholo, ho thaepa ho tsitsitseng, ka maikutlo a rona, ke molemo o moholo.

Ho bontša seo TVM assembler e shebahalang eka e kentsoe Haskell, re kentse sepache se tloaelehileng ho eona. Mona ke lintho tse 'maloa tseo u lokelang ho li ela hloko:

  • Konteraka ena e na le ts'ebetso e le 'ngoe, empa u ka sebelisa tse ngata kamoo u ratang. Ha o hlalosa ts'ebetso e ncha ka puo ea moamoheli (ke hore, Haskell), eDSL ea rona e u lumella ho khetha hore na u batla hore e fetohe mokhoa o ikhethileng ho TVM kapa e kenngoe feela moo o letsetsoang teng.
  • Joalo ka Haskell, mesebetsi e na le mefuta e hlahlojoang ka nako ea ho bokella. Ho eDSL ea rona, mofuta oa ho kenya tšebetsong ke mofuta oa stack eo mosebetsi o e lebelletseng, 'me mofuta oa sephetho ke mofuta oa stack o tla hlahisoa kamora mohala.
  • Khoutu e na le litlhaloso stacktype, e hlalosang mofuta o lebelletsoeng oa stack sebakeng sa mohala. Konteraka ea pele ea sepache tsena e ne e le litlhaloso feela, empa ho eDSL ea rona ha e le hantle ke karolo ea khoutu 'me e hlahlojoa ka nako ea ho bokella. Li ka sebetsa e le litokomane kapa lipolelo tse thusang moqapi ho fumana bothata haeba khoutu e fetoha 'me mofuta oa stack o fetoha. Ehlile, litlhaloso tse joalo ha li ame ts'ebetso ea nako ea ho sebetsa, kaha ha ho na khoutu ea TVM e hlahisoang bakeng sa bona.
  • Ena e ntse e le mohlala o ngotsoeng ka libeke tse peli, kahoo ho sa ntse ho e-na le mosebetsi o mongata o lokelang ho etsoa morerong ona. Mohlala, maemo ohle a litlelase tseo u li bonang khoutung e ka tlase e lokela ho hlahisoa ka bo eona.

Sena ke seo ts'ebetsong ea sepache sa multisig se shebahalang ka sona ho eDSL ea rona:

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

Khoutu e felletseng ea mohloli oa eDSL ea rona le konteraka ea sepache e saenneng ka bongata e ka fumanoa ho polokelong ena. Le ho feta bolelloa ka botlalo mabapi le lipuo tse hahiloeng, mosebetsi-'moho le rona Georgy Agapov.

Liqeto mabapi le tlholisano le TON

Ka kakaretso, mosebetsi oa rona o ile oa nka lihora tsa 380 (ho kenyeletsoa ho tloaelana le litokomane, liboka le tsoelo-pele ea sebele). Bahlahisi ba bahlano ba kentse letsoho morerong oa tlholisano: CTO, moetapele oa sehlopha, litsebi tsa sethala sa blockchain le baetsi ba software ba Haskell.

Re fumane lisebelisoa tsa ho nka karolo tlholisanong ntle le bothata, kaha moea oa hackathon, tšebelisano e haufi, le tlhoko ea ho ikakhela ka setotsoana likarolong tsa mahlale a macha e lula e le monate. Masiu a 'maloa a ho se robale e le hore a fumane liphello tse ngata maemong a fokolang a lichelete a lefelloa ke phihlelo ea bohlokoa le mehopolo e babatsehang. Ntle le moo, ho sebetsa mesebetsing e joalo kamehla ke teko e ntle ea lits'ebetso tsa k'hamphani, kaha ho thata haholo ho fumana litholoana tse ntle ntle le tšebelisano e ntle ea kahare.

Mantsoe a thoko: re khahliloe ke mosebetsi o mongata o kentsoeng ke sehlopha sa TON. Ba ile ba khona ho haha ​​tsamaiso e rarahaneng, e ntle, 'me ea bohlokoa ka ho fetisisa, e sebetsang. TON e ipakile e le sethala se nang le bokhoni bo boholo. Leha ho le joalo, e le hore tikoloho ena e ntlafatse, ho na le ho hongata ho lokelang ho etsoa, ​​ka bobeli mabapi le tšebeliso ea merero ea blockchain le ho ntlafatsa lisebelisoa tsa ntlafatso. Re motlotlo ho ba karolo ea ts'ebetso ena.

Haeba ka mor'a ho bala sehlooho sena u ntse u e-na le lipotso kapa u na le maikutlo a ho sebelisa TON ho rarolla mathata a hau, re ngolle - re tla thabela ho arolelana phihlelo ea rona.

Source: www.habr.com

Eketsa ka tlhaloso