Kushandura FunC kuita FunCtional neHaskell: Serokell akakunda sei Teregiramu Blockchain Makwikwi.

Iwe wakambonzwa iyo Telegraph yave kuda kuvhura iyo Ton blockchain chikuva. Asi iwe unogona kunge wakapotsa nhau idzo nguva pfupi yadarika Telegraph akazivisa makwikwi kuitira kuitwa kweimwe kana anopfuura akangwara makondirakiti epuratifomu iyi.

Chikwata cheSerokell, chine ruzivo rwakakura mukugadzira mapurojekiti makuru e blockchain, haana kukwanisa kumira parutivi. Takapa vashandi vashanu kumakwikwi, uye mavhiki maviri gare gare vakatora nzvimbo yekutanga mairi pasi pe (mu)nemwero isina kujairika zita rekuti Sexy Chameleon. Munyaya ino ndichataura pamusoro pekuti vakazviita sei. Tinovimba kuti mumaminitsi gumi anotevera iwe uchaverenga nyaya inofadza, uye kunyanya iwe uchawana chimwe chinhu chinobatsira mairi chaunogona kushandisa mubasa rako.

Asi ngatitangei nechirevo chechinyorwa.

Makwikwi nemamiriro ayo

Saka, mabasa makuru evatori vechikamu aive kuitiswa kweimwe kana akawanda ezvibvumirano zvakangwara, pamwe nekuita zvirevo zvekuvandudza iyo TON ecosystem. Makwikwi aya akatanga kubva munaGunyana 24 kusvika Gumiguru 15, uye mhedzisiro yakaziviswa chete munaNovember 15. Nguva yakareba chaizvo, tichifunga kuti panguva ino Telegraph yakakwanisa kubata nekuzivisa mhedzisiro yemakwikwi padhizaini nekuvandudzwa kwezvikumbiro muC++ zvekuyedza uye kuongorora kunaka kweVoIP kufona muTeregiramu.

Takasarudza zvibvumirano zviviri zvakangwara kubva pane zvakarongwa nevarongi. Kune mumwe wavo, takashandisa zvishandiso zvakagoverwa neTON, uye yechipiri yakashandiswa mumutauro mutsva wakagadzirwa nevainjiniya vedu zvakananga kuTON uye yakavakwa muHaskell.

Sarudzo yemutauro wepurogiramu inoshanda haisi tsaona. Mune yedu corporate blog Isu tinowanzo kutaura nezve nei tichifunga kuti kuoma kwemitauro inoshanda kuwedzeredza kukuru uye nei isu tichiwanzoifarira kune inopokana. Nenzira, ine zvakare mavambo echinyorwa chino.

Nei takatosarudza kutora chikamu?

Muchidimbu, nekuti hunyanzvi hwedu hausi hwakajairwa uye mapurojekiti akaomarara anoda hunyanzvi uye anowanzo kukosha kwesainzi kunharaunda yeIT. Isu tinotsigira zvakasimba budiriro yakavhurika-sosi uye tiri kuita mukuzivikanwa kwayo, uye zvakare tinobatirana nemayunivhesiti anotungamira eRussia mumunda wesainzi yekombuta uye masvomhu.

Mabasa anonakidza emakwikwi uye kubatanidzwa muchirongwa chedu cheTeregiramu chaive chiri chakanakisa kukurudzira, asi homwe yemubairo yakava imwe yekurudziro. πŸ™‚

TON blockchain tsvakurudzo

Isu tinotarisisa zviitiko zvitsva mu blockchain, hungwaru hwekunyepedzera uye kudzidza muchina uye edza kusapotsa kuburitswa kumwechete kwakakosha mune imwe neimwe yenzvimbo dzatinoshanda. Naizvozvo, pakazotanga makwikwi, timu yedu yakanga yatoziva nemazano kubva TON chena bepa. Nekudaro, tisati tatanga basa neTON, isu hatina kuongorora zvinyorwa zvehunyanzvi uye iyo chaiyo kodhi kodhi yepuratifomu, saka danho rekutanga raive pachena - kunyatsoongorora zvinyorwa zvepamutemo pa. site and in project repositories.

Pakazosvika nguva yemakwikwi, kodhi yakanga yatoburitswa, saka kuchengetedza nguva, takasarudza kutsvaga gwara kana pfupiso yakanyorwa na. nevashandisi. Nehurombo, izvi hazvina kupa chero mhedzisiro - kunze kwemirairo yekuunganidza chikuva paUbuntu, isu hatina kuwana chero zvimwe zvinhu.

Zvinyorwa zvacho pachazvo zvakanyatsotsvakurudzwa, asi zvakanga zvakaoma kuverenga mune dzimwe nzvimbo. Kazhinji taifanira kudzoka kune mamwe mapoinzi tochinja kubva padanho repamusoro-soro tsananguro dzeabstract pfungwa kuenda kune yakaderera-chikamu chekuita ruzivo.

Zvingave zviri nyore kana iyo yakatarwa isina kubatanidza tsanangudzo yakazara yekuitwa zvachose. Ruzivo rwekuti muchina chaiwo unomiririra sei stack yawo unogona kukanganisa vanogadzira kugadzira makondirakiti akangwara epuratifomu yeTON pane kuvabatsira.

Nix: kuisa chirongwa pamwe chete

KuSerokell isu tiri mafani makuru nix. Isu tinounganidza mapurojekiti edu nawo uye toaendesa tichishandisa NixOps, uye yakaiswa pamaseva edu ese Nix OS. Nekuda kweizvi, zvese zvatinovaka zvinogoneka uye zvinoshanda pane chero sisitimu yekushandisa iyo Nix inogona kuiswa.

Saka takatanga nekugadzira Nix yakavharika nekutaura kweTON assembly. Nekubatsira kwayo, kugadzira TON kuri nyore sezvinobvira:

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

Ziva kuti haufanire kuisa chero zvinotsamira. Nix ichakuitira zvemashiripiti zvese, kunyangwe uri kushandisa NixOS, Ubuntu, kana macOS.

Kuronga kweTON

Iyo smart contract code muTON Network inomhanya paTON Virtual Machine (TVM). TVM yakanyanya kuomarara kupfuura mamwe akawanda machina emagetsi, uye ine inonakidza mashandiro, semuenzaniso, inogona kushanda nayo kuenderera mberi ΠΈ links kune data.

Uyezve, vakomana vanobva kuTON vakagadzira mitauro mitatu mitsva yekuronga:

Fift mutauro wepasirese stack programming unofanana Forth. Kugona kwake kukuru kugona kusangana neTVM.

FunC iri smart contract programming mutauro wakafanana ne C uye inounganidzwa mune mumwe mutauro - Fift Assembler.

Fifth Assembler -Fift raibhurari yekugadzira mabhinari anogoneka kodhi yeTVM. Fifth Assembler haina compiler. Izvi Embedded Domain Specific Language (eDSL).

Makwikwi edu anoshanda

Pakupedzisira, yave nguva yekutarisa miuyo yenhamburiko dzedu.

Asynchronous kubhadhara chiteshi

Kubhadhara chiteshi chibvumirano chakangwara chinobvumira vashandisi vaviri kutumira mubhadharo kunze kwe blockchain. Somugumisiro, hauchengetedze mari chete (hapana komisheni), asiwo nguva (haufaniri kumirira kuti chivharo chinotevera chigadziriswe). Kubhadhara kunogona kuve kudiki sezvaunoda uye kazhinji sezvinodiwa. Muchiitiko ichi, mapato haafaniri kuvimbana, sezvo kururamisira kwekugadzirisa kwekupedzisira kunovimbiswa nechibvumirano chakanaka.

Takawana mhinduro iri nyore kudambudziko. Mapato maviri anogona kuchinjana mameseji akasainwa, rimwe nerimwe riine nhamba mbiriβ€”mari yakazara inobhadharwa nebato rimwe nerimwe. Nhamba mbiri idzi dzinoshanda se vector wachi mumasisitimu echinyakare akagovaniswa uye kuseta iyo "yakaitika zvisati zvaitika" kurongeka pakutengeserana. Uchishandisa iyi data, kondirakiti ichakwanisa kugadzirisa chero kusawirirana kungabvira.

Muchokwadi, nhamba imwe inokwana kuita iyi pfungwa, asi isu takasiya zvese nekuti nenzira iyi taigona kuita iri nyore mushandisi interface. Pamusoro pezvo, takasarudza kuisa mari yekubhadhara mumeseji yega yega. Pasina iyo, kana meseji yakarasika nekuda kwechimwe chikonzero, saka, kunyangwe zviyero zvese uye kuverenga kwekupedzisira kuchave kwakarurama, mushandisi anogona kusaona kurasikirwa.

Kuedza zano redu, takatsvaga mienzaniso yekushandisa yakapusa uye yakapfupika yekubhadhara chiteshi protocol. Zvinoshamisa kuti takawana maviri chete:

  1. tsananguro nzira yakafanana, chete kune iyo unidirectional chiteshi.
  2. Tutorial, iyo inotsanangura pfungwa imwe chete neyedu, asi pasina kutsanangura zvakawanda zvakakosha, zvakadai sekururamisa kwese uye nzira dzekugadzirisa kusawirirana.

Zvakava pachena kuti zvine musoro kutsanangura protocol yedu zvakadzama, tichipa tarisiro yekururamisa kwayo. Mushure mekudzokorora kwakati wandei, iyo yakatarwa yaive yakagadzirira, uye ikozvino iwe unogona zvakare. mutarise.

Takaita kondirakiti muFunC, uye takanyora mutsara wekuraira utility yekudyidzana nekondirakiti yedu zvachose muFift, sezvakakurudzirwa nevarongi. Tingadai takasarudza chero mumwe mutauro weCLI yedu, asi isu taifarira kuyedza Fit kuti tione kuti yakaita sei mukudzidzira.

Kutaura chokwadi, mushure mekushanda naFift, hatina kuona zvikonzero zvinogombedzera zvekuda mutauro uyu kune mitauro yakakurumbira uye yakashandiswa zvine maturusi akagadzirwa nemaraibhurari. Kuronga mumutauro wakavakirwa-mutauro hakunakidze, nekuti iwe unofanirwa kugara uchichengeta mumusoro wako izvo zviri pastack, uye muunganidzi haabatsiri neizvi.

Naizvozvo, semaonero edu, chete chikonzero chekuvapo kweFift ibasa rayo semutauro wekutambira weFift Assembler. Asi hazvingave nani here kunyudza muunganidzi weTVM mune mumwe mutauro uripo, pane kugadzira mutsva weichi chinangwa chaicho?

TVM Haskell eDSL

Iye zvino yave nguva yekutaura nezve yedu yechipiri smart kontrakiti. Isu takasarudza kugadzira chikwama-masaini akawanda, asi kunyora imwe smart kontrakiti muFunC zvingave zvinofinha. Taida kuwedzera kumwe kunhuwirira, uye ndiwo waive mutauro wedu wegungano weTVM.

SaFift Assembler, mutauro wedu mutsva wakadzikwa, asi isu takasarudza Haskell semugadziri panzvimbo yeFift, achitibvumira kutora mukana wakazara weiyo yepamusoro mhando system. Paunenge uchishanda nezvibvumirano zvakangwara, uko mutengo wechero chikanganiso chidiki chinogona kunge chakanyanya kukwirira, static typing, mumaonero edu, mukana mukuru.

Kuratidza izvo TVM assembler inoita seyakamisikidzwa muHaskell, takaisa chikwama chakajairwa pairi. Hezvino zvinhu zvishoma zvekuteerera:

  • Chibvumirano ichi chine basa rimwechete, asi iwe unogona kushandisa akawanda sezvaunoda. Paunotsanangura basa idzva mumutauro wekugamuchira (kureva Haskell), yedu eDSL inokutendera iwe kuti usarudze kana iwe uchida kuti ive yakaparadzana muitiro muTVM kana kungoiswa mutsetse panguva yekufona.
  • SaHaskell, mabasa ane mhando dzinotariswa panguva yekuunganidza. Mu eDSL yedu, rudzi rwekupinza rwebasa imhando yestack iyo basa rinotarisira, uye mhando yemhedzisiro imhando yestack inozogadzirwa mushure mekufona.
  • Kodhi ine zvirevo stacktype, ichitsanangura rudzi rwe stack inotarisirwa panzvimbo yekufona. Muchibvumirano chewallet chepakutanga aya aingova mazwi, asi muDSL yedu iwo ari chikamu chekodhi uye anotariswa panguva yekuunganidza. Vanogona kushanda sezvinyorwa kana zvirevo zvinobatsira mugadziri kuwana dambudziko kana kodhi yachinja uye rudzi rwe stack ruchichinja. Ehe, zvirevo zvakadaro hazvikanganise mashandiro enguva, sezvo pasina kodhi yeTVM inogadzirwa kwavari.
  • Ichi chichiri chimiro chakanyorwa mumavhiki maviri, saka pachine basa rakawanda rinofanira kuitwa pachirongwa ichi. Semuenzaniso, ese makirasi emakirasi aunoona mukodhi pazasi anofanirwa kugadzirwa otomatiki.

Izvi ndizvo zvinoita kuitwa kwechikwama chemultisig chinotaridzika pane yedu 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

Iyo yakazara sosi kodhi yeDSL yedu uye akawanda-siginecha chikwama chibvumirano chinogona kuwanikwa pa iyi repository. Uye zvimwe akataurwa zvakadzama nezve mitauro yakavakirwa-mukati, mumwe wedu Georgy Agapov.

Mhedziso pamusoro pemakwikwi uye TON

Pakazara, basa redu rakatora maawa 380 (kusanganisira kujairana nezvinyorwa, misangano uye budiriro chaiyo). Vagadziri vashanu vakatora chikamu muchirongwa chemakwikwi: CTO, timu inotungamira, blockchain platform nyanzvi uye Haskell software vanogadzira.

Isu takawana zviwanikwa zvekutora chikamu mumakwikwi pasina kuomerwa, sezvo mweya wehackathon, kushandira pamwe kwepedyo, uye kukosha kwekukurumidza kunyura mukati mezvinhu zvetekinoroji nyowani kunogara kuchinakidza. Husiku hunoverengeka hwekusarara kuti uwane mibairo yakakura mumamiriro ezviwanikwa zvishoma zvinotsiviwa neruzivo rwakakosha uye ndangariro dzakanaka. Uye zvakare, kushanda pamabasa akadaro kunogara kuri muyedzo wakanaka wemaitirwo ekambani, nekuti zvakanyanya kuoma kuwana mhedzisiro yakanaka pasina kushanda zvakanaka kwemukati.

Lyrics parutivi: isu takafadzwa nehuwandu hwebasa rakaiswa nechikwata cheTON. Vakakwanisa kuvaka yakaoma, yakanaka, uye inonyanya kukosha, inoshanda sisitimu. TON yaratidza kuti ipuratifomu ine mukana mukuru. Nekudaro, kuti iyi ecosystem iite, zvakawanda zvinoda kuitwa, zvese maererano nekushandiswa kwayo mumapurojekiti eblockchain uye maererano nekuvandudza maturusi ebudiriro. Isu tinodada kuva chikamu chechirongwa ichi.

Kana mushure mekuverenga chinyorwa ichi uchine chero mibvunzo kana uine mazano ekushandisa TON kugadzirisa matambudziko ako, tinyorerei β€” tichafara kugovera ruzivo rwedu.

Source: www.habr.com

Voeg