Ang paghimo sa FunC nga FunCtional kauban ang Haskell: Giunsa ni Serokell nga nakadaog sa Telegram Blockchain Competition

Tingali nakadungog ka niana nga Telegram hapit na ilunsad ang Ton blockchain platform. Apan tingali gimingaw ka sa balita nga dili pa dugay Telegram nagpahibalo sa usa ka kompetisyon alang sa pagpatuman sa usa o daghan pang mga smart nga kontrata alang niini nga plataporma.

Ang grupo sa Serokell, nga adunay daghang kasinatian sa pagpalambo sa dagkong mga proyekto sa blockchain, dili makapugong. Gidelegar namo ang lima ka mga empleyado sa kompetisyon, ug duha ka semana ang milabay nakuha nila ang unang dapit niini ubos sa (sa) kasarangan nga random nga angga nga Sexy Chameleon. Niini nga artikulo maghisgot ako kung giunsa nila kini gibuhat. Kami nanghinaut nga sa sunod nga napulo ka minuto makabasa ka labing menos usa ka makapaikag nga istorya, ug labing kadaghan makit-an nimo ang usa ka butang nga mapuslanon nga magamit nimo sa imong trabaho.

Apan magsugod kita sa gamay nga konteksto.

Kompetisyon ug mga kondisyon niini

Busa, ang mga nag-unang tahas sa mga partisipante mao ang pagpatuman sa usa o labaw pa sa gisugyot nga mga smart nga kontrata, ingon man ang paghimo og mga sugyot aron mapaayo ang TON ecosystem. Ang kompetisyon midagan gikan sa Septiyembre 24 ngadto sa Oktubre 15, ug ang mga resulta gipahibalo lamang sa Nobyembre 15. Sa dugay nga panahon, gikonsiderar nga niining panahona ang Telegram nakahimo sa paghupot ug pagpahibalo sa mga resulta sa mga sangka sa disenyo ug pagpalambo sa mga aplikasyon sa C ++ alang sa pagsulay ug pagsusi sa kalidad sa mga tawag sa VoIP sa Telegram.

Gipili namo ang duha ka smart nga kontrata gikan sa listahan nga gisugyot sa mga organizers. Alang sa usa niini, gigamit namo ang mga himan nga gipang-apod-apod sa TON, ug ang ikaduha gipatuman sa usa ka bag-ong pinulongan nga gihimo sa among mga inhenyero ilabi na alang sa TON ug gitukod sa Haskell.

Ang pagpili sa usa ka functional programming language dili aksidente. Sa among corporate blog Kanunay namon nga hisgutan kung ngano nga gihunahuna namon nga ang pagkakomplikado sa mga magamit nga mga sinultian usa ka dako nga pagpasobra ug kung ngano nga labi namon nga gipalabi sila sa mga object-oriented. Pinaagi sa dalan, kini usab naglangkob orihinal sa kini nga artikulo.

Nganong nakahukom pa man mi nga moapil?

Sa laktud nga pagkasulti, tungod kay ang among espesyalisasyon dili sukaranan ug komplikado nga mga proyekto nga nanginahanglan espesyal nga kahanas ug kanunay adunay bili sa siyensya sa komunidad sa IT. Kami kusganong nagsuporta sa open-source development ug nakigbahin sa pagpasikat niini, ug nakigtambayayong usab sa mga nanguna nga unibersidad sa Russia sa natad sa computer science ug matematika.

Ang makapaikag nga mga buluhaton sa kompetisyon ug pag-apil sa among minahal nga proyekto sa Telegram sa ilang kaugalingon usa ka maayo kaayo nga panukmod, apan ang pundo sa premyo nahimong dugang nga insentibo. πŸ™‚

TON blockchain panukiduki

Among gibantayan pag-ayo ang mga bag-ong kalamboan sa blockchain, artificial intelligence ug machine learning ug naningkamot nga dili masipyat ang usa ka mahinungdanong pagpagawas sa matag usa sa mga dapit diin kami nagtrabaho. Busa, sa pagsugod sa kompetisyon, ang among team pamilyar na sa mga ideya gikan sa TON puti nga papel. Bisan pa, sa wala pa magsugod ang pagtrabaho kauban ang TON, wala namon gisusi ang teknikal nga dokumentasyon ug ang tinuud nga gigikanan nga code sa plataporma, mao nga ang una nga lakang klaro kaayo - usa ka bug-os nga pagtuon sa opisyal nga dokumentasyon sa site ug sa mga repositoryo sa proyekto.

Sa panahon nga nagsugod ang kompetisyon, ang code napublikar na, mao nga aron makadaginot sa panahon, mihukom kami nga mangita og giya o summary nga gisulat ni tiggamit. Ikasubo, wala kini naghatag bisan unsang mga sangputanan - gawas sa mga panudlo alang sa pag-assemble sa plataporma sa Ubuntu, wala kami nakit-an nga bisan unsang ubang mga materyales.

Ang dokumentasyon mismo maayo nga gi-research, apan lisud basahon sa pipila ka mga lugar. Kasagaran kinahanglan namon nga mobalik sa pipila nga mga punto ug magbalhin gikan sa taas nga lebel nga paghubit sa abstract nga mga ideya ngadto sa ubos nga lebel nga mga detalye sa pagpatuman.

Mas sayon ​​kung ang detalye wala maglakip sa usa ka detalyado nga paghulagway sa pagpatuman sa tanan. Ang impormasyon bahin sa kon sa unsang paagi ang usa ka virtual nga makina nagrepresentar sa iyang stack mas lagmit nga makabalda sa mga developer nga nagmugna og mga smart nga kontrata alang sa TON nga plataporma kay sa pagtabang kanila.

Nix: paghiusa sa proyekto

Sa Serokel kami dako nga mga fans nix. Among gikolekta ang among mga proyekto uban kanila ug gi-deploy kini gamit NixOps, ug gi-install sa tanan namong mga server Nix OS. Salamat niini, ang tanan namon nga mga pagtukod mahimo’g mabag-o ug magamit sa bisan unsang operating system diin mahimong ma-install ang Nix.

Mao nga nagsugod kami pinaagi sa paghimo Nix overlay nga adunay ekspresyon alang sa TON assembly. Sa tabang niini, ang pag-compile sa TON kay yano ra kutob sa mahimo:

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

Timan-i nga dili nimo kinahanglan nga i-install ang bisan unsang dependencies. Ang Nix maghimo sa tanan alang kanimo, bisan kung naggamit ka sa NixOS, Ubuntu, o macOS.

Pagprograma alang sa TON

Ang smart contract code sa TON Network nagdagan sa TON Virtual Machine (TVM). Ang TVM mas komplikado kay sa kadaghanan sa ubang mga virtual machine, ug adunay makaiikag kaayo nga gamit, pananglitan, mahimo kini nga magamit mga pagpadayon ΠΈ mga link sa datos.

Dugang pa, ang mga lalaki gikan sa TON naghimo og tulo ka bag-ong programming language:

Singko usa ka universal stack programming language nga susama Pulo. Ang iyang super abilidad mao ang abilidad sa pagpakig-uban sa TVM.

KalingawanC usa ka smart contract programming language nga susama sa C ug gihugpong sa laing pinulongan - Fift Assembler.

Ikalima nga Assembler - Lima nga librarya alang sa paghimo og binary executable code alang sa TVM. Ang Fifth Assembler walay compiler. Kini Naka-embed nga Domain Specific Language (eDSL).

Ang among kompetisyon molihok

Sa kataposan, panahon na nga tan-awon ang resulta sa atong mga paningkamot.

Asynchronous nga channel sa pagbayad

Ang channel sa pagbayad usa ka intelihente nga kontrata nga nagtugot sa duha ka tiggamit nga magpadala mga bayad sa gawas sa blockchain. Ingon usa ka sangputanan, makatipig ka dili lamang salapi (wala’y komisyon), apan oras usab (dili ka kinahanglan maghulat nga maproseso ang sunod nga bloke). Ang mga pagbayad mahimong gamay ra kung gusto ug kanunay kung gikinahanglan. Sa kini nga kaso, ang mga partido dili kinahanglan nga mosalig sa usag usa, tungod kay ang kaangayan sa katapusan nga husay gigarantiyahan sa maayong kontrata.

Nakakita mi og medyo yano nga solusyon sa problema. Ang duha ka partido mahimong magbayloay og gipirmahan nga mga mensahe, ang matag usa adunay duha ka numeroβ€”ang tibuok kantidad nga gibayad sa matag partido. Kining duha ka numero nagtrabaho sama sa vector nga orasan sa tradisyonal nga gipang-apod-apod nga mga sistema ug itakda ang "nahitabo kaniadto" nga order sa mga transaksyon. Gamit kini nga datos, ang kontrata makahimo sa pagsulbad sa bisan unsang posibleng panagbangi.

Sa tinuud, igo na ang usa ka numero aron ipatuman kini nga ideya, apan gibiyaan namon ang duha tungod kay sa kini nga paagi makahimo kami usa ka labi ka dali nga interface sa gumagamit. Dugang pa, nakahukom kami nga ilakip ang kantidad sa pagbayad sa matag mensahe. Kung wala kini, kung ang mensahe nawala tungod sa usa ka hinungdan, nan, bisan kung ang tanan nga kantidad ug ang katapusan nga kalkulasyon husto, ang tiggamit mahimong dili makamatikod sa pagkawala.

Aron masulayan ang among ideya, nangita kami mga pananglitan sa paggamit sa yano ug mubo nga protocol sa channel sa pagbayad. Katingad-an, duha ra ang among nakit-an:

  1. paghulagway usa ka susama nga pamaagi, alang lamang sa kaso sa usa ka unidirectional channel.
  2. Tutorial.

Nahimong tin-aw nga makatarunganon nga ihulagway ang among protocol sa detalye, nga naghatag espesyal nga pagtagad sa pagkahusto niini. Pagkahuman sa daghang mga pag-uli, andam na ang espesipikasyon, ug karon mahimo nimo usab. tan-awa siya.

Among gipatuman ang kontrata sa FunC, ug among gisulat ang command line utility alang sa pagpakig-uban sa among kontrata sa hingpit sa Fift, sumala sa girekomenda sa mga organizers. Makapili unta mig laing pinulongan para sa among CLI, pero interesado mi nga sulayan ang Fit aron makita kung giunsa kini pagbuhat sa praktis.

Sa tinuud, pagkahuman sa pagtrabaho kauban ang Fift, wala kami nakit-an nga bisan unsang makapadani nga mga hinungdan aron gusto kini nga sinultian kaysa sa mga sikat ug aktibo nga gigamit nga mga sinultian nga adunay naugmad nga mga himan ug librarya. Ang pagprograma sa usa ka sinultian nga nakabase sa stack dili maayo, tungod kay kinahanglan nimo nga kanunay nga ibutang sa imong ulo kung unsa ang naa sa stack, ug ang compiler dili makatabang niini.

Busa, sa among opinyon, ang bugtong katarungan sa paglungtad sa Fift mao ang papel niini isip host language alang sa Fift Assembler. Apan dili ba mas maayo nga i-embed ang TVM assembler ngadto sa pipila ka kasamtangan nga pinulongan, imbes nga mag-imbento og bag-o alang niining bugtong katuyoan?

TVM Haskell eDSL

Karon na ang panahon sa paghisgot bahin sa among ikaduhang smart contract. Nakahukom kami sa paghimo og usa ka multi-signature nga pitaka, apan ang pagsulat sa laing smart nga kontrata sa FunC mahimong makalaay kaayo. Gusto namong idugang ang lami, ug kana ang among kaugalingong assembly language para sa TVM.

Sama sa Fift Assembler, ang among bag-ong lengguwahe na-embed, apan gipili namo ang Haskell isip host imbes nga Fift, nga nagtugot kanamo sa hingpit nga pagpahimulos sa advanced type system niini. Kung nagtrabaho uban ang mga smart nga kontrata, diin ang gasto sa bisan gamay nga sayup mahimong taas kaayo, ang static nga pag-type, sa among opinyon, usa ka dako nga bentaha.

Aron ipakita kung unsa ang hitsura sa TVM assembler nga na-embed sa Haskell, gipatuman namon ang usa ka standard nga pitaka niini. Ania ang pipila ka mga butang nga hatagan pagtagad:

  • Kini nga kontrata naglangkob sa usa ka function, apan mahimo nimong gamiton ang daghang gusto nimo. Kung imong gihubit ang usa ka bag-ong function sa host language (ie Haskell), ang among eDSL nagtugot kanimo sa pagpili kung gusto nimo kini mahimong lahi nga rutina sa TVM o yano nga naka-inline sa punto sa pagtawag.
  • Sama sa Haskell, ang mga gimbuhaton adunay mga tipo nga gisusi sa oras sa pag-compile. Sa among eDSL, ang tipo sa input sa usa ka function mao ang tipo sa stack nga gipaabut sa function, ug ang tipo sa resulta mao ang tipo sa stack nga himuon pagkahuman sa tawag.
  • Ang code adunay mga anotasyon stacktype, nga naghulagway sa gipaabot nga stack type sa call point. Sa orihinal nga kontrata sa pitaka kini mga komento lamang, apan sa among eDSL sila sa tinuud nga bahin sa code ug gisusi sa oras sa pag-compile. Mahimo silang magsilbi nga dokumentasyon o mga pahayag nga makatabang sa developer nga makit-an ang problema kung ang code mausab ug ang stack type mausab. Siyempre, ang maong mga anotasyon dili makaapekto sa runtime performance, tungod kay walay TVM code nga namugna alang kanila.
  • Kini usa pa ka prototype nga gisulat sa duha ka semana, mao nga daghan pa ang trabaho nga buhaton sa proyekto. Pananglitan, ang tanan nga mga higayon sa mga klase nga imong makita sa code sa ubos kinahanglan nga awtomatiko nga mabuhat.

Kini ang hitsura sa pagpatuman sa usa ka multisig nga pitaka sa among 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

Ang tibuok source code sa among eDSL ug multi-signature wallet nga kontrata makita sa kini nga tipiganan. Ug uban pa gisulti sa detalye mahitungod sa built-in nga mga pinulongan, ang among kauban nga si Georgy Agapov.

Mga konklusyon bahin sa kompetisyon ug TON

Sa kinatibuk-an, ang among trabaho mikuha ug 380 ka oras (lakip ang pamilyar sa dokumentasyon, mga miting ug aktuwal nga kalamboan). Lima ka mga developer ang miapil sa kompetisyon nga proyekto: CTO, team lead, blockchain platform specialists ug Haskell software developers.

Nakakita kami og mga kapanguhaan aron makaapil sa kompetisyon nga walay kalisud, tungod kay ang espiritu sa usa ka hackathon, suod nga pagtinabangay, ug ang panginahanglan nga dali nga isubsob ang among mga kaugalingon sa mga aspeto sa bag-ong mga teknolohiya kanunay nga kulbahinam. Daghang mga gabii nga wala’y tulog aron makab-ot ang labing kataas nga mga sangputanan sa mga kondisyon sa limitado nga mga kahinguhaan gibayran sa bililhon nga kasinatian ug maayo kaayo nga mga panumduman. Dugang pa, ang pagtrabaho sa ingon nga mga buluhaton kanunay nga usa ka maayo nga pagsulay sa mga proseso sa kompanya, tungod kay lisud kaayo ang pagkab-ot sa tinuud nga disente nga mga sangputanan nga wala’y maayo nga paglihok sa internal nga interaksyon.

Gawas sa mga liriko: nakadayeg kami sa gidaghanon sa trabaho nga gibutang sa TON team. Nakahimo sila og usa ka komplikado, matahum, ug labing hinungdanon, nagtrabaho nga sistema. Gipamatud-an sa TON ang iyang kaugalingon nga usa ka plataporma nga adunay daghang potensyal. Bisan pa, aron kini nga ekosistema molambo, daghan pa ang kinahanglan buhaton, sa mga termino sa paggamit niini sa mga proyekto sa blockchain ug sa mga termino sa pagpaayo sa mga himan sa pag-uswag. Mapasigarbuhon kami nga karon nahimong bahin niini nga proseso.

Kung pagkahuman sa pagbasa niini nga artikulo aduna ka pa'y mga pangutana o adunay mga ideya kung giunsa paggamit ang TON aron masulbad ang imong mga problema, pagsulat kanamo β€” malipay mi sa pagpaambit sa among kasinatian.

Source: www.habr.com

Idugang sa usa ka comment