Hloov FunC rau FunCtional nrog Haskell: Yuav Ua Li Cas Serokell yeej qhov kev sib tw Telegram Blockchain

Tej zaum koj twb hnov ​​tias Telegram tab tom yuav tso tawm Ton blockchain platform. Tab sis tej zaum koj yuav tsis nco cov xov xwm uas tsis ntev dhau los Telegram tshaj tawm kev sib tw rau kev siv ib lossis ntau daim ntawv cog lus ntse rau lub platform no.

Pab pawg Serokell, nrog kev paub dhau los hauv kev tsim cov phiaj xwm blockchain loj, tsis tuaj yeem sawv ib sab. Peb tau xa tsib tus neeg ua haujlwm rau kev sib tw, thiab ob lub lis piam tom qab ntawd lawv tau ua thawj qhov chaw hauv nws hauv qab (hauv) lub npe hu ua Sexy Chameleon. Hauv tsab xov xwm no kuv yuav tham txog seb lawv tau ua li cas. Peb cia siab tias nyob rau hauv kaum feeb tom ntej no koj yuav tsawg kawg nyeem ib zaj dab neeg nthuav, thiab feem ntau koj yuav pom tej yam muaj txiaj ntsig hauv nws uas koj tuaj yeem siv hauv koj txoj haujlwm.

Tab sis cia peb pib nrog me ntsis ntsiab lus.

Kev sib tw thiab nws cov xwm txheej

Yog li, lub luag haujlwm tseem ceeb ntawm cov neeg tuaj koom yog kev siv ib lossis ntau dua ntawm cov ntawv cog lus ntse, nrog rau kev tshaj tawm los txhim kho TON ecosystem. Kev sib tw khiav txij lub Cuaj Hlis 24 txog Lub Kaum Hli 15, thiab cov txiaj ntsig tau tshaj tawm tsuas yog rau lub Kaum Ib Hlis 15. Lub sijhawm ntev heev, txiav txim siab tias lub sijhawm no Telegram tau tswj hwm thiab tshaj tawm cov txiaj ntsig ntawm kev sib tw ntawm kev tsim thiab tsim cov ntawv thov hauv C ++ rau kev sim thiab ntsuas qhov zoo ntawm VoIP hu hauv Telegram.

Peb tau xaiv ob daim ntawv cog lus ntse los ntawm cov npe uas tau hais los ntawm cov koom haum. Rau ib qho ntawm lawv, peb siv cov cuab yeej faib nrog TON, thiab qhov thib ob tau siv los ua hom lus tshiab tsim los ntawm peb cov engineers tshwj xeeb rau TON thiab ua rau Haskell.

Qhov kev xaiv ntawm ib hom lus programming tsis yog yuam kev. Hauv peb koom blog Peb feem ntau tham txog vim li cas peb xav tias qhov nyuaj ntawm cov lus ua haujlwm yog ib qho kev nthuav dav loj thiab vim li cas peb feem ntau nyiam lawv rau cov lus taw qhia. Los ntawm txoj kev, nws kuj muaj thawj ntawm kab lus no.

Vim li cas peb txawm txiav txim siab koom nrog?

Nyob rau hauv luv luv, vim hais tias peb tshwj xeeb yog tsis yog-tus qauv thiab complex tej yaam num uas yuav tsum tau tshwj xeeb kev txawj ntse thiab feem ntau muaj nuj nqis scientific rau IT zej zog. Peb txhawb nqa kev qhib qhov kev loj hlob thiab koom nrog nws cov neeg nyiam, thiab tseem koom tes nrog cov thawj coj hauv tebchaws Lavxias hauv kev tshawb fawb hauv computer thiab lej.

Cov haujlwm nthuav dav ntawm kev sib tw thiab kev koom tes hauv peb txoj haujlwm Telegram yog nyob rau hauv lawv tus kheej qhov kev txhawb siab zoo, tab sis cov khoom plig tau dhau los ua qhov kev txhawb siab ntxiv. πŸ™‚

TON blockchain tshawb fawb

Peb ua tib zoo saib xyuas cov kev tsim kho tshiab hauv blockchain, kev txawj ntse txawj ntse thiab kev kawm tshuab thiab sim tsis txhob nco ib qho kev tso tawm tseem ceeb hauv txhua qhov chaw uas peb ua haujlwm. Yog li ntawd, thaum lub sij hawm kev sib tw pib, peb pab neeg twb paub txog cov tswv yim los ntawm TON daim ntawv dawb. Txawm li cas los xij, ua ntej pib ua haujlwm nrog TON, peb tsis tau txheeb xyuas cov ntaub ntawv thev naus laus zis thiab cov cai ntawm lub platform, yog li thawj kauj ruam tau pom tseeb - kev kawm paub meej ntawm cov ntaub ntawv raug cai ntawm qhov chaw thiab nyob rau hauv qhov project repositories.

Thaum lub sij hawm kev sib tw pib, cov cai twb tau luam tawm lawm, yog li kom txuag lub sij hawm, peb txiav txim siab mus nrhiav cov lus qhia lossis cov ntsiab lus sau los ntawm los ntawm cov neeg siv. Hmoov tsis zoo, qhov no tsis tau muab cov txiaj ntsig - sib nrug los ntawm cov lus qhia rau kev sib sau lub platform ntawm Ubuntu, peb tsis pom lwm cov ntaub ntawv.

Cov ntaub ntawv nws tus kheej tau tshawb fawb zoo, tab sis nyuaj nyeem hauv qee qhov chaw. Feem ntau peb yuav tsum rov qab mus rau qee cov ntsiab lus thiab hloov los ntawm cov lus piav qhia theem siab ntawm cov tswv yim paub daws teeb meem mus rau cov ntsiab lus qis rau kev siv.

Nws yuav yooj yim dua yog tias qhov kev qhia tshwj xeeb tsis suav nrog cov lus piav qhia ntxaws txog kev siv txhua. Cov ntaub ntawv hais txog yuav ua li cas lub tshuab virtual sawv cev rau nws pawg ntau dua yuav cuam tshuam cov neeg tsim khoom tsim cov ntawv cog lus ntse rau TON platform dua li pab lawv.

Nix: muab qhov project ua ke

Ntawm Serokell peb yog cov kiv cua loj nix ib. Peb sau peb cov haujlwm nrog nws thiab xa lawv siv NixOps, thiab ntsia rau ntawm peb cov servers Nix OS. Ua tsaug rau qhov no, tag nrho peb cov kev tsim yog rov tsim dua thiab ua haujlwm ntawm txhua qhov kev khiav haujlwm uas Nix tuaj yeem ntsia tau.

Yog li peb pib los ntawm kev tsim Nix overlay nrog kev qhia rau TON sib dhos. Nrog nws cov kev pab, sau TON yog qhov yooj yim li sai tau:

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

Nco ntsoov tias koj tsis tas yuav nruab ib qho kev vam khom. Nix yuav ua txhua yam zoo rau koj, txawm tias koj siv NixOS, Ubuntu, lossis macOS.

Programming rau TON

Daim ntawv cog lus ntse code hauv TON Network khiav ntawm TON Virtual Machine (TVM). TVM yog qhov nyuaj dua li lwm lub tshuab virtual, thiab muaj kev ua haujlwm zoo heev, piv txwv li, nws tuaj yeem ua haujlwm nrog txuas ntxiv ΠΈ txuas rau cov ntaub ntawv.

Ntxiv mus, cov hais mav los ntawm TON tsim peb hom lus tshiab:

Tsib yog universal stack programming lus uas zoo li Tsim nyog. Nws lub peev xwm super yog lub peev xwm los cuam tshuam nrog TVM.

FunC yog ib daim ntawv cog lus ntse programming lus uas zoo ib yam li C thiab muab tso ua ke ua lwm hom lus - Fift Assembler.

Fifth Assembler - Tsib lub tsev qiv ntawv rau tsim binary executable code rau TVM. Fifth Assembler tsis muaj ib tug compiler. Qhov no Embedded Domain Specific Language (eDSL).

Peb qhov kev sib tw ua haujlwm

Thaum kawg, nws yog lub sijhawm los saib cov txiaj ntsig ntawm peb cov kev siv zog.

Asynchronous kev them nyiaj channel

Kev them nyiaj channel yog daim ntawv cog lus ntse uas tso cai rau ob tus neeg siv xa nyiaj tawm sab nraud ntawm blockchain. Raws li qhov tshwm sim, koj txuag tsis tau nyiaj xwb (tsis muaj nyiaj them poob haujlwm), tab sis kuj muaj sijhawm (koj tsis tas yuav tos rau qhov block tom ntej kom ua tiav). Kev them nyiaj tuaj yeem ua me me raws li qhov xav tau thiab ntau npaum li qhov xav tau. Nyob rau hauv rooj plaub no, ob tog tsis tas yuav tsum ntseeg ib leeg, txij li qhov kev ncaj ncees ntawm kev sib haum xeeb zaum kawg yog lav los ntawm daim ntawv cog lus ntse.

Peb nrhiav tau ib txoj kev yooj yim haum rau qhov teeb meem. Ob tog tuaj yeem pauv cov lus kos npe, txhua tus muaj ob tus lej - tag nrho cov nyiaj them los ntawm txhua tog. Ob tus lej no ua haujlwm zoo li vector moos nyob rau hauv ib txwm faib tshuab thiab teeb tsa "tshwm sim ua ntej" kev txiav txim ntawm kev lag luam. Siv cov ntaub ntawv no, daim ntawv cog lus yuav tuaj yeem daws txhua qhov teeb meem tshwm sim.

Qhov tseeb, ib tus lej txaus los siv lub tswv yim no, tab sis peb tawm ob qho tib si vim tias txoj kev no peb tuaj yeem ua kom yooj yim rau cov neeg siv interface. Tsis tas li ntawd, peb txiav txim siab muab cov nyiaj them poob haujlwm hauv txhua cov lus. Yog tsis muaj nws, yog tias cov lus ploj vim qee yam, tom qab ntawd, txawm tias tag nrho cov nyiaj thiab qhov kawg suav yuav raug, tus neeg siv yuav tsis pom qhov poob.

Txhawm rau kuaj peb lub tswv yim, peb tau saib cov piv txwv ntawm kev siv cov txheej txheem them nyiaj yooj yim thiab yooj yim. Kuj ceeb tias, peb pom tsuas yog ob qho:

  1. piav qhia ib txoj kev zoo sib xws, tsuas yog rau rooj plaub ntawm unidirectional channel.
  2. Kev qhia, uas piav txog tib lub tswv yim zoo li peb, tab sis tsis tau piav qhia ntau yam tseem ceeb, xws li kev ua kom raug dav dav thiab cov txheej txheem daws teeb meem.

Nws tau pom tseeb tias nws ua rau kev nkag siab los piav txog peb cov txheej txheem kom ntxaws, ua tib zoo saib xyuas nws qhov raug. Tom qab ob peb iterations, cov lus qhia tau npaj txhij, thiab tam sim no koj tuaj yeem ua tau. saib nws.

Peb tau ua raws li daim ntawv cog lus hauv FunC, thiab peb tau sau cov kab lus hais kom ua haujlwm rau kev cuam tshuam nrog peb daim ntawv cog lus tag nrho hauv Fift, raws li kev pom zoo los ntawm cov koom haum. Peb tuaj yeem xaiv lwm hom lus rau peb CLI, tab sis peb xav sim Fit kom pom tias nws ua tau li cas hauv kev xyaum.

Yuav kom ncaj ncees, tom qab ua hauj lwm nrog Fift, peb tsis pom ib qho laj thawj uas yuav nyiam cov lus no rau cov lus nrov thiab nquag siv nrog cov cuab yeej tsim thiab cov tsev qiv ntawv. Programming nyob rau hauv ib pawg-raws li lus yog heev tsis kaj siab, vim hais tias koj yuav tsum tas li nyob rau hauv koj lub taub hau dab tsi nyob rau hauv pawg, thiab lub compiler tsis pab nrog qhov no.

Yog li ntawd, nyob rau hauv peb lub tswv yim, tsuas yog kev ncaj ncees rau lub hav zoov ntawm Fift yog nws lub luag hauj lwm raws li ib tug tswv tsev lus rau Fift Assembler. Tab sis tsis yog nws yuav zoo dua rau embed TVM assembler rau hauv qee yam lus uas twb muaj lawm, es tsis tsim ib qho tshiab rau qhov tseem ceeb ntawm lub hom phiaj no?

TVM Haskell eDSL

Tam sim no nws yog lub sijhawm los tham txog peb daim ntawv cog lus ntse thib ob. Peb txiav txim siab los tsim ib lub hnab nyiaj ntau kos npe, tab sis sau lwm daim ntawv cog lus ntse hauv FunC yuav tho txawv dhau. Peb xav ntxiv qee qhov tsw, thiab qhov ntawd yog peb cov lus sib dhos rau TVM.

Zoo li Fift Assembler, peb cov lus tshiab tau kos, tab sis peb xaiv Haskell ua tus tswv tsev es tsis txhob Fift, tso cai rau peb ua kom zoo dua ntawm nws cov txheej txheem siab heev. Thaum ua haujlwm nrog cov ntawv cog lus ntse, qhov twg tus nqi ntawm txawm tias qhov yuam kev me me tuaj yeem siab heev, kev ntaus ntawv zoo li qub, hauv peb lub tswv yim, yog qhov txiaj ntsig loj.

Txhawm rau ua kom pom tias TVM assembler zoo li kos rau hauv Haskell, peb tau siv lub hnab nyiaj tus qauv rau nws. Nov yog ob peb yam uas yuav tsum tau saib xyuas:

  • Daim ntawv cog lus no muaj ib txoj haujlwm, tab sis koj tuaj yeem siv ntau npaum li koj nyiam. Thaum koj txhais cov haujlwm tshiab hauv cov lus tswv (piv txwv li Haskell), peb eDSL tso cai rau koj xaiv seb koj xav kom nws los ua ib txoj haujlwm cais hauv TVM lossis tsuas yog inlined ntawm qhov chaw hu.
  • Zoo li Haskell, kev ua haujlwm muaj hom uas tau kuaj xyuas thaum suav sijhawm. Nyob rau hauv peb eDSL, hom input ntawm ib tug muaj nuj nqi yog hom pawg uas muaj nuj nqi xav tau, thiab cov txiaj ntsig hom yog hom pawg uas yuav raug tsim tom qab hu.
  • Cov cai muaj cov lus piav qhia stacktype, piav qhia txog qhov xav tau pawg ntawm qhov chaw hu. Hauv daim ntawv cog lus thawj lub hnab nyiaj no tsuas yog cov lus pom, tab sis hauv peb eDSL lawv yeej yog ib feem ntawm cov cai thiab raug kuaj xyuas ntawm lub sijhawm sib sau. Lawv tuaj yeem ua cov ntaub ntawv lossis cov nqe lus uas pab tus tsim tawm pom qhov teeb meem yog tias cov cai hloov pauv thiab cov pawg hloov pauv. Tau kawg, cov lus piav qhia no tsis cuam tshuam rau kev ua haujlwm ntawm lub sijhawm ua haujlwm, txij li tsis muaj TVM code tsim rau lawv.
  • Qhov no tseem yog tus qauv sau hauv ob lub lis piam, yog li tseem muaj ntau txoj haujlwm yuav tsum tau ua ntawm qhov project. Piv txwv li, tag nrho cov piv txwv ntawm cov chav kawm koj pom nyob rau hauv cov cai hauv qab no yuav tsum tau generated txiav.

Nov yog qhov kev siv ntawm lub hnab nyiaj multisig zoo li ntawm peb eDSL:

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

Daim ntawv qhia tag nrho ntawm peb eDSL thiab daim ntawv cog lus ntau lub hnab nyiaj tuaj yeem pom ntawm qhov chaw khaws cia. Thiab ntxiv hais kom ntxaws hais txog cov lus tsim, peb cov npoj yaig Georgy Agapov.

Cov lus xaus txog kev sib tw thiab TON

Hauv tag nrho, peb txoj haujlwm tau siv sijhawm 380 teev (nrog rau kev paub txog cov ntaub ntawv, kev sib tham thiab kev txhim kho tiag tiag). Tsib tus tsim tawm tau koom nrog hauv txoj haujlwm sib tw: CTO, pab pawg thawj coj, cov kws tshaj lij blockchain platform thiab Haskell software tsim tawm.

Peb pom cov peev txheej los koom nrog hauv kev sib tw yam tsis muaj kev nyuaj, txij li lub siab ntawm hackathon, kev sib koom ua ke ze, thiab kev xav tau sai sai rau peb tus kheej hauv cov txheej txheem ntawm cov thev naus laus zis tshiab yog ib txwm zoo siab. Ob peb hmo pw tsaug zog kom ua tiav qhov txiaj ntsig siab tshaj plaws hauv cov xwm txheej ntawm cov peev txheej tsawg tau them nyiaj los ntawm kev paub tsis muaj nuj nqis thiab nco zoo heev. Tsis tas li ntawd, kev ua haujlwm ntawm cov haujlwm no yog ib qho kev sim zoo ntawm lub tuam txhab cov txheej txheem, vim nws nyuaj heev kom ua tiav cov txiaj ntsig zoo tiag tiag yam tsis muaj kev ua haujlwm zoo hauv kev sib raug zoo.

Lyrics ib sab: peb tau txais kev qhuas los ntawm kev ua haujlwm los ntawm TON pab pawg. Lawv tau tswj kom tsim kom muaj kev sib tw, zoo nkauj, thiab qhov tseem ceeb tshaj plaws, kev ua haujlwm. TON tau ua pov thawj nws tus kheej los ua lub platform nrog lub peev xwm zoo. Txawm li cas los xij, txhawm rau txhim kho qhov ecosystem no, yuav tsum tau ua ntau ntxiv, ob qho tib si ntawm nws txoj kev siv hauv blockchain tej yaam num thiab hais txog kev txhim kho cov cuab yeej tsim kho. Peb txaus siab rau tam sim no yog ib feem ntawm cov txheej txheem no.

Yog tias tom qab nyeem tsab xov xwm no koj tseem muaj lus nug lossis muaj tswv yim yuav ua li cas siv TON los daws koj cov teeb meem, sau ntawv rau peb - Peb yuav zoo siab los qhia peb qhov kev paub.

Tau qhov twg los: www.hab.com

Ntxiv ib saib