Famadihana ny FunC ho FunCtional miaraka amin'i Haskell: Ahoana no nandresen'i Serokell ny Fifaninanana Blockchain Telegram

Efa naheno an'io Telegram io angamba ianao dia efa hanomboka ny sehatra Ton blockchain. Saingy mety ho tsy azonao ilay vaovao vao haingana Telegram nanambara fifaninanana amin'ny fampiharana fifanarahana marani-tsaina iray na maromaro ho an'ity sehatra ity.

Ny ekipa Serokell, manana traikefa be dia be amin'ny famolavolana tetikasa blockchain lehibe, dia tsy afaka nijanona. Nanendry mpiasa dimy izahay ho amin'ny fifaninanana, ary tapa-bolana taty aoriana dia nahazo ny laharana voalohany tamin'izany izy ireo teo ambanin'ny anaram-bositra kisendrasendra (amin'ny) Sexy Chameleon. Amin'ity lahatsoratra ity dia hiresaka momba ny fomba nanaovan'izy ireo izany aho. Manantena izahay fa ao anatin'ny folo minitra manaraka dia hamaky tantara mahaliana ianao farafaharatsiny, ary amin'ny ankapobeny dia hahita zavatra mahasoa ianao ao anatin'izany izay azonao ampiharina amin'ny asanao.

Fa andeha isika hanomboka amin'ny contexte kely.

Fifaninanana sy ny fepetra ao aminy

Noho izany, ny tena anjara asan'ny mpandray anjara dia ny fampiharana ny iray na maromaro amin'ireo fifanarahana marani-tsaina natolotra, ary koa ny fanaovana tolo-kevitra hanatsarana ny tontolo iainana TON. Nanomboka ny 24 septambra ka hatramin’ny 15 oktobra ny fifaninanana, ary ny 15 novambra vao fantatra ny vokatra azo. Ela be, raha jerena fa nandritra io fotoana io dia nahavita nitazona sy nanambara ny valin'ny fifaninanana momba ny famolavolana sy ny fampivoarana ny fampiharana amin'ny C ++ ny Telegram amin'ny fitiliana sy fanombanana ny kalitaon'ny antso VoIP ao amin'ny Telegram.

Nifantina fifanarahana hendry roa avy amin'ny lisitra natolotry ny mpikarakara izahay. Ho an'ny iray amin'izy ireo dia nampiasa fitaovana nozaraina tamin'ny TON izahay, ary ny faharoa dia nampiharina tamin'ny fiteny vaovao novolavolain'ireo injeniera manokana ho an'ny TON ary naorina tao amin'ny Haskell.

Tsy kisendrasendra ny fisafidianana ny fiteny fandaharana miasa. Ao aminay bilaogy orinasa Matetika isika no miresaka momba ny antony hiheverantsika fa ny fahasarotan'ny fiteny miasa dia manitatra be ary nahoana no aleontsika azy ireo amin'ny fiteny mitodika amin'ny zavatra. Raha ny marina dia misy ihany koa izany tany am-boalohany amin'ity lahatsoratra ity.

Nahoana isika no nanapa-kevitra ny handray anjara?

Raha fintinina, satria tetikasa tsy manara-penitra sy be pitsiny ny fanasokajianay izay mitaky fahaiza-manao manokana ary matetika misy lanjany ara-tsiansa ho an'ny vondrom-piarahamonina IT. Manohana mafy ny fampivoarana loharano misokatra izahay ary mirotsaka amin'ny fampalaza azy, ary miara-miasa amin'ireo anjerimanontolo Rosiana mpitarika eo amin'ny sehatry ny informatika sy matematika.

Ny asa mahaliana amin'ny fifaninanana sy ny fandraisana anjara amin'ny tetikasa Telegram malalantsika dia tena antony manosika tsara, fa ny tahirim-bola dia nanjary famporisihana fanampiny. 🙂

TON blockchain fikarohana

Manara-maso akaiky ny fivoarana vaovao amin'ny blockchain, ny faharanitan-tsaina artifisialy ary ny fianarana milina izahay ary miezaka ny tsy hanadino ny famoahana manan-danja iray isaky ny faritra iasanay. Noho izany, tamin'ny fotoana nanombohan'ny fifaninanana dia efa fantatry ny ekipantsika ny hevitra avy amin'ny TON taratasy fotsy. Na izany aza, alohan'ny hanombohan'ny asa miaraka amin'ny TON, dia tsy nanadihady ny antontan-taratasy ara-teknika sy ny tena loharano loharanon'ny sehatra izahay, noho izany dia niharihary ny dingana voalohany - fandinihana lalina ny antontan-taratasy ofisialy momba ny tranonkala ary ao repository tetikasa.

Tamin'ny fotoana nanombohan'ny fifaninanana dia efa nivoaka ny kaody, ka mba hitsitsiana fotoana dia nanapa-kevitra izahay fa hitady torolalana na famintinana nosoratan'i mpampiasa. Indrisy anefa fa tsy nisy valiny izany - ankoatry ny torolàlana momba ny fanangonana ny lampihazo amin'ny Ubuntu, dia tsy nahita fitaovana hafa izahay.

Ny antontan-taratasy mihitsy dia nodinihina tsara, saingy sarotra novakiana tany amin'ny faritra sasany. Matetika izahay no tsy maintsy niverina tany amin'ny teboka sasany ary nifindra avy amin'ny famaritana avo lenta momba ny hevitra saro-takarina mankany amin'ny antsipiriany momba ny fampiharana.

Ho mora kokoa raha tsy misy famaritana amin'ny antsipiriany momba ny fampiharana mihitsy ny famaritana. Ny fampahalalana momba ny fomba fanehoana ny milina virtoaly iray dia mety hanelingelina ny mpamorona mamorona fifanarahana marani-tsaina ho an'ny sehatra TON fa tsy manampy azy ireo.

Nix: mametraka ny tetikasa miaraka

Mpankafy be izahay ao Serokel nix. Manangona ny tetikasanay miaraka aminy izahay ary mampiasa azy ireo NixOps, ary napetraka amin'ny lohamilinay rehetra Nix OS. Noho izany, azo averina daholo ny fanangananay rehetra ary miasa amin'ny rafitra fiasa rehetra izay ahafahan'i Nix apetraka.

Dia nanomboka tamin'ny famoronana izahay Nix overlay misy fitenenana ho an'ny fivoriambe TON. Miaraka amin'ny fanampiany, ny fanangonana TON dia tsotra araka izay azo atao:

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

Mariho fa tsy mila mametraka fiankinan-doha ianao. Nix dia hanao ny zava-drehetra ho anao, na mampiasa NixOS, Ubuntu, na macOS ianao.

Fandaharana ho an'ny TON

Ny kaody fifanarahana hendry ao amin'ny TON Network dia mandeha amin'ny TON Virtual Machine (TVM). Ny TVM dia sarotra kokoa noho ny ankamaroan'ny milina virtoaly hafa, ary manana fiasa tena mahaliana, ohatra, afaka miasa miaraka fitohizana и rohy mankany amin'ny data.

Ankoatr'izay, namorona fiteny fandaharana telo vaovao ireo lehilahy avy ao TON:

Dimy dia fiteny fandaharana stack universal izay mitovitovy mivoaka. Ny fahaiza-manaony dia ny fahaizana mifandray amin'ny TVM.

FunC dia tenim-pandaharana fifanarahana marani-tsaina izay mitovy amin'ny C ary natambatra amin'ny fiteny hafa - Fift Assembler.

Assembler fahadimy — Fitehirizam-boky dimy ho an'ny famoronana kaody mimari-droa azo tanterahina ho an'ny TVM. Tsy manana compiler ny Fifth Assembler. izany Fiteny manokana amin'ny domaine (eDSL).

Mandeha ny fifaninanana ataontsika

Farany, fotoana hijerena ny vokatry ny ezaka ataontsika izao.

Fantsona fandoavam-bola asynchronous

Ny fantsona fandoavam-bola dia fifanarahana marani-tsaina izay ahafahan'ny mpampiasa roa mandefa fandoavam-bola ivelan'ny blockchain. Vokatr'izany dia tsy mitahiry vola fotsiny ianao (tsy misy komisiona), fa koa fotoana (tsy mila miandry ny fanodinana manaraka ianao). Ny fandoavam-bola dia mety ho kely araka izay irina ary matetika araka izay ilaina. Amin'ity tranga ity, ny antoko dia tsy voatery hifampatoky, satria ny fahamarinan'ny fifanarahana farany dia miantoka ny fifanarahana marani-tsaina.

Nahita vahaolana tsotra ho an'ny olana izahay. Afaka mifanakalo hafatra nosoniavina ny antoko roa, samy misy isa roa—ny vola feno naloan'ny antoko tsirairay. Ireo isa roa ireo dia miasa toy izany famantaranandro vector amin'ny rafitra nozaraina nentim-paharazana ary mametraka ny baiko "nitranga teo aloha" amin'ny fifampiraharahana. Amin'ny fampiasana an'io angona io, ny fifanarahana dia ho afaka hamaha izay mety ho fifandirana.

Raha ny marina, isa iray dia ampy hampiharana an'io hevitra io, saingy navelanay izy roa satria amin'izany fomba izany no ahafahantsika manamboatra interface tsara kokoa ho an'ny mpampiasa. Ankoatra izany, nanapa-kevitra ny hampiditra ny sandan'ny fandoavam-bola amin'ny hafatra tsirairay izahay. Raha tsy misy izany, raha very ny hafatra noho ny antony iray, dia mety tsy ho hitan'ny mpampiasa ny fatiantoka, na dia marina aza ny vola sy ny kajy farany.

Mba hitsapana ny hevitray dia nitady ohatra amin'ny fampiasana protocol fantsona fandoavana tsotra sy fohy toy izany izahay. Nahagaga fa roa ihany no hitanay:

  1. famaritana fomba fiasa mitovy amin'izany, ho an'ny fantsona tokana ihany.
  2. Tutorial, izay manoritsoritra hevitra mitovy amin'ny anay, nefa tsy manazava antsipiriany manan-danja maro, toy ny fanitsiana ankapobeny sy ny fomba famahana ny fifandirana.

Nanjary nazava fa mitombina ny mamaritra amin'ny antsipiriany ny protocole ataontsika, mandinika manokana ny fahamarinany. Taorian'ny famerimberenana maromaro, dia efa vonona ny famaritana, ary azonao atao koa izao. jereo izy.

Nametraka ny fifanarahana tao amin'ny FunC izahay, ary nanoratra ny fampitaovana andalana baiko mba hifaneraserana amin'ny fifanarahanay manontolo ao amin'ny Fift, araka ny soso-kevitry ny mpikarakara. Afaka nisafidy fiteny hafa ho an'ny CLI izahay, saingy liana izahay nanandrana ny Fit mba hahitana ny fahombiazany amin'ny fampiharana.

Raha ny marina, taorian'ny niara-niasa tamin'ny Fift, dia tsy nahita antony marim-pototra hisafidianana ity fiteny ity amin'ny fiteny malaza sy ampiasaina mavitrika miaraka amin'ny fitaovana sy tranomboky novolavolaina izahay. Ny fandaharana amin'ny fiteny mifototra amin'ny stack dia tsy mahafinaritra, satria tsy maintsy mitazona tsy tapaka ao an-dohanao izay ao anaty stack ianao, ary tsy manampy amin'izany ny compiler.

Noho izany, araka ny hevitray, ny hany fanamarinana ny fisian'ny Fift dia ny anjara asany amin'ny maha-teny fampiantranoana ny Fift Assembler. Fa tsy aleo ve ampidirina amin'ny fiteny efa misy ny assembler TVM, toy izay mamorona teny vaovao ho amin'izany tanjona izany?

TVM Haskell eDSL

Fotoana izao hiresahana momba ny fifanarahana marani-tsaina faharoa. Nanapa-kevitra ny hamolavola kitapo misy sonia maromaro izahay, fa ny fanoratana fifanarahana hendry hafa amin'ny FunC dia mankaleo loatra. Te-hanampy tsirony izahay, ary izany no fiteninay manokana ho an'ny TVM.

Tahaka ny Fift Assembler, ny fiteninay vaovao dia tafiditra, saingy nisafidy ny Haskell izahay ho mpampiantrano fa tsy ny Fift, ahafahantsika manararaotra tanteraka ny rafitra karazana mandroso. Rehefa miasa miaraka amin'ny fifanarahana marani-tsaina, izay mety ho avo be ny vidin'ny fahadisoana kely, ny fanoratana static, araka ny hevitray, dia tombony lehibe.

Mba hampisehoana ny endrik'ilay assembler TVM tafiditra ao amin'ny Haskell, dia nametraka kitapom-bola mahazatra izahay. Ireto misy zavatra vitsivitsy tokony hotandremana:

  • Ity fifanarahana ity dia misy fiasa iray, saingy azonao ampiasaina araka izay tianao. Rehefa mamaritra asa vaovao amin'ny fiteny mpampiantrano ianao (izany hoe Haskell), ny eDSL anay dia mamela anao hisafidy raha tianao ho lasa fahazarana mitokana ao amin'ny TVM izy io na ampidirina fotsiny amin'ny toerana fiantsoana.
  • Tahaka an'i Haskell, ny fiasa dia manana karazana voamarika amin'ny fotoana fanangonana. Ao amin'ny eDSL-ntsika, ny karazana fandraisan'anjaran'ny asa iray dia ny karazana stack izay andrasan'ny asa, ary ny karazana vokatra dia ny karazana stack izay hovokarina aorian'ny antso.
  • Misy fanamarihana ny code stacktype, mamaritra ny karazana stack andrasana amin'ny toerana fiantsoana. Ao amin'ny fifanarahana kitapom-bola tany am-boalohany dia fanehoan-kevitra fotsiny ireo, fa ao amin'ny eDSL anay dia ampahany amin'ny kaody izy ireo ary voamarina amin'ny fotoana fanangonana. Izy ireo dia azo ampiasaina ho antontan-taratasy na fanambarana izay manampy ny mpamorona hahita ny olana raha miova ny code ary miova ny karazana stack. Mazava ho azy fa tsy misy fiatraikany amin'ny fampandehanan-draharahan'ny fotoam-pivoriana ny fanamarihana toy izany, satria tsy misy kaody TVM natsangana ho azy ireo.
  • Mbola prototype nosoratana tao anatin'ny tapa-bolana izany, ka mbola betsaka ny asa tokony hatao amin'ny tetikasa. Ohatra, ny tranga rehetra amin'ny kilasy hitanao ao amin'ny kaody etsy ambany dia tokony ho tonga ho azy.

Toy izao ny fampiharana ny poketra multisig amin'ny 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

Ny kaody loharano feno amin'ny eDSL sy ny fifanarahana kitapom-bola misy sonia maro dia hita ao amin'ny ity repository ity. Ary maro hafa voalaza amin’ny antsipiriany momba ny fiteny voaorina, ilay mpiara-miasa aminay Georgy Agapov.

Fehiny momba ny fifaninanana sy ny TON

Amin'ny fitambarany, naharitra 380 ora ny asantsika (anisan'izany ny fahafantarana ny antontan-taratasy, ny fivoriana ary ny tena fampandrosoana). Mpandrindra dimy no nandray anjara tamin'ny tetikasa fifaninanana: CTO, mpitarika ny ekipa, manam-pahaizana momba ny sehatra blockchain ary mpamorona rindrambaiko Haskell.

Nahita loharano handraisana anjara amin'ny fifaninanana tsy misy fahasarotana izahay, satria mampientam-po foana ny toe-tsain'ny hackathon, ny fiaraha-miasa akaiky ary ny filàna haingana amin'ny lafiny teknolojia vaovao. Ny alina tsy misy torimaso mba hahazoana vokatra ambony indrindra amin'ny toe-javatra misy loharanon-karena voafetra dia omen'ny traikefa sarobidy sy fahatsiarovana tsara. Ankoatr'izay, ny fanaovana asa toy izany dia fitsapana tsara foana amin'ny fizotran'ny orinasa, satria sarotra be ny mahazo vokatra tena mendrika raha tsy misy fifandraisana anatiny miasa tsara.

Tononkira: nampiaiky volana anay ny habetsahan'ny asa nataon'ny ekipan'ny TON. Nahavita nanangana rafitra fiasana be pitsiny sy tsara tarehy ary indrindra izy ireo. Ny TON dia nanaporofo ny tenany ho sehatra manana hery lehibe. Na izany aza, mba hampandrosoana ity tontolo iainana ity dia betsaka kokoa ny zavatra tsy maintsy atao, na amin'ny fampiasana azy amin'ny tetikasa blockchain na amin'ny fanatsarana ny fitaovana fampandrosoana. Reharehantsika izao fa tafiditra amin'ity dingana ity.

Raha mbola manana fanontaniana ianao na manana hevitra momba ny fampiasana TON hamahana ny olanao rehefa avy namaky ity lahatsoratra ity ianao, manorata aminay — ho faly isika hizara ny traikefantsika.

Source: www.habr.com

Add a comment