Titan FunC sinu Iṣẹ-ṣiṣe pẹlu Haskell: Bawo ni Serokell ṣe bori Idije Blockchain Telegram

Boya o ti gbọ Telegram yẹn ti fẹrẹ ṣe ifilọlẹ Syeed Ton blockchain. Ṣugbọn o le ti padanu awọn iroyin ti ko gun seyin Telegram kede idije fun imuse ti ọkan tabi diẹ ẹ sii smati siwe fun yi Syeed.

Ẹgbẹ Serokell, pẹlu iriri nla ni idagbasoke awọn iṣẹ akanṣe blockchain nla, ko le duro ni apakan. A fi marun abáni si awọn idije, ati ọsẹ meji nigbamii ti won si mu akọkọ ibi ni o labẹ awọn (ni) iwonba ID apeso Sexy Chameleon. Ninu nkan yii Emi yoo sọrọ nipa bi wọn ṣe ṣe. A nireti pe ni iṣẹju mẹwa to nbọ iwọ yoo ni o kere ju ka itan ti o nifẹ, ati ni pupọ julọ iwọ yoo rii nkan ti o wulo ninu rẹ ti o le lo ninu iṣẹ rẹ.

Ṣugbọn jẹ ki a bẹrẹ pẹlu ọrọ-ọrọ kekere kan.

Idije ati awọn oniwe-ipo

Nitorinaa, awọn iṣẹ akọkọ ti awọn olukopa ni imuse ti ọkan tabi diẹ ẹ sii ti awọn adehun smart ti a dabaa, ati ṣiṣe awọn igbero lati mu ilọsiwaju ilolupo eda abemi TON. Idije naa waye lati Oṣu Kẹsan Ọjọ 24 si Oṣu Kẹwa Ọjọ 15, ati pe awọn abajade ti kede nikan ni Oṣu kọkanla ọjọ 15. Ni igba pipẹ, ni imọran pe lakoko yii Telegram ṣakoso lati mu ati kede awọn abajade ti awọn idije lori apẹrẹ ati idagbasoke awọn ohun elo ni C ++ fun idanwo ati iṣiro didara awọn ipe VoIP ni Telegram.

A yan awọn adehun ijafafa meji lati atokọ ti a dabaa nipasẹ awọn oluṣeto. Fun ọkan ninu wọn, a lo awọn irinṣẹ ti a pin pẹlu TON, ati pe ekeji ni imuse ni ede tuntun ti awọn onimọ-ẹrọ wa ṣe pataki fun TON ati ti a ṣe sinu Haskell.

Yiyan ede siseto iṣẹ kii ṣe lairotẹlẹ. Ninu wa bulọọgi ajọ Nigbagbogbo a sọrọ nipa idi ti a fi ro pe idiju ti awọn ede iṣẹ-ṣiṣe jẹ asọtẹlẹ nla ati idi ti a fi fẹran wọn ni gbogbogbo si awọn ti o da lori ohun. Nipa ọna, o tun ni ninu atilẹba ti yi article.

Kí nìdí tá a tilẹ̀ pinnu láti kópa?

Ni kukuru, nitori iyasọtọ wa kii ṣe boṣewa ati awọn iṣẹ akanṣe ti o nilo awọn ọgbọn pataki ati nigbagbogbo jẹ iye imọ-jinlẹ si agbegbe IT. A ṣe atilẹyin fun idagbasoke orisun-ìmọ ati pe o ṣiṣẹ ni olokiki rẹ, ati tun ṣe ifowosowopo pẹlu awọn ile-ẹkọ giga ti Ilu Rọsia ni aaye ti imọ-ẹrọ kọnputa ati mathimatiki.

Awọn iṣẹ ṣiṣe ti o nifẹ si ti idije ati ilowosi ninu iṣẹ akanṣe Telegram olufẹ wa ninu ara wọn ni iwuri ti o tayọ, ṣugbọn owo-ifunni ẹbun di iwuri afikun. 🙂

TON iwadi blockchain

A ṣe atẹle ni pẹkipẹki awọn idagbasoke tuntun ni blockchain, oye atọwọda ati ẹkọ ẹrọ ati gbiyanju lati ma padanu itusilẹ pataki kan ni ọkọọkan awọn agbegbe ti a ṣiṣẹ. Nitorinaa, nipasẹ akoko idije naa bẹrẹ, ẹgbẹ wa ti faramọ awọn imọran lati TON funfun iwe. Sibẹsibẹ, ṣaaju ki o to bẹrẹ iṣẹ pẹlu TON, a ko ṣe itupalẹ awọn iwe imọ-ẹrọ ati koodu orisun gangan ti pẹpẹ, nitorinaa igbesẹ akọkọ jẹ ohun ti o han gedegbe - iwadi ni kikun ti awọn iwe aṣẹ osise lori Aaye ati ni awọn ibi ipamọ ise agbese.

Ni akoko ti idije naa bẹrẹ, koodu naa ti tẹjade tẹlẹ, nitorinaa lati fi akoko pamọ, a pinnu lati wa itọsọna tabi akopọ ti a kọ nipasẹ nipasẹ awọn olumulo. Laanu, eyi ko fun awọn abajade eyikeyi - yato si awọn itọnisọna fun apejọ pẹpẹ lori Ubuntu, a ko rii awọn ohun elo miiran.

Awọn iwe tikararẹ ti ṣe iwadii daradara, ṣugbọn o nira lati ka ni awọn agbegbe kan. Ni ọpọlọpọ igba a ni lati pada si awọn aaye kan ki o yipada lati awọn apejuwe ipele giga ti awọn imọran áljẹbrà si awọn alaye imuse ipele kekere.

Yoo rọrun ti sipesifikesonu ko pẹlu apejuwe alaye ti imuse ni gbogbo. Alaye nipa bii ẹrọ foju ṣe ṣe aṣoju akopọ rẹ ni o ṣee ṣe diẹ sii lati fa idamu awọn olupilẹṣẹ ṣiṣẹda awọn adehun ijafafa fun pẹpẹ TON ju lati ṣe iranlọwọ fun wọn.

Nix: fifi ise agbese jọ

Ni Serokell a jẹ awọn onijakidijagan nla nix. A gba awọn iṣẹ akanṣe wa pẹlu rẹ ati mu wọn lo NixOps, ati fi sori ẹrọ lori gbogbo awọn olupin wa Nix OS. Ṣeun si eyi, gbogbo awọn ile wa jẹ atunṣe ati ṣiṣẹ lori eyikeyi ẹrọ ṣiṣe lori eyiti Nix le fi sii.

Nitorina a bẹrẹ nipasẹ ṣiṣẹda Nix agbekọja pẹlu ikosile fun apejọ TON. Pẹlu iranlọwọ rẹ, iṣakojọpọ TON jẹ rọrun bi o ti ṣee:

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

Ṣe akiyesi pe o ko nilo lati fi sori ẹrọ eyikeyi awọn igbẹkẹle. Nix yoo ṣe ohun gbogbo ti idan fun ọ, boya o nlo NixOS, Ubuntu, tabi macOS.

Siseto fun TON

Awọn koodu adehun smart ni TON Network nṣiṣẹ lori TON Virtual Machine (TVM). TVM jẹ eka sii ju pupọ julọ awọn ẹrọ foju miiran, ati pe o ni iṣẹ ṣiṣe ti o nifẹ pupọ, fun apẹẹrẹ, o le ṣiṣẹ pẹlu awọn ilọsiwaju и ìjápọ si data.

Pẹlupẹlu, awọn eniyan lati TON ṣẹda awọn ede siseto tuntun mẹta:

Karun jẹ ede siseto akopọ gbogbo agbaye ti o jọra Oju. Agbara Super rẹ ni agbara lati ṣe ajọṣepọ pẹlu TVM.

FunC ni a smati guide siseto ede ti o jẹ iru si C ati pe a ṣe akojọpọ si ede miiran - Fift Assembler.

Karun Apejọ - Ile-ikawe marun fun ti ipilẹṣẹ koodu ipaniyan alakomeji fun TVM. Karun Assembler ko ni alakojo. Eyi Èdè Iṣe-Iṣẹ Kan ti a fi sinu (eDSL).

Idije wa ṣiṣẹ

Nikẹhin, o to akoko lati wo awọn abajade ti akitiyan wa.

Asynchronous sisan ikanni

Ikanni sisanwo jẹ adehun ti o gbọn ti o fun laaye awọn olumulo meji lati firanṣẹ awọn sisanwo ni ita blockchain. Bi abajade, o fipamọ kii ṣe owo nikan (ko si igbimọ), ṣugbọn tun akoko (o ko ni lati duro fun bulọki atẹle lati ṣe ilana). Awọn sisanwo le jẹ kekere bi o ṣe fẹ ati nigbagbogbo bi o ṣe nilo. Ni idi eyi, awọn ẹgbẹ ko ni lati gbẹkẹle ara wọn, niwon aiṣedeede ti ipinnu ikẹhin jẹ iṣeduro nipasẹ adehun ọlọgbọn.

A ri kan iṣẹtọ o rọrun ojutu si isoro. Awọn ẹgbẹ meji le ṣe paṣipaarọ awọn ifiranṣẹ ti o fowo si, ọkọọkan ti o ni awọn nọmba meji ninu — iye kikun ti ẹgbẹ kọọkan san. Awọn nọmba meji wọnyi ṣiṣẹ bi aago fekito ni ibile pin awọn ọna šiše ati ṣeto awọn "ṣẹlẹ ṣaaju ki o to" ibere lori lẹkọ. Lilo data yii, adehun naa yoo ni anfani lati yanju eyikeyi rogbodiyan ti o ṣeeṣe.

Ni otitọ, nọmba kan to lati ṣe imuse imọran yii, ṣugbọn a fi awọn mejeeji silẹ nitori ni ọna yii a le ṣe wiwo olumulo irọrun diẹ sii. Ni afikun, a pinnu lati fi iye owo sisan sinu ifiranṣẹ kọọkan. Laisi rẹ, ti ifiranṣẹ ba ti sọnu fun idi kan, lẹhinna, biotilejepe gbogbo awọn oye ati iṣiro ipari yoo jẹ deede, olumulo le ma ṣe akiyesi pipadanu naa.

Lati ṣe idanwo ero wa, a wa fun awọn apẹẹrẹ ti lilo iru ilana ikanni isanwo ti o rọrun ati ṣoki. Iyalenu, a ri meji nikan:

  1. Apejuwe ọna ti o jọra, nikan fun ọran ti ikanni unidirectional.
  2. Ikẹkọ, eyi ti o ṣe apejuwe ero kanna gẹgẹbi tiwa, ṣugbọn laisi alaye ọpọlọpọ awọn alaye pataki, gẹgẹbi atunṣe gbogbogbo ati awọn ilana ipinnu ija.

O han gbangba pe o jẹ oye lati ṣe apejuwe ilana wa ni awọn alaye, san ifojusi pataki si titọ rẹ. Lẹhin ọpọlọpọ awọn iterations, sipesifikesonu ti ṣetan, ati bayi o le paapaa. wò ó.

A ṣe imuse adehun naa ni FunC, ati pe a kọ ohun elo laini aṣẹ fun ibaraenisọrọ pẹlu adehun wa patapata ni Fift, gẹgẹbi iṣeduro nipasẹ awọn oluṣeto. A le ti yan eyikeyi ede miiran fun CLI wa, ṣugbọn a nifẹ lati gbiyanju Fit lati rii bii o ṣe n ṣiṣẹ ni iṣe.

Lati so ooto, lẹhin ti o ba ṣiṣẹ pẹlu Fift, a ko rii eyikeyi awọn idi ti o lagbara lati fẹran ede yii si awọn ede olokiki ati awọn ede ti a lo pẹlu awọn irinṣẹ idagbasoke ati awọn ile-ikawe. Siseto ni ede ti o da lori akopọ jẹ ohun ti ko dun, nitori o ni lati tọju nigbagbogbo ni ori rẹ ohun ti o wa lori akopọ, ati pe akopọ ko ṣe iranlọwọ pẹlu eyi.

Nitorinaa, ninu ero wa, idalare nikan fun aye ti Fift ni ipa rẹ bi ede agbalejo fun Apejọ Fift. Ṣugbọn ṣe kii yoo dara lati fi apejo TVM sinu diẹ ninu awọn ede ti o wa tẹlẹ, dipo ki o ṣẹda tuntun kan fun idi pataki kanṣoṣo yii?

TVM Haskell eDSL

Bayi o to akoko lati sọrọ nipa adehun ọlọgbọn keji wa. A pinnu lati ṣe agbekalẹ apamọwọ ibuwọlu pupọ, ṣugbọn kikọ iwe adehun ọlọgbọn miiran ni FunC yoo jẹ alaidun pupọ. A fẹ lati ṣafikun adun diẹ, ati pe iyẹn ni ede apejọ tiwa fun TVM.

Gẹgẹbi Fift Assembler, ede tuntun wa ti wa ni ifibọ, ṣugbọn a yan Haskell gẹgẹbi agbalejo dipo Fift, ngbanilaaye lati ni anfani ni kikun ti eto iru ilọsiwaju rẹ. Nigbati o ba n ṣiṣẹ pẹlu awọn ifowo siwe ti o gbọn, nibiti iye owo paapaa aṣiṣe kekere le jẹ giga pupọ, titẹ aimi, ninu ero wa, jẹ anfani nla.

Lati ṣafihan kini apejọ TVM dabi ti a fi sinu Haskell, a ṣe imuse apamọwọ boṣewa kan lori rẹ. Eyi ni awọn nkan diẹ lati san ifojusi si:

  • Adehun yii ni iṣẹ kan, ṣugbọn o le lo ọpọlọpọ bi o ṣe fẹ. Nigbati o ba ṣalaye iṣẹ tuntun ni ede agbalejo (ie Haskell), eDSL wa gba ọ laaye lati yan boya o fẹ ki o di ilana adaṣe lọtọ ni TVM tabi ni ila nirọrun ni aaye ipe.
  • Bii Haskell, awọn iṣẹ ni awọn oriṣi ti a ṣayẹwo ni akoko akojọpọ. Ninu eDSL wa, iru iṣẹ titẹ sii jẹ iru akopọ ti iṣẹ n reti, ati iru abajade jẹ iru akopọ ti yoo ṣejade lẹhin ipe naa.
  • Koodu naa ni awọn asọye stacktype, ti n ṣe apejuwe iru akopọ ti a reti ni aaye ipe. Ninu iwe adehun apamọwọ atilẹba iwọnyi jẹ awọn asọye nikan, ṣugbọn ninu eDSL wa wọn jẹ apakan gangan ti koodu ati pe a ṣayẹwo ni akoko akopọ. Wọn le ṣiṣẹ bi iwe tabi awọn alaye ti o ṣe iranlọwọ fun idagbasoke idagbasoke iṣoro ti koodu ba yipada ati iru akopọ naa yipada. Nitoribẹẹ, iru awọn asọye ko ni ipa iṣẹ ṣiṣe asiko, nitori ko si koodu TVM ti ipilẹṣẹ fun wọn.
  • Eyi tun jẹ apẹrẹ ti a kọ ni ọsẹ meji, nitorinaa ọpọlọpọ iṣẹ tun wa lati ṣe lori iṣẹ akanṣe naa. Fun apẹẹrẹ, gbogbo awọn iṣẹlẹ ti awọn kilasi ti o rii ninu koodu ni isalẹ yẹ ki o ṣe ipilẹṣẹ laifọwọyi.

Eyi ni ohun ti imuse ti apamọwọ multisig kan dabi lori eDSL wa:

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

Koodu orisun ni kikun ti eDSL wa ati adehun apamọwọ ibuwọlu pupọ ni a le rii ni ibi ipamọ yii. Ati siwaju sii so fun ni apejuwe awọn nipa awọn ede ti a ṣe sinu, ẹlẹgbẹ wa Georgy Agapov.

Awọn ipari nipa idije ati TON

Ni apapọ, iṣẹ wa gba awọn wakati 380 (pẹlu ifaramọ pẹlu iwe, awọn ipade ati idagbasoke gidi). Awọn olupilẹṣẹ marun ṣe apakan ninu iṣẹ akanṣe idije: CTO, adari ẹgbẹ, awọn alamọja Syeed blockchain ati awọn olupilẹṣẹ sọfitiwia Haskell.

A rii awọn orisun lati kopa ninu idije laisi iṣoro, nitori ẹmi ti hackathon, iṣẹ-ṣiṣe ẹgbẹ ti o sunmọ, ati iwulo lati yara fi ara wa bọmi ni awọn aaye ti awọn imọ-ẹrọ tuntun jẹ igbadun nigbagbogbo. Ọpọlọpọ awọn alẹ ti ko ni oorun lati ṣaṣeyọri awọn abajade ti o pọju ni awọn ipo ti awọn orisun to lopin jẹ isanpada nipasẹ iriri ti ko niye ati awọn iranti to dara julọ. Ni afikun, ṣiṣẹ lori iru awọn iṣẹ-ṣiṣe nigbagbogbo jẹ idanwo ti o dara ti awọn ilana ile-iṣẹ, nitori o ṣoro pupọ lati ṣaṣeyọri awọn abajade to bojumu laisi ibaraenisepo inu ti o ṣiṣẹ daradara.

Awọn orin lẹgbẹẹ: a ni itara nipasẹ iye iṣẹ ti ẹgbẹ TON ṣe. Wọn ṣakoso lati kọ eka kan, lẹwa, ati pataki julọ, eto iṣẹ. TON ti fihan ararẹ lati jẹ pẹpẹ ti o ni agbara nla. Sibẹsibẹ, ni ibere fun ilolupo eda abemiran yii lati ṣe idagbasoke, ọpọlọpọ awọn nilo lati ṣe, mejeeji ni awọn ọna ti lilo rẹ ni awọn iṣẹ akanṣe blockchain ati ni awọn ọna ti imudarasi awọn irinṣẹ idagbasoke. A ni igberaga lati jẹ apakan ti ilana yii.

Ti lẹhin kika nkan yii o tun ni awọn ibeere eyikeyi tabi ni awọn imọran lori bi o ṣe le lo TON lati yanju awọn iṣoro rẹ, kọ si wa — inu wa yoo dun lati pin iriri wa.

orisun: www.habr.com

Fi ọrọìwòye kun