U beddelashada FunC ee FunCtional oo leh Haskell: Sida Serokell uu ugu guulaystay Telegram Blockchain Tartankii

Waxaa laga yaabaa inaad maqashay Telegram-kaas waxay ku dhowdahay in la bilaabo ton blockchain platform. Laakiin waxaa laga yaabaa inaad seegtay warkaas wakhti aan fogayn Telegram ku dhawaaqay tartan hirgelinta hal ama in ka badan oo qandaraasyo caqli gal ah oo loogu talagalay goobtan.

Kooxda Serokell, oo khibrad dheer u leh horumarinta mashaariicda waaweyn ee blockchain, way istaagi waayeen. Waxaan u igmanay shan shaqaale ah tartanka, laba toddobaad ka dibna waxay galeen kaalinta koowaad ee naaneyska (in) naaneyska qarsoodiga ah ee Sexy Chameleon. Maqaalkan waxaan kaga hadli doonaa sida ay u sameeyeen. Waxaan rajeyneynaa in tobanka daqiiqo ee soo socda aad ugu yaraan akhrin doonto sheeko xiiso leh, ugu badnaanna waxaad ka heli doontaa wax faa'iido leh oo aad ku codsan karto shaqadaada.

Laakiin aan ku bilowno macno yar.

Tartanka iyo shuruudihiisa

Markaa, hawlaha ugu muhiimsan ee ka qaybgalayaashu waxay ahaayeen hirgelinta hal ama in ka badan oo ka mid ah qandaraasyada casriga ah ee la soo jeediyay, iyo sidoo kale samaynta soo jeedinta lagu hagaajinayo nidaamka deegaanka ee TON. Tartanka ayaa socday intii u dhaxeysay 24-kii Sebtembar ilaa 15-kii October, waxaana natiijada lagu dhawaaqay 15-kii November oo kaliya. Muddo dheer, iyada oo la tixgelinayo in muddadan Telegram ay u suurtagashay in ay qabato oo ku dhawaaqdo natiijooyinka tartamada naqshadeynta iyo horumarinta codsiyada C ++ ee tijaabinta iyo qiimeynta tayada wicitaanada VoIP ee Telegram.

Waxaan ka dooranay laba qandaraas oo caqli gal ah liiska ay soo jeediyeen qabanqaabiyeyaasha. Mid ka mid ah, waxaanu isticmaalnay qalab loo qaybiyey TON, ka labaadna waxa lagu hirgeliyey luuqad cusub oo ay farsameeyeen injineeradayadu gaar ahaan TON oo loo dhisay Haskell.

Doorashada luqadda barnaamijka shaqaynaysa maahan wax shil ah. In our Blog-ga shirkadaha Waxaan inta badan ka hadalnaa sababta aan u maleyneyno in kakanaanta luqadaha shaqeyntu ay tahay buunbuunin weyn iyo sababta aan guud ahaan uga doorbidno kuwa ujeedo leh. By habka, waxa kale oo ku jira asalka maqaalkan.

Maxaan xitaa go'aansanay inaan ka qayb-galno?

Marka la soo koobo, sababtoo ah takhasuskayaga waa mashruucyo aan caadi ahayn oo adag oo u baahan xirfado gaar ah oo inta badan qiimo cilmiyeed u leh bulshada IT-ga. Waxaan si xoog leh u taageernaa horumarinta il-furan oo ku hawlan in ay caan ah, iyo sidoo kale iskaashi la jaamacadaha Ruush hogaanka berrinkii sayniska kombiyuutarka iyo xisaabta.

Hawlaha xiisaha leh ee tartanka iyo ka-qaybgalka mashruucayaga Telegram-ka ee aan jecelnahay laftooda waxay ahaayeen dhiirigelin aad u fiican, laakiin sanduuqa abaal-marintu wuxuu noqday dhiirigelin dheeraad ah. πŸ™‚

TON baaritaanka blockchain

Waxaan si dhow ula soconaa horumarka cusub ee blockchain, sirdoonka macmalka ah iyo barashada mashiinka waxaanan isku daynaa in aynaan seegin hal sii dayn muhiim ah mid kasta oo ka mid ah meelaha aan ka shaqeyno. Sidaa darteed, markii uu tartanku bilaabmay, kooxdeennu waxay hore u yaqaaneen fikrado ka yimid TON warqad cad. Si kastaba ha noqotee, ka hor inta aan la bilaabin shaqada TON, ma aanan falanqeyn dukumeentiyada farsamada iyo koodhka dhabta ah ee goobta, sidaas darteed tallaabada ugu horreysa waxay ahayd mid cad - daraasad dhamaystiran oo ku saabsan dukumentiyada rasmiga ah goobta iyo kaydka mashruuca.

Markii uu tartanku bilaabmay, koodhka mar hore ayaa la daabacay, si aanu wakhtiga u badbaadino, waxaanu go'aansanay inaanu raadino hage ama warbixin kooban oo uu qoray. by isticmaalayaasha. Nasiib darro, tani ma aysan bixin wax natiijo ah - marka laga reebo tilmaamaha loogu talagalay isku xirka goobta Ubuntu, ma aanan helin wax qalab kale ah.

Dukumeentiga laftiisa ayaa ahaa mid si wanaagsan loo baaray, laakiin way adkayd in meelaha qaar laga akhriyo. Inta badan waxay ahayd inaan ku soo laabano qodobbada qaarkood oo aan ka beddelno sharraxaadaha heerka sare ee fikradaha aan la taaban karin una beddelno tafaasiisha fulinta heerka hoose.

Way sahlanaan lahayd haddii qeexitaanku aanu ku jirin sharaxaad faahfaahsan oo ku saabsan hirgelinta gabi ahaanba. Macluumaadka ku saabsan sida mashiinka farsamada gacanta uu u matalo xirmihiisa waxay u badan tahay inay ka jeediyaan horumariyeyaasha u abuuraya qandaraasyada casriga ah ee aaladda TON halkii ay ka caawin lahaayeen.

Nix: isku geynta mashruuca

Serokell waxaanu nahay taageereyaal waaweyn Nix. Waanu ku ururinayna mashaariicdayada waxaanan ku hawlgelinaa anagoo adeegsanayna NixOps, oo lagu rakibay dhammaan server-yadayada Nix OS. Waad ku mahadsan tahay tan, dhammaan dhismayaasheena waa la soo saari karaa waxayna ka shaqeeyaan nidaam kasta oo qalliin oo Nix lagu rakibi karo.

Markaa waxaan ku bilownay abuurista Nix ku dahaadhay muujinta shirka TON. Caawinteeda, ururinta TON waa sida ugu fudud ee suurtogalka ah:

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

Ogsoonow inaadan u baahnayn inaad rakibto wax ku tiirsan. Nix sixir wax walba ayuu kuu samayn doonaa, haddii aad isticmaalayso NixOS, Ubuntu, ama macOS.

Barnaamijyada TON

Koodhka qandaraaska caqliga leh ee TON Network wuxuu ku shaqeeyaa TON Virtual Machine (TVM). TVM way ka adag tahay inta badan mashiinada kale ee farsamada, waxayna leedahay shaqo aad u xiiso badan, tusaale ahaan, waxay la shaqayn kartaa sii wadida ΠΈ isku xirka xogta.

Intaa waxaa dheer, nimanka TON waxay abuureen saddex luqadood oo barnaamij oo cusub:

Shan waa luqad caalami ah oo isbiirsaday oo u eg Aragti. Awoodiisa sare waa awooda la falgalka TVM.

FunC waa luuqada barnaamijyada qandaraasyada smart ee la mid ah C waxaana lagu soo ururiyey luqad kale - Fift Assembler.

Isku-duwaha Shanaad - Maktabad shan ah oo loogu talagalay soo saarista koodka laba-geesoodka ah ee TVM. Isku-duwaha shanaad ma haysto isku-duwe. Tani Luqadda Gaarka ah ee Domain-ka (eDSL).

Tartankayagu wuu shaqeeyaa

Ugu dambayntii, waxaa la joogaa waqtigii aan eegi lahayn natiijada dadaalkeenna.

Kanaalka lacag bixinta asynchronous

Kanaalka lacag-bixinta waa qandaraas caqli-gal ah oo u oggolaanaya laba isticmaale inay u diraan lacag-bixinno ka baxsan blockchain. Natiijo ahaan, waxaad badbaadinaysaa lacag kaliya (ma jiro komishanka), laakiin sidoo kale waqti (ma aha inaad sugto xannibaadda soo socota si loo farsameeyo). Lacag-bixinuhu waxay noqon karaan kuwo yar sida la rabo iyo inta jeer ee loo baahdo. Xaaladdan oo kale, dhinacyadu maaha inay isku kalsoonaadaan, tan iyo caddaaladda xallinta kama dambaysta ah waxaa dammaanad qaadaya qandaraaska caqliga leh.

Waxaan u helnay xal cadaalad ah oo fudud dhibaatada. Laba qolo ayaa is weydaarsan kara farriimaha saxeexan, mid kastaa ka kooban yahay laba lambar - qaddarka buuxa ee qolo kasta bixisay. Labadan tiradood waxay u shaqeeyaan sida saacadda vector in hababka loo qaybiyo dhaqameed oo dejiyo "dhacday ka hor" amarka ku saabsan macaamil ganacsi. Isticmaalka xogtan, qandaraasku wuxuu awood u yeelan doonaa inuu xalliyo khilaaf kasta oo suurtagal ah.

Dhab ahaantii, hal lambar ayaa ku filan in la hirgeliyo fikraddan, laakiin waan ka tagnay labadaba sababtoo ah habkan waxaan ka dhigi karnaa mid ku habboon isticmaale. Intaa waxaa dheer, waxaan go'aansanay inaan ku darno qaddarka lacag bixinta fariin kasta. La'aanteed, haddii fariintu ay lunto sabab qaar ka mid ah, ka dibna, inkastoo dhammaan qadarka iyo xisaabinta kama dambaysta ah ay sax noqon doonto, isticmaaluhu ma ogaan karo khasaaraha.

Si aan u tijaabino fikradayada, waxaanu raadinay tusaalayaal isticmaalka habkan lacag bixinta ee fudud oo kooban. Waxaa la yaab leh, waxaan helnay laba kaliya:

  1. Description hab la mid ah, oo keliya kiiska kanaalka unidirectional.
  2. Waxbarashada, kaas oo qeexaya fikrad la mid ah midkayada, laakiin iyada oo aan la sharraxin faahfaahin badan oo muhiim ah, sida saxnaanta guud iyo hababka xallinta khilaafaadka.

Waxaa caddaatay inay macno samaynayso in si faahfaahsan loo qeexo hab-maamuuskayaga, anagoo fiiro gaar ah siinnayna saxnaantiisa. Dhowr ku celcelin kadib, qeexitaanku waa diyaar, oo hadda adiguna waad awoodaa. eeg iyada.

Waxaan qandaraaska ka hirgelinay FunC, waxaana ku qornay adeegga khadka taliska ee la falgalka qandaraaskayaga gebi ahaanba Fift, sida ay ku taliyeen qabanqaabiyeyaasha. Waxaan u dooran karnaa luqad kasta oo kale CLI, laakiin waxaan xiisaynnay inaan isku dayno Fit si aan u aragno sida ay ugu shaqeyso ficil ahaan.

Si daacadnimo ah, ka dib markii aan la shaqeynay Fift, ma aanan arag sababo adag oo lagu doorbidayo luqaddan si caan ah oo si firfircoon loo isticmaalo oo leh qalab iyo maktabado horumarsan. Ku-baragaynta luuqad ku-salaysan waa arrin aan wanaagsanayn, maadaama ay tahay inaad si joogto ah madaxaaga ugu hayso waxa ku jira xidhmada, oo isku-dubariduhu kuma caawinayo arrintan.

Sidaa darteed, fikraddayada, caddaynta kaliya ee jiritaanka Fift waa doorka ay ku leedahay luqadda martigelinta ee Fift Assembler. Laakin miyayna fiicnaan doonin in la dhexgeliyo isku-duwaha TVM-ga luqadaha jira, intii la abuuri lahaa mid cusub oo ujeeddadan kaliya ah?

TVM Haskell eDSL

Hadda waa waqtigii laga hadli lahaa qandaraaskeena labaad ee caqliga leh. Waxaan go'aansanay inaan horumarino boorsada saxiixyada badan, laakiin qorista qandaraas kale oo caqli gal ah FunC waxay noqon doontaa caajis. Waxaan rabnay inaan ku darno xoogaa dhadhan ah, taasina waxay ahayd luqadeena kulanka TVM.

Sida Fift Assembler, luuqadeena cusub ayaa ku dhex jirta, laakiin waxaan u dooranay Haskell inay noqoto martigeliyaha halkii ay ka ahaan lahayd Fift, taas oo noo ogolaanaysa inaan si buuxda uga faa'iidaysano nidaamka nooca horumarsan. Markaad la shaqeyneyso qandaraasyo caqli-gal ah, halkaas oo kharashka xitaa qalad yar uu noqon karo mid aad u sarreeya, qorista static, fikraddayada, waa faa'iido weyn.

Si loo muujiyo waxa isku-duwaha TVM u eg ee ku dhex-jira Haskell, waxaanu ku hirgelinay boorsada caadiga ah. Waa kuwan dhowr waxyaalood oo ay tahay inaad fiiro gaar ah u yeelato:

  • Heshiiskani wuxuu ka kooban yahay hal shaqo, laakiin waxaad isticmaali kartaa inta aad rabto. Markaad qeexdo shaqo cusub oo ku jirta luqadda martida loo yahay (ie, Haskell), eDSL waxay kuu ogolaanaysaa inaad doorato inaad rabto inay noqoto mid joogto ah oo TVM ah ama si sahal ah loogu xidho goobta wacitaanka.
  • Sida Haskell, hawluhu waxay leeyihiin noocyo la hubiyay wakhtiga la ururiyay. eDSL-kayaga, nooca gelinta shaqadu waa nooca xidhmada ay shaqadu filayso, nooca natiijaduna waa nooca xidhmada la soo saari doono wicitaanka kadib.
  • Codku wuxuu leeyahay faa'iidooyin stacktype, oo sharxaya nooca raso la filayo ee barta wacitaanka. Qandaraaska jeebka asalka ah kuwani waxay ahaayeen faallooyin, laakiin eDSL-kayaga waxay dhab ahaantii qayb ka yihiin koodka waxaana la hubiyaa wakhtiga la ururinayo. Waxay u adeegi karaan sidii dukumeenti ama bayaan ka caawinaya horumariyaha inuu helo dhibaatada haddii koodku isbeddelo oo nooca xidhmooyinku isbeddelo. Dabcan, faallooyinka noocan oo kale ah ma saameeyaan waxqabadka runtime, maadaama aan koodka TVM loo soo saarin iyaga.
  • Kani wali waa tusaale ku qoran laba toddobaad gudahood, sidaas darteed waxaa weli harsan shaqo badan oo ku saabsan mashruuca. Tusaale ahaan, dhammaan xaaladaha fasallada aad ku aragto koodka hoose waa in si toos ah loo soo saaro.

Tani waa waxa hirgelinta jeebka multisig u eg eDSL-kayaga:

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

Koodhka isha buuxa ee eDSL-kayaga iyo qandaraaska jeebka saxeexyada badan ayaa laga heli karaa kaydkan. Iyo qaar kaloo badan ayaa si faahfaahsan loogu sheegay ku saabsan luqadaha la dhisay, saaxiibkay Georgy Agapov.

Gabagabada tartanka iyo TON

Wadar ahaan, shaqadeenu waxay qaadatay 380 saacadood (oo ay ku jiraan aqoonta dukumentiyada, shirarka iyo horumarka dhabta ah). Shan horumariye ayaa ka qayb qaatay mashruuca tartanka: CTO, hogaanka kooxda, khabiirada blockchain iyo horumariyayaasha software ee Haskell.

Waxaan helnay kheyraad si aan ugaqeybqaadno tartanka dhib la'aan, tan iyo ruuxa hackathon, shaqo kooxeed dhow, iyo baahida loo qabo in aan si dhakhso ah nafteena u galno dhinacyada tignoolajiyada cusub had iyo jeer waa mid xiiso leh. Dhowr habeen oo hurdo la'aan ah si loo gaaro natiijooyinka ugu badan ee xaaladaha kheyraadka xaddidan waxaa lagu magdhabaa khibrad qiimo leh iyo xusuus aad u wanaagsan. Intaa waxaa dheer, ka shaqeynta hawlaha noocan oo kale ah had iyo jeer waa tijaabo wanaagsan oo ku saabsan geeddi-socodka shirkadda, maadaama ay aad u adag tahay in la gaaro natiijooyin dhab ah oo hufan iyada oo aan si fiican u shaqeynin isdhexgalka gudaha.

Erayada gees ka gees: waxaan aad ula dhacay shaqada ay qabteen kooxda TON Waxay ku guuleysteen inay dhisaan nidaam adag, qurux badan, oo ugu muhiimsan, nidaam shaqo. TON waxay isku cadeeysay inay tahay madal leh karti weyn. Si kastaba ha ahaatee, si nidaamka deegaankani u horumaro, wax badan ayaa loo baahan yahay in la sameeyo, labadaba isticmaalka mashaariicda blockchain iyo horumarinta qalabka horumarinta. Waan ku hanweynahay in aan hadda qayb ka nahay hannaankan.

Haddii ka dib markaad akhrido maqaalkan aad wali hayso wax su'aalo ah ama aad hayso fikrado ku saabsan sida loo isticmaalo TON si loo xalliyo dhibaatooyinkaaga, noo qor - Waan ku farxi doonaa inaan wadaagno khibradeena.

Source: www.habr.com

Add a comment