Kusintha FunC kukhala FunCtional ndi Haskell: Momwe Serokell adapambana Mpikisano wa Telegraph Blockchain

Mwina munamvapo Telegalamu imeneyo yatsala pang'ono kukhazikitsa nsanja ya Ton blockchain. Koma mwina mudaphonya nkhani zomwe sizinali kale Telegalamu adalengeza mpikisano pakukhazikitsa mgwirizano umodzi kapena zingapo zanzeru papulatifomu.

Gulu la Serokell, lodziwa zambiri pakupanga ma projekiti akuluakulu a blockchain, silinathe kuyimilira. Tinapatsa antchito asanu ku mpikisanowo, ndipo masabata awiri pambuyo pake adatenga malo oyamba pansi pa (mu)dzina lodziwika bwino la Sexy Chameleon. M’nkhaniyi ndifotokoza mmene anachitira. Tikukhulupirira kuti mphindi khumi zikubwerazi mudzawerenga nkhani yosangalatsa, ndipo koposa zonse mupezamo kanthu kena kothandiza komwe mungagwiritse ntchito pantchito yanu.

Koma tiyeni tiyambe ndi nkhani yaing'ono.

Mpikisano ndi mikhalidwe yake

Chifukwa chake, ntchito yayikulu ya omwe adatenga nawo gawo inali kukhazikitsa imodzi kapena zingapo mwamapangano anzeru omwe akufunsidwa, komanso kupanga malingaliro opititsa patsogolo chilengedwe cha TON. Mpikisano udayamba pa Seputembara 24 mpaka Okutobala 15, ndipo zotsatira zake zidalengezedwa pa Novembara 15. Kwa nthawi yayitali, poganizira kuti panthawiyi Telegalamu idakwanitsa kugwira ndikulengeza zotsatira za mipikisano pakupanga ndi kukonza mapulogalamu mu C++ poyesa ndikuwunika ma foni a VoIP mu Telegraph.

Tinasankha makontrakitala awiri anzeru kuchokera pamndandanda womwe okonza amakonza. Kwa mmodzi wa iwo, tidagwiritsa ntchito zida zogawidwa ndi TON, ndipo yachiwiri idakhazikitsidwa muchilankhulo chatsopano chopangidwa ndi mainjiniya athu makamaka ku TON ndikumangidwira ku Haskell.

Kusankha chinenero chogwiritsira ntchito mapulogalamu sikunangochitika mwangozi. Mu wathu blog yamakampani Nthawi zambiri timalankhula za chifukwa chomwe timaganiza kuti zovuta za zilankhulo zogwira ntchito ndizokokomeza kwambiri komanso chifukwa chake timawakonda kusiyana ndi omwe amatsutsa. Mwa njira, ilinso choyambirira cha nkhaniyi.

Nanga n’cifukwa ciani tinaganiza zocita nawo?

Mwachidule, chifukwa ukadaulo wathu ndi ntchito zosakhazikika komanso zovuta zomwe zimafuna luso lapadera ndipo nthawi zambiri zimakhala zasayansi kwa gulu la IT. Timathandizira kwambiri chitukuko chotseguka ndipo tikuchita nawo kutchuka kwake, komanso timagwirizana ndi mayunivesite otsogola aku Russia pankhani ya sayansi yamakompyuta ndi masamu.

Ntchito zosangalatsa za mpikisano komanso kutenga nawo gawo mu polojekiti yathu yokondedwa ya Telegalamu mwazokha zinali zolimbikitsa kwambiri, koma thumba la mphotho lidakhala chilimbikitso chowonjezera. 🙂

TON blockchain kafukufuku

Timayang'anitsitsa zomwe zikuchitika mu blockchain, luntha lochita kupanga komanso kuphunzira pamakina ndikuyesera kuti tisaphonye kumasulidwa kumodzi m'gawo lililonse lomwe timagwira ntchito. Chifukwa chake, pomwe mpikisano udayamba, gulu lathu linali litadziwa kale malingaliro ochokera TON pepala loyera. Komabe, tisanayambe kugwira ntchito ndi TON, sitinafufuze zolemba zamakono ndi ndondomeko yeniyeni ya nsanja, kotero sitepe yoyamba inali yoonekeratu - kufufuza mozama za zolemba zovomerezeka pa. malo ndi nkhokwe za polojekiti.

Pamene mpikisano udayamba, code inali itasindikizidwa kale, kotero kuti tisunge nthawi, tinaganiza zoyang'ana chitsogozo kapena chidule cholembedwa ndi ndi ogwiritsa. Tsoka ilo, izi sizinapereke zotsatira - kupatula malangizo osonkhanitsa nsanja pa Ubuntu, sitinapeze zida zina.

Zolemba zokhazo zidafufuzidwa bwino, koma zinali zovuta kuziwerenga m'malo ena. Nthawi zambiri tinkayenera kubwereranso ku mfundo zina ndikusintha kuchoka pamafotokozedwe apamwamba amalingaliro ang'onoang'ono kupita kuzinthu zotsika kwambiri.

Zingakhale zosavuta ngati ndondomekoyi sinaphatikizepo tsatanetsatane wa kukhazikitsidwa konse. Zambiri zokhudzana ndi momwe makina owonera amayimira kuchuluka kwake zitha kusokoneza opanga ma contract anzeru papulatifomu ya TON kuposa kuwathandiza.

Nix: kukhazikitsa polojekiti pamodzi

Ku Serokell ndife mafani akulu nix. Timasonkhanitsa mapulojekiti athu nawo ndikuwagwiritsa ntchito NixOps, ndikuyika pa maseva athu onse Nix OS. Chifukwa cha izi, zomanga zathu zonse zimatha kubwerezedwanso ndipo zimagwira ntchito pamakina aliwonse omwe Nix angayikidwe.

Kenako tinayamba kupanga Kuphimba kwa Nix ndi mawu a msonkhano wa TON. Ndi chithandizo chake, kupanga TON ndikosavuta momwe mungathere:

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

Dziwani kuti simuyenera kukhazikitsa zodalira zilizonse. Nix ikuchitirani chilichonse mwamatsenga, kaya mukugwiritsa ntchito NixOS, Ubuntu, kapena macOS.

Kupanga kwa TON

Khodi yanzeru ya contract mu TON Network imayendera pa TON Virtual Machine (TVM). TVM ndi yovuta kwambiri kuposa makina ena ambiri, ndipo imakhala ndi ntchito zosangalatsa kwambiri, mwachitsanzo, imatha kugwira nawo ntchito kupitiriza и maulalo ku data.

Komanso, anyamata ochokera ku TON adapanga zilankhulo zitatu zatsopano:

Chasanu ndi chilankhulo chapadziko lonse lapansi chopanga mapulogalamu chomwe chimafanana Wa. Kuthekera kwake kwakukulu ndikutha kulumikizana ndi TVM.

FunC ndi anzeru mgwirizano mapulogalamu chinenero chofanana ndi C ndipo amapangidwa m'chinenero china - Fift Assembler.

Wachisanu Assembler - Laibulale yachisanu yopangira ma code a binary a TVM. Fifth Assembler alibe compiler. Izi Chilankhulo Chokhazikika cha Domain (eDSL).

Mpikisano wathu umagwira ntchito

Pomaliza, ndi nthawi yoti tiwone zotsatira za khama lathu.

Njira yolipirira yosasinthika

Njira yolipira ndi mgwirizano wanzeru womwe umalola ogwiritsa ntchito awiri kutumiza zolipira kunja kwa blockchain. Chotsatira chake, simukupulumutsa ndalama zokha (palibe ntchito), komanso nthawi (simuyenera kuyembekezera kuti chipika chotsatira chikonzedwe). Malipiro amatha kukhala ochepa monga momwe amafunira komanso pafupipafupi momwe angafunikire. Pankhaniyi, maphwando sayenera kukhulupirirana wina ndi mzake, popeza chilungamo cha kuthetsa komaliza kumatsimikiziridwa ndi mgwirizano wanzeru.

Tinapeza njira yosavuta yothetsera vutoli. Maphwando aŵiri atha kusinthanitsa mauthenga osainidwa, lirilonse liri ndi manambala aŵiri—ndalama zonse zoperekedwa ndi gulu lirilonse. Manambala awiriwa amagwira ntchito ngati wotchi ya vector m'machitidwe ogawidwa achikhalidwe ndikukhazikitsa dongosolo la "zidachitika kale" pazochita. Pogwiritsa ntchito deta iyi, mgwirizanowu udzatha kuthetsa mikangano iliyonse yomwe ingatheke.

M'malo mwake, nambala imodzi ndiyokwanira kukhazikitsa lingaliro ili, koma tidasiya zonse ziwiri chifukwa mwanjira iyi titha kupanga mawonekedwe osavuta ogwiritsa ntchito. Kuphatikiza apo, tinaganiza zophatikizira ndalama zolipirira mu uthenga uliwonse. Popanda izo, ngati uthengawo watayika pazifukwa zina, ndiye, ngakhale kuti ndalama zonse ndi kuwerengera komaliza zidzakhala zolondola, wogwiritsa ntchitoyo sangazindikire kutayika.

Kuti tiyese lingaliro lathu, tidayang'ana zitsanzo zogwiritsa ntchito njira yosavuta komanso yachidule yolipirira. Chodabwitsa, tapeza ziwiri zokha:

  1. mafotokozedwe njira yofananira, pokhapokha ngati njira ya unidirectional.
  2. Maphunziro, yomwe imalongosola lingaliro lomwelo ndi lathu, koma popanda kufotokoza zambiri zofunika, monga kulondola kwachizoloŵezi ndi njira zothetsera mikangano.

Zinadziwika kuti ndizomveka kufotokoza ndondomeko yathu mwatsatanetsatane, kumvetsera kwambiri kulondola kwake. Pambuyo kubwereza kangapo, ndondomekoyi inali yokonzeka, ndipo tsopano mukhoza. yang'anani pa iye.

Tidakhazikitsa mgwirizano mu FunC, ndipo tidalemba njira yolumikizirana ndi mgwirizano wathu kwathunthu mu Fift, monga momwe okonzera adalimbikitsa. Tikadasankha chilankhulo china chilichonse cha CLI yathu, koma tinali ndi chidwi choyesa Fit kuti tiwone momwe imagwirira ntchito.

Kunena zowona, titagwira ntchito ndi Fift, sitinawone zifukwa zomveka zokondera chilankhulochi kuposa zilankhulo zodziwika komanso zogwiritsidwa ntchito mwachangu ndi zida ndi malaibulale opangidwa. Kukonzekera m'chinenero chokhazikitsidwa ndi stack sikusangalatsa, chifukwa muyenera kusunga m'mutu mwanu zomwe zili pa stack, ndipo wolembayo sakuthandizani pa izi.

Chifukwa chake, m'malingaliro athu, kulungamitsidwa kokha kwa kukhalapo kwa Fift ndi gawo lake ngati chilankhulo cholandirira Fift Assembler. Koma sizingakhale bwino kuyika chophatikizira cha TVM m'zilankhulo zomwe zilipo kale, m'malo mopanga china chatsopano pazolinga izi zokha?

TVM Haskell eDSL

Tsopano ndi nthawi yoti tikambirane za mgwirizano wathu wachiwiri wanzeru. Tinaganiza zopanga chikwama cha siginecha zingapo, koma kulemba mgwirizano wina wanzeru mu FunC kungakhale kotopetsa kwambiri. Tinkafuna kuwonjezera kukoma, ndipo chimenecho chinali chilankhulo chathu chapa TVM.

Monga Fift Assembler, chilankhulo chathu chatsopano chimaphatikizidwa, koma tidasankha Haskell kukhala wolandila m'malo mwa Fift, kutilola kuti tigwiritse ntchito bwino makina ake apamwamba. Pogwira ntchito ndi makontrakitala anzeru, pomwe mtengo wa zolakwika zazing'ono ukhoza kukhala wokwera kwambiri, kuyimira static, m'malingaliro athu, ndi mwayi waukulu.

Kuti tiwonetse zomwe TVM assembler imawoneka ngati yophatikizidwa ku Haskell, tidayika chikwama chokhazikika pamenepo. Nazi zinthu zingapo zofunika kuziganizira:

  • Mgwirizanowu umakhala ndi ntchito imodzi, koma mutha kugwiritsa ntchito momwe mukufunira. Mukatanthauzira ntchito yatsopano m'chinenero cha alendo (ie Haskell), eDSL yathu imakulolani kuti musankhe ngati mukufuna kuti ikhale chizolowezi chosiyana mu TVM kapena kungoyimba pamzere poyimba.
  • Monga Haskell, ntchito zili ndi mitundu yomwe imawunikidwa panthawi yophatikiza. Mu eDSL yathu, mtundu wolowetsa wa ntchito ndi mtundu wa stack yomwe ntchitoyo ikuyembekezera, ndipo mtundu wotsatira ndi mtundu wa stack yomwe idzapangidwe pambuyo pa kuyitana.
  • Code ili ndi zofotokozera stacktype, kufotokoza mtundu wa stack womwe ukuyembekezeka pa malo oyimbira foni. Mu mgwirizano woyambirira wa chikwama awa anali ndemanga chabe, koma mu eDSL yathu kwenikweni ndi gawo la code ndipo amafufuzidwa panthawi yosonkhanitsa. Atha kukhala ngati zolemba kapena mawu omwe amathandiza wopanga mapulogalamu kuti apeze vuto ngati kachidindo ikasintha ndipo mtundu wa stack ukusintha. Zoonadi, zofotokozera zotere sizimakhudza nthawi yothamanga, chifukwa palibe TVM code yomwe imapangidwira.
  • Ichi chikadali chitsanzo cholembedwa m'milungu iwiri, kotero pali ntchito yambiri yoti ichitidwe pa ntchitoyi. Mwachitsanzo, magawo onse a makalasi omwe mukuwona mu code pansipa ayenera kupangidwa zokha.

Izi ndi zomwe kukhazikitsidwa kwa chikwama cha multisig kumawoneka pa eDSL yathu:

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

Khodi yathunthu ya eDSL yathu ndi mgwirizano wa chikwama chamitundu yambiri imapezeka pa chosungira ichi. Ndipo zambiri adanena mwatsatanetsatane za zilankhulo zomangidwa, mnzathu Georgy Agapov.

Zotsatira za mpikisano ndi TON

Pazonse, ntchito yathu inatenga maola a 380 (kuphatikizapo kudziŵa zolemba, misonkhano ndi chitukuko chenicheni). Madivelopa asanu adatenga nawo gawo pantchito yampikisano: CTO, mtsogoleri wamagulu, akatswiri papulatifomu ya blockchain ndi opanga mapulogalamu a Haskell.

Tinapeza zofunikira kuti titenge nawo mbali pampikisanowu popanda zovuta, chifukwa mzimu wa hackathon, mgwirizano wapamtima, komanso kufunikira kodzilowetsa muzinthu zamakono zatsopano zimakhala zosangalatsa nthawi zonse. Kusagona kochuluka usiku kuti tipeze zotsatira zabwino chifukwa chokhala ndi zinthu zochepa kumalipidwa ndi zochitika zamtengo wapatali ndi kukumbukira bwino. Kuphatikiza apo, kugwira ntchito zotere nthawi zonse kumakhala kuyesa kwabwino kwamakampani, chifukwa ndizovuta kwambiri kupeza zotsatira zabwino popanda kuyanjana kwamkati mkati.

Nyimbo pambali: tidachita chidwi ndi kuchuluka kwa ntchito yomwe gulu la TON lidachita. Iwo adatha kupanga zovuta, zokongola, komanso zofunika kwambiri, zogwirira ntchito. TON yatsimikizira kuti ndi nsanja yokhala ndi kuthekera kwakukulu. Komabe, kuti chilengedwechi chikule, pali zambiri zomwe ziyenera kuchitidwa, pogwiritsira ntchito ntchito za blockchain komanso kukonza zida zachitukuko. Ndife onyadira kuti tsopano tiri gawo la ndondomekoyi.

Ngati mutawerenga nkhaniyi mukadali ndi mafunso kapena muli ndi malingaliro amomwe mungagwiritsire ntchito TON kuthetsa mavuto anu, lembani kwa ife - tidzakhala okondwa kugawana zomwe takumana nazo.

Source: www.habr.com

Kuwonjezera ndemanga