Ukuguqula i-FunC ibe i-FunCtional ne-Haskell: I-Serokell iwuwine kanjani umncintiswano we-Telegram Blockchain

Cishe uzwile ukuthi iTelegram isizokwethula inkundla ye-Ton blockchain. Kodwa kungenzeka ukuthi uphuthelwe yizindaba kungekudala iTelegram umemezele umncintiswano ukuze kusetshenziswe inkontileka eyodwa noma ngaphezulu ehlakaniphile yale nkundla.

Ithimba leSerokell, elinolwazi olunzulu lokuthuthukisa amaphrojekthi amakhulu we-blockchain, alikwazanga ukuma eceleni. Sithumele abasebenzi abahlanu emqhudelwaneni, kwathi emasontweni amabili kamuva bathatha indawo yokuqala kuwo ngaphansi kwesiteketiso (se) esingahleliwe esingahleliwe se-Sexy Chameleon. Kulesi sihloko ngizokhuluma ngokuthi bakwenze kanjani. Sithemba ukuthi emizuzwini eyishumi ezayo okungenani uzofunda indaba ethokozisayo, futhi okungenani uzothola okuthile okuwusizo kuyo ongakusebenzisa emsebenzini wakho.

Kodwa ake siqale ngomongo omncane.

Ukuncintisana nemibandela yawo

Ngakho-ke, imisebenzi eyinhloko yabahlanganyeli kwakuwukuqaliswa kwenkontileka eyodwa noma ngaphezulu yenkontileka ehlakaniphile ehlongozwayo, kanye nokwenza iziphakamiso zokuthuthukisa i-TON ecosystem. Umncintiswano waqala kusukela ngoSepthemba 24 kuya ku-Okthoba 15, futhi imiphumela imenyezelwe ngoNovemba 15 kuphela. Isikhathi eside impela, uma kucatshangelwa ukuthi ngalesi sikhathi iTelegram yakwazi ukubamba futhi yamemezela imiphumela yemincintiswano ekwakhiweni nasekuthuthukisweni kwezinhlelo zokusebenza ku-C++ zokuhlola nokuhlola ikhwalithi yezingcingo ze-VoIP kuTelegramu.

Sikhethe izinkontileka ezimbili ezihlakaniphile ohlwini oluhlongozwe abahleli. Komunye wabo, sasebenzisa amathuluzi asakazwa nge-TON, kanti eyesibili yasetshenziswa ngolimi olusha olwakhiwe onjiniyela bethu ngokukhethekile i-TON futhi bakhelwa ku-Haskell.

Ukukhethwa kolimi lokuhlela olusebenzayo akukona ngephutha. Kwethu ibhulogi yebhizinisi Sivame ukukhuluma ngokuthi kungani sicabanga ukuthi inkimbinkimbi yezilimi ezisebenzayo iyihaba elikhulu nokuthi kungani ngokuvamile sikhetha zona kunezigxile ekuphikisaneni nazo. Ngendlela, nayo iqukethe okwangempela kwalesi sihloko.

Kungani size sinqume ukuhlanganyela?

Ngamafuphi, ngoba ubuchwepheshe bethu bungamaphrojekthi angajwayelekile futhi ayinkimbinkimbi adinga amakhono akhethekile futhi avame ukubaluleka kwesayensi emphakathini we-IT. Sisekela ngokuqinile ukuthuthukiswa komthombo ovulekile futhi sihileleke ekudumeni kwayo, futhi sibambisana namanyuvesi ahamba phambili aseRussia emkhakheni wesayensi yekhompyutha nezibalo.

Imisebenzi ethokozisayo yomncintiswano nokubamba iqhaza kuphrojekthi yethu esiyithandayo yeTelegramu ngokwayo bekuyisisusa esihle kakhulu, kepha isikhwama semiklomelo saba isikhuthazo esengeziwe. πŸ™‚

Ucwaningo lwe-TON blockchain

Siqapha ngokucophelela intuthuko entsha ku-blockchain, ubuhlakani bokwenziwa nokufunda komshini futhi sizame ukungaphuthelwa ukukhishwa okukodwa okubalulekile endaweni ngayinye esisebenza kuyo. Ngakho-ke, ngesikhathi kuqala umncintiswano, ithimba lethu lase lijwayele imibono evela Iphepha elimhlophe le-TON. Kodwa-ke, ngaphambi kokuqala ukusebenza ne-TON, asizange sihlaziye imibhalo yezobuchwepheshe kanye nekhodi yangempela yomthombo yesikhulumi, ngakho-ke isinyathelo sokuqala sasisobala - ukucwaninga okuphelele kwemibhalo esemthethweni isayithi futhi ku amaqoqo amaphrojekthi.

Ngesikhathi umncintiswano uqala, ikhodi yayisivele ishicilelwe, ngakho-ke ukuze songe isikhathi, sinqume ukufuna umhlahlandlela noma isifinyezo esibhalwe ngu. ngabasebenzisi. Ngeshwa, lokhu akuzange kunikeze noma yimiphi imiphumela - ngaphandle kwemiyalelo yokuhlanganisa inkundla ku-Ubuntu, asitholanga ezinye izinto.

Amadokhumenti ngokwawo ayecwaningwe kahle, kodwa kwakunzima ukufundeka kwezinye izindawo. Ngokuvamile kwakudingeka sibuyele emaphuzwini athile futhi sishintshe sisuke ezincazelweni eziphezulu zemibono engaqondakali siye emininingwaneni yokusetshenziswa kwezinga eliphansi.

Kungaba lula uma ukucaciswa kungafaki incazelo enemininingwane yokuqaliswa nhlobo. Ulwazi olumayelana nendlela umshini we-virtual osimelela ngayo isitaki sawo kungenzeka kakhulu luphazamise onjiniyela abakha izinkontileka ezihlakaniphile zenkundla ye-TON kunokubasiza.

Nix: ukuhlanganisa iphrojekthi

KwaSerokell singabalandeli abakhulu I-Nix. Siqoqa amaphrojekthi ethu ngayo futhi siwahambise sisebenzisa I-NixOps, futhi ifakwe kuwo wonke amaseva ethu I-NixOS. Ngenxa yalokhu, zonke izakhiwo zethu ziyakwazi ukukhiqizwa futhi zisebenza kunoma iyiphi isistimu yokusebenza lapho i-Nix ingafakwa khona.

Ngakho saqala ngokudala Imbondela ye-Nix enomusho wokuhlanganisa i-TON. Ngosizo lwayo, ukuhlanganisa i-TON kulula ngangokunokwenzeka:

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

Qaphela ukuthi awudingi ukufaka noma yikuphi ukuncika. I-Nix izokwenzela yonke into ngomlingo, noma ngabe usebenzisa i-NixOS, Ubuntu, noma i-macOS.

Ukuhlelela i-TON

Ikhodi yenkontileka ehlakaniphile ku-TON Network isebenza ku-TON Virtual Machine (TVM). I-TVM iyinkimbinkimbi kakhulu kuneminye imishini eminingi ebonakalayo, futhi inomsebenzi othakazelisayo kakhulu, isibonelo, ingasebenza nayo ukuqhubeka ΠΈ izixhumanisi zedatha.

Ngaphezu kwalokho, abafana abavela ku-TON badale izilimi ezintathu zokuhlela ezintsha:

Ezinhlanu iwulimi lokuhlela isitaki oluvamile olufana Okokugcina. Amandla akhe amakhulu yikhono lokuxhumana ne-TVM.

I-FunC iwulimi lohlelo lwenkontileka oluhlakaniphile olufana ne C futhi ihlanganiswe kolunye ulimi - i-Fift Assembler.

I-Assembler Yesihlanu - Umtapo wolwazi wesihlanu wokukhiqiza ikhodi esebenzisekayo kanambambili ye-TVM. I-Fifth Assembler ayinayo i-comiler. Lokhu Ulimi Olukhethekile Lwesizinda Esishumekiwe (i-eDSL).

Umncintiswano wethu uyasebenza

Okokugcina, sekuyisikhathi sokubheka imiphumela yemizamo yethu.

Isiteshi sokukhokha esivumelanayo

Isiteshi sokukhokha siyinkontileka ehlakaniphile evumela abasebenzisi ababili ukuthi bathumele izinkokhelo ngaphandle kwe-blockchain. Ngenxa yalokho, awulondolozi imali kuphela (ayikho ikhomishana), kodwa futhi isikhathi (akudingeki ulinde ukuthi ibhulokhi elandelayo icutshungulwe). Izinkokhelo zingaba zincane ngendlela ofisa ngayo futhi kaningi njengoba kudingeka. Kulokhu, abathintekayo akudingeki bathembane, ngoba ukulunga kwesivumelwano sokugcina kuqinisekiswa yinkontileka ehlakaniphile.

Sithole isixazululo esilula kakhulu senkinga. Izinhlangothi ezimbili zingashintshana ngemilayezo esayiniwe, ngayinye iqukethe izinombolo ezimbiliβ€”inani eliphelele elikhokhwa iqembu ngalinye. Lezi zinombolo ezimbili zisebenza njenge iwashi le-vector ezinhlelweni ezisabalalisiwe zendabuko futhi usethe i-oda elithi "kwenzeka ngaphambili" mayelana nokwenziwe. Ngokusebenzisa le datha, inkontileka izokwazi ukuxazulula noma yikuphi ukungqubuzana okungenzeka.

Eqinisweni, inombolo eyodwa yanele ukusebenzisa lo mbono, kodwa sizishiye zombili ngoba ngale ndlela singenza isikhombimsebenzisi esisebenziseka kalula. Ngaphezu kwalokho, sinqume ukufaka inani lenkokhelo kumlayezo ngamunye. Ngaphandle kwayo, uma umlayezo ulahlekile ngesizathu esithile, khona-ke, nakuba wonke amanani kanye nokubala kokugcina kuzoba okulungile, umsebenzisi angase angaboni ukulahlekelwa.

Ukuze sihlole umbono wethu, sibheke izibonelo zokusebenzisa umthetho olandelwayo wesiteshi sokukhokha esilula nesimfishane. Ngokumangalisayo, sithole ezimbili kuphela:

  1. Incazelo indlela efanayo, kuphela esimweni sesiteshi esisodwa.
  2. Okokufundisa, echaza umqondo ofanayo nowethu, kodwa ngaphandle kokuchaza imininingwane eminingi ebalulekile, njengokunemba okuvamile nezinqubo zokuxazulula izingxabano.

Kwaba sobala ukuthi kunengqondo ukuchaza inqubo yethu ngokuningiliziwe, sinake ngokukhethekile ukulunga kwayo. Ngemva kokuphindaphinda izikhathi ezimbalwa, ukucaciswa kwase kulungile, futhi manje nawe ungakwenza. ambuke.

Senze inkontileka ku-FunC, futhi sabhala insiza yomugqa womyalo ukuze sihlanganyele nenkontileka yethu ngokuphelele ku-Fift, njengoba kunconywe abahleli. Besingakhetha noma yiluphi olunye ulimi lwe-CLI yethu, kodwa besinentshisekelo yokuzama i-Fit ukuze sibone ukuthi isebenza kanjani ekusebenzeni.

Uma sikhuluma iqiniso, ngemva kokusebenza no-Fift, asizange sibone izizathu ezizwakalayo zokukhetha lolu limi kunezilimi ezidumile nezisetshenziswa ngenkuthalo ngamathuluzi athuthukisiwe nemitapo yolwazi. Ukuhlela ngolimi olusekelwe kusitaki akujabulisi neze, ngoba kufanele uhlale ugcina ekhanda lakho okuku-stack, futhi umhlanganisi akasizi ngalokhu.

Ngakho-ke, ngokombono wethu, okuwukuphela kwesizathu sokuba khona kwe-Fift indima yayo njengolimi lokusingatha i-Fift Assembler. Kodwa bekungeke yini kube ngcono ukushumeka isihlanganisi se-TVM olimini oluthile olukhona, kunokusungula olusha lwale njongo kuphela?

I-TVM Haskell eDSL

Manje sekuyisikhathi sokukhuluma ngenkontileka yethu yesibili ehlakaniphile. Sinqume ukwakha isikhwama semali esisayinwe kaningi, kodwa ukubhala enye inkontileka ehlakaniphile ku-FunC kungaba yisicefe kakhulu. Besifuna ukwengeza ukunambitheka okuthile, futhi lokho bekuwulimi lwethu lomhlangano we-TVM.

Njengo-Fift Assembler, ulimi lwethu olusha lushumekiwe, kodwa sikhethe u-Haskell njengomsingathi esikhundleni se-Fift, esivumela ukuthi sisebenzise ngokugcwele uhlelo lwayo lohlobo oluthuthukisiwe. Lapho usebenza nezinkontileka ezihlakaniphile, lapho izindleko zephutha elincane zingaba phezulu kakhulu, ukuthayipha okumile, ngokombono wethu, kuyinzuzo enkulu.

Ukukhombisa ukuthi i-TVM assembler ibukeka kanjani ishumekwe ku-Haskell, sisebenzise isikhwama semali esijwayelekile kuso. Nazi izinto ezimbalwa okufanele uzinake:

  • Le nkontileka inomsebenzi owodwa, kodwa ungasebenzisa eziningi ngokuthanda kwakho. Uma uchaza umsebenzi omusha ngolimi lomsingathi (okungukuthi, i-Haskell), i-eDSL yethu ikuvumela ukuthi ukhethe ukuthi uyafuna yini ukuthi ibe umzila ohlukile ku-TVM noma imane ifakwe emgqeni lapho kushaya ucingo.
  • NjengoHaskell, imisebenzi inezinhlobo ezihlolwa ngesikhathi sokuhlanganisa. Ku-eDSL yethu, uhlobo lokufakwayo lomsebenzi wuhlobo lwesitaki olulindelwe umsebenzi, futhi uhlobo lomphumela wuhlobo lwesitaki esizokhiqizwa ngemva kocingo.
  • Ikhodi inezichasiselo stacktype, echaza uhlobo lwesitaki olulindelekile endaweni yokufona. Kunkontileka yesikhwama sokuqala lawa bekungamazwana nje, kodwa ku-eDSL yethu empeleni ayingxenye yekhodi futhi ayahlolwa ngesikhathi sokuhlanganiswa. Zingasebenza njengamadokhumenti noma izitatimende ezisiza unjiniyela athole inkinga uma ikhodi ishintsha kanye nohlobo lwesitaki lushintsha. Impela, izichasiselo ezinjalo azithinti ukusebenza kwesikhathi sokusebenza, njengoba kungekho khodi ye-TVM eyakhelwe zona.
  • Lesi kusewumfanekiso obhalwe emasontweni amabili, ngakho usemkhulu umsebenzi okufanele wenziwe kulo msebenzi. Isibonelo, zonke izimo zamakilasi ozibona kukhodi engezansi kufanele zenziwe ngokuzenzakalelayo.

Yilokhu ukuqaliswa kwe-multisig wallet kubukeka ku-eDSL yethu:

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

Ikhodi egcwele yomthombo ye-eDSL yethu kanye nenkontileka yesikhwama esinezisiginesha eziningi ingatholakala kokuthi lenqolobane. Futhi nokuningi utshelwa ngokuningiliziwe mayelana nezilimi ezakhelwe ngaphakathi, uzakwethu uGeorgy Agapov.

Iziphetho mayelana nomncintiswano kanye ne-TON

Sekukonke, umsebenzi wethu uthathe amahora angu-380 (okuhlanganisa ukujwayelana nemibhalo, imihlangano kanye nentuthuko yangempela). Abathuthukisi abahlanu babambe iqhaza kuphrojekthi yokuncintisana: i-CTO, umholi weqembu, ochwepheshe bepulatifomu ye-blockchain kanye nabathuthukisi be-software ye-Haskell.

Sithole izinsiza zokubamba iqhaza emqhudelwaneni ngaphandle kobunzima, njengoba umoya we-hackathon, ukusebenzisana ngokubambisana, nesidingo sokucwilisa ngokushesha ezintweni zobuchwepheshe obusha kuhlala kujabulisa. Ubusuku obuningana bokuqwasha ukuze kuzuzwe imiphumela ephezulu ezimeni zezinsiza ezilinganiselwe bunxeshezelwa ngolwazi oluyigugu nezinkumbulo ezinhle kakhulu. Ngaphezu kwalokho, ukusebenza emisebenzini enjalo kuhlale kuwuvivinyo oluhle lwezinqubo zenkampani, ngoba kunzima kakhulu ukuzuza imiphumela ehloniphekile ngaphandle kokusebenzelana kwangaphakathi okusebenzayo.

Izingoma eceleni: sihlabeke umxhwele ngomsebenzi omningi owenziwe yiqembu le-TON. Bakwazile ukwakha uhlelo oluyinkimbinkimbi, oluhle, futhi okubaluleke kakhulu, uhlelo lokusebenza. I-TON izibonakalise iyinkundla enamandla amakhulu. Kodwa-ke, ukuze lesi simiso semvelo sithuthuke, kuningi okudingeka kwenziwe, kokubili mayelana nokusetshenziswa kwayo kumaphrojekthi we-blockchain kanye nokuthuthukisa amathuluzi okuthuthukisa. Siyaziqhenya ngokuba yingxenye yalolu hlelo.

Uma ngemva kokufunda lesi sihloko usenemibuzo noma unemibono yokuthi ungasebenzisa kanjani i-TON ukuxazulula izinkinga zakho, sibhalele - sizokujabulela ukwabelana ngolwazi lwethu.

Source: www.habr.com

Engeza amazwana