Ukuguqula i-FunC ibe yiFunCtional kunye neHaskell: Indlela uSerokell aphumelele ngayo uKhuphiswano lweTelegram Blockchain

Mhlawumbi uyivile loo Telegram imalunga nokusungula iqonga leTon blockchain. Kodwa usenokuba uphoswe ziindaba kungekudala kwiTelegram ubhengeze ukhuphiswano ukuphunyezwa kwekhontrakthi enye okanye ngaphezulu ehlakaniphile kweli qonga.

Iqela leSerokell, elinamava amaninzi ekuphuhliseni iiprojekthi ezinkulu ze-blockchain, alikwazanga ukuma eceleni. Sanikezela abasebenzi abahlanu kukhuphiswano, kwaye emva kweeveki ezimbini bathatha indawo yokuqala kulo phantsi kwegama lesidlaliso esingakhethiyo (i-Sexy Chameleon). Kweli nqaku ndiza kuthetha ngendlela abayenze ngayo. Siyathemba ukuba kwimizuzu elishumi ilandelayo uya kufunda ubuncinane ibali elinomdla, kwaye ubukhulu becala uya kufumana into eluncedo kuyo onokuyisebenzisa emsebenzini wakho.

Kodwa masiqale ngomxholo omncinci.

Ukhuphiswano kunye nemiqathango yalo

Ngoko ke, imisebenzi ephambili yabathathi-nxaxheba yayikukuphunyezwa kwesinye okanye ngaphezulu kweekontraki ezicetywayo ezicetywayo, kunye nokwenza izindululo zokuphucula i-TON ecosystem. Olu khuphiswano lwaqala nge-24 kaSeptemba ukuya kwi-15 ka-Okthobha, kwaye iziphumo zabhengezwa kuphela nge-15 kaNovemba. Ixesha elide kakhulu, ngokuqwalasela ukuba ngeli xesha iTelegram ikwazile ukubamba kwaye ibhengeze iziphumo zemincintiswano ekuyilweni nasekuphuhlisweni kwezicelo kwi-C ++ yokuvavanya nokuvavanya umgangatho weefowuni zeVoIP kwiTelegram.

Sikhethe iikhontrakthi ezimbini ezihlakaniphile kuluhlu olucetywe ngabaququzeleli. Ngomnye wabo, sasebenzisa izixhobo ezisasazwa nge-TON, kwaye okwesibini kwaphunyezwa ngolwimi olutsha oluphuhliswe ziinjineli zethu ngokukodwa kwi-TON kwaye zakhiwe kwi-Haskell.

Ukhetho lolwimi lwenkqubo olusebenzayo alukho ngengozi. Kwethu blog corporate Sihlala sithetha malunga nokuba kutheni sicinga ukuba ukuntsonkotha kweelwimi ezisebenzayo kukubaxa okukhulu kwaye kutheni sikhetha ngokubanzi kunokuba zijolise ekuchaseni. Ngendlela, nayo iqulethe imvelaphi yeli nqaku.

Kwakutheni ukuze senze isigqibo sokuthatha inxaxheba?

Ngamafutshane, ngenxa yokuba ubuchule bethu buyinto engekho-standard kunye neeprojekthi eziyinkimbinkimbi ezifuna izakhono ezizodwa kwaye zihlala zinexabiso lezesayensi kuluntu lwe-IT. Sixhasa ngamandla uphuhliso lomthombo ovulekileyo kwaye sithatha inxaxheba kulwazi lwalo, kwaye sikwasebenzisana neeyunivesithi eziphambili zaseRussia kwinkalo yesayensi yekhompyuter kunye nemathematika.

Imisebenzi enomdla yokhuphiswano kunye nokubandakanyeka kwiprojekthi yethu ethandekayo yeTelegram ngokwayo yayiyinkuthazo ebalaseleyo, kodwa ingxowa-mali yebhaso yaba yinkuthazo eyongezelelweyo. πŸ™‚

Uphando lwe-TON blockchain

Sibeka iliso ngononophelo uphuhliso olutsha kwi-blockchain, ubukrelekrele bokwenziwa kunye nokufunda koomatshini kwaye sizame ukungaphoswa yinto enye ebalulekileyo kwindawo nganye esisebenza kuyo. Ke ngoko, ngelixa ukhuphiswano luqala, iqela lethu lalisele liqhelene nemibono evela Iphepha elimhlophe le-TON. Nangona kunjalo, ngaphambi kokuba siqale umsebenzi kunye ne-TON, asizange sihlalutye amaxwebhu obugcisa kunye nekhowudi yomthombo weqonga, ngoko ke inyathelo lokuqala lalicacile - uphononongo olunzulu lwamaxwebhu asemthethweni. indawo kunye iindawo zokugcina iiprojekthi.

Ngethuba ukhuphiswano luqala, ikhowudi yayisele ishicilelwe, ngoko ukugcina ixesha, sagqiba ekubeni sikhangele isikhokelo okanye isishwankathelo esibhalwe ngu. ngabasebenzisi. Ngelishwa, oku akunikanga ziphumo - ngaphandle kwemiyalelo yokuhlanganisa iqonga ku-Ubuntu, asifumananga naziphi na ezinye izixhobo.

Amaxwebhu ngokwawo ayephandwe kakuhle, kodwa kwakunzima ukufundeka kwezinye iindawo. Ngokuqhelekileyo kuye kwafuneka sibuyele kumanqaku athile kwaye sitshintshe ukusuka kwiinkcazo eziphakamileyo zeengcamango ezingabonakaliyo kwiinkcukacha zokuphunyezwa eziphantsi.

Kuya kuba lula ukuba inkcazo ayifaki inkcazo ecacileyo yokuphunyezwa konke konke. Ulwazi malunga nendlela umatshini obonakalayo omele ngayo i-stack yawo kunokwenzeka ukuba uphazamise abaphuhlisi abenza izivumelwano ezihlakaniphile zeqonga le-TON kunokubanceda.

Nix: ukudibanisa iprojekthi

ESerokell singabalandeli abakhulu nix. Siqokelela iiprojekthi zethu kunye nayo kwaye sizisebenzise NixOps, kwaye ifakwe kuzo zonke iiseva zethu I-NixOS. Enkosi koku, zonke izakhiwo zethu ziyakwazi ukuveliswa kwaye zisebenza kuyo nayiphi na inkqubo yokusebenza apho i-Nix inokufakwa khona.

Ngoko siqale ngokudala Umaleko we-Nix onembonakalo yendibano ye-TON. Ngoncedo lwayo, ukuqulunqa i-TON kulula kangangoko kunokwenzeka:

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

Qaphela ukuba awudingi ukufaka nayiphi na into exhomekeke kuyo. UNix uya kukwenzela yonke into ngomlingo, nokuba usebenzisa iNixOS, Ubuntu, okanye iMacOS.

Ukulungiselela iTON

Ikhowudi yekhontrakthi ehlakaniphile kwi-TON Network isebenza kwi-TON Virtual Machine (TVM). I-TVM inzima ngakumbi kunabanye oomatshini abaninzi, kwaye inomsebenzi onomdla kakhulu, umzekelo, inokusebenza nayo ukuqhubekeka ΠΈ amakhonkco data.

Ngapha koko, abafana abavela kwi-TON benze iilwimi ezintathu zokucwangcisa:

Isihlanu lulwimi lwenkqubo lwestack jikelele olufana Ibandla. Amandla akhe aphezulu kukukwazi ukusebenzisana neTVM.

I-FunC lulwimi lwenkqubo lwekhontrakthi elumkileyo efana ne C kwaye ihlanganiswe kolunye ulwimi - iFift Assembler.

Umhlanganisi wesihlanu -Ithala leencwadi lesihlanu lokuvelisa ikhowudi esebenzayo yeTVM. I-Assembler yesihlanu ayinaye umqokeleli. Oku Ulwimi oluKhethekileyo lweDomain oluzinzisiweyo (eDSL).

Ukhuphiswano lwethu luyasebenza

Okokugqibela, lixesha lokuba sijonge iziphumo zemigudu yethu.

Umjelo wokuhlawula ohambelanayo

Itshaneli yokuhlawula yinkontileka ehlakaniphile evumela abasebenzisi ababini ukuba bathumele iintlawulo ngaphandle kwe-blockchain. Ngenxa yoko, awugcini nje imali (akukho khomishini), kodwa kunye nexesha (akufuneki ulinde ibhloko elandelayo ukuba iqhutywe). Iintlawulo zinokuba zincinci njengoko zifunwa kwaye rhoqo njengoko kufuneka. Kule meko, amaqela akufuneki athembane, ekubeni ukulunga kokuhlaliswa kokugqibela kuqinisekiswa yinkontileka ehlakaniphile.

Sifumene isisombululo esilula kwingxaki. Amaqela amabini anokwabelana ngemiyalezo esayiniweyo, ngalinye linamanani amabiniβ€”imali epheleleyo ehlawulwe liqela ngalinye. La manani mabini asebenza njenge iwotshi yevektha kwiinkqubo eziqhelekileyo ezisasazwayo kwaye usete umyalelo "wenzeke ngaphambili" kwiitransekshini. Ukusebenzisa le datha, isivumelwano siya kukwazi ukusombulula nayiphi na ingxabano enokwenzeka.

Enyanisweni, inani elinye lanele ukuphumeza le ngcamango, kodwa sishiye zombini kuba ngale ndlela sinokwenza ujongano lomsebenzisi olulula ngakumbi. Ukongeza, sigqibe kwelokuba sifake imali yentlawulo kumyalezo ngamnye. Ngaphandle kwayo, ukuba umyalezo ulahlekile ngenxa yesizathu esithile, ngoko ke, nangona zonke iimali kunye nokubala kokugqibela kuya kuchaneka, umsebenzisi akanakuqaphela ilahleko.

Ukuvavanya umbono wethu, sijonge imizekelo yokusebenzisa indlela elula nemfutshane yendlela yokuhlawula yesitishi. Okumangalisayo kukuba, sifumene ezimbini kuphela:

  1. inkcazelo indlela efanayo, kuphela kwimeko yomjelo ongaqhelekanga.
  2. Isifundo, echaza ingcamango efanayo neyethu, kodwa ngaphandle kokuchaza iinkcukacha ezininzi ezibalulekileyo, ezifana nokuchaneka ngokubanzi kunye neenkqubo zokusombulula iingxabano.

Kwacaca ukuba kunengqiqo ukuchaza iprotocol yethu ngokweenkcukacha, sinikele ingqalelo ekhethekileyo ekuchanekeni kwayo. Emva kokuphindaphinda kaninzi, iinkcukacha zazilungile, kwaye ngoku unako. mjonge.

Siphumeze ikhontrakthi kwi-FunC, kwaye sabhala usetyenziso lomgca womyalelo wokusebenzisana nekhontrakthi yethu ngokupheleleyo kwi-Fift, njengoko kucetyiswa ngabaququzeleli. Ngesikhethe naluphi na olunye ulwimi kwi-CLI yethu, kodwa besinomdla wokuzama i-Fit ukubona ukuba iqhuba njani xa isenziwa.

Ukunyaniseka, emva kokusebenza noFift, asibonanga zizathu zinyanzelisayo zokukhetha olu lwimi kwiilwimi ezidumileyo nezisetyenziswa ngokusebenzayo kunye nezixhobo eziphuhlisiweyo kunye namathala eencwadi. Ukucwangcisa ngolwimi olusekwe kwi-stack akuthandeki, kuba kufuneka uhlale ugcina entlokweni yakho into ekwi-stack, kwaye umqambi akancedi kule nto.

Ke ngoko, ngokoluvo lwethu, ekuphela kwesizathu sokubakho kweFift yindima yayo njengolwimi olubamba iFift Assembler. Kodwa ngaba bekungayi kuba ngcono ukubethelela isihlanganisi seTVM kulwimi olukhoyo, endaweni yokuyila entsha ngale njongo yodwa?

TVM Haskell eDSL

Ngoku lixesha lokuba sithethe ngesivumelwano sethu sesibini esikrelekrele. Sigqibe ekubeni siphuhlise isipaji esineesignesha ezininzi, kodwa ukubhala enye ikhontrakthi ekrelekrele kwiFunC kuya kuba yindinisa kakhulu. Sasifuna ukongeza incasa, kwaye yayilulwimi lwethu lwendibano yeTVM.

NjengoFift Assembler, ulwimi lwethu olutsha lufakwe ngaphakathi, kodwa sikhethe uHaskell njengomamkeli endaweni yeFift, esivumela ukuba sithathe ithuba elipheleleyo lenkqubo yalo yodidi oluphezulu. Xa usebenza kunye neekontraki ezihlakaniphile, apho iindleko zempazamo encinci ingaba phezulu kakhulu, ukuchwetheza okumileyo, ngokombono wethu, kuyinzuzo enkulu.

Ukubonisa ukuba i-TVM assembler ibonakala ngathi ifakwe kwi-Haskell, siphumeze i-wallet eqhelekileyo kuyo. Nazi izinto ezimbalwa ekufuneka uziqwalasele:

  • Le khontrakthi iquka umsebenzi omnye, kodwa ungasebenzisa ezininzi njengoko uthanda. Xa uchaza umsebenzi omtsha kulwimi lokusingatha (okt. Haskell), i-eDSL yethu ikuvumela ukuba ukhethe ukuba uyafuna ukuba ibe yinkqubo eyahlukileyo kwi-TVM okanye ifakwe ngokulula kwindawo yokufowuna.
  • NjengoHaskell, imisebenzi ineentlobo ezijongwayo ngexesha lokuqokelela. Kwi-eDSL yethu, uhlobo lwegalelo lomsebenzi luhlobo lwesitaki esilindelwe ngumsebenzi, kwaye uhlobo lwesiphumo luhlobo lwestaki oluya kuveliswa emva kokufowuna.
  • Ikhowudi inezihlomelo stacktype, ichaza uhlobo lwesitaki olulindelekileyo kwindawo yokufowuna. Kwikhontrakthi ye-wallet yasekuqaleni ezi yayizizimvo nje, kodwa kwi-eDSL yethu ngokwenene ziyinxalenye yekhowudi kwaye zitshekishwa ngexesha lokuqokelela. Bangasebenza njengamaxwebhu okanye iingxelo ezinceda umphuhlisi afumane ingxaki ukuba ikhowudi iyatshintsha kunye nohlobo lwesitaki luyatshintsha. Ngokuqinisekileyo, izichasiselo ezinjalo azichaphazeli ukusebenza kwexesha lokusebenza, kuba akukho khowudi ye-TVM eyenzelwa yona.
  • Lo iseyiprototype ebhalwe kwiiveki ezimbini, ngoko ke usemninzi umsebenzi ekufuneka wenziwe kule projekthi. Umzekelo, zonke iimeko zeeklasi ozibonayo kwikhowudi engezantsi kufuneka zenziwe ngokuzenzekelayo.

Nantsi indlela ukuphunyezwa kwesipaji semultisig kujongeka ngayo kwi-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

Ikhowudi yomthombo opheleleyo we-eDSL yethu kunye nekhontrakthi ye-wallet yesignesha emininzi inokufumaneka lo vimba. Kunye nokuninzi kubaliswa ngokweenkcukacha malunga neelwimi ezakhelwe ngaphakathi, umlingane wethu uGeorgy Agapov.

Izigqibo malunga nokhuphiswano kunye neTON

Lilonke, umsebenzi wethu uthathe iiyure ezingama-380 (kubandakanywa ukuqhelanisa namaxwebhu, iintlanganiso kunye nophuhliso lwangempela). Abaphuhlisi abahlanu bathathe inxaxheba kwiprojekthi yokhuphiswano: i-CTO, iqela elikhokelayo, iingcali zeqonga le-blockchain kunye nabaphuhlisi be-software ye-Haskell.

Sifumene izixhobo zokuthatha inxaxheba kukhuphiswano ngaphandle kobunzima, kuba umoya we-hackathon, ukusebenza ngokubambisana, kunye nesidingo sokuntywila ngokukhawuleza kwimiba yetekhnoloji entsha ihlala imnandi. Ubusuku obuninzi bokungalali ukuze kufumaneke iziphumo eziphezulu kwiimeko zobuncwane obunqongopheleyo bubuyekezwa ngamava axabisekileyo kunye neenkumbulo ezibalaseleyo. Ukongeza, ukusebenza kwimisebenzi enjalo kuhlala kuluvavanyo olulungileyo lweenkqubo zenkampani, kuba kunzima kakhulu ukufikelela kwiziphumo ezindilisekileyo ngaphandle kokusebenza kakuhle kwangaphakathi.

Iingoma ecaleni: siye sachukumiseka ngumsebenzi omninzi owenziwe liqela leTON. Bakwazile ukwakha inkqubo entsonkothileyo, entle, kwaye okona kubaluleke kakhulu, inkqubo yokusebenza. I-TON izibonakalise njengeqonga elinamandla amakhulu. Nangona kunjalo, ukwenzela ukuba le ecosystem iphuhlise, kuninzi okufuneka kwenziwe, ngokumalunga nokusetyenziswa kwayo kwiiprojekthi ze-blockchain kunye nokuphucula izixhobo zophuhliso. Siyazingca ngokuba yinxalenye yale nkqubo.

Ukuba emva kokufunda eli nqaku usenayo nayiphi na imibuzo okanye unemibono malunga nendlela yokusebenzisa i-TON ukusombulula iingxaki zakho, sibhalele β€” siya kukuvuyela ukwabelana ngamava ethu.

umthombo: www.habr.com

Yongeza izimvo