Ke hoʻololi nei iā FunC i FunCtional me Haskell: Pehea i lanakila ai ʻo Serokell i ka hoʻokūkū Telegram Blockchain

Ua lohe paha ʻoe i kēlā Telegram kokoke e hoʻomaka i ka Ton blockchain anuu. Akā ua hala paha ʻoe i ka nūhou i hala ʻole ma Telegram hoʻolaha i kahi hoʻokūkū no ka hoʻokō ʻana i hoʻokahi a ʻoi aku paha nā ʻaelike akamai no kēia kahua.

ʻO ka hui Serokell, me ka ʻike nui i ka hoʻomohala ʻana i nā papahana blockchain nui, ʻaʻole hiki ke kū i waho. Ua hāʻawi mākou i ʻelima mau limahana i ka hoʻokūkū, a ʻelua pule ma hope mai ua loaʻa lākou i ka wahi mua ma lalo o ka inoa inoa haʻahaʻa haʻahaʻa Sexy Chameleon. Ma kēia ʻatikala e kamaʻilio wau e pili ana i kā lākou hana ʻana. Manaʻolana mākou i loko o nā minuke he ʻumi e hiki mai ana e heluhelu ʻoe i kahi moʻolelo hoihoi, a ʻo ka hapa nui loa e loaʻa iā ʻoe kahi mea pono i loko o ia mea hiki iā ʻoe ke hoʻohana i kāu hana.

Akā, e hoʻomaka kākou me kahi pōʻaiapili liʻiliʻi.

ʻO ka hoʻokūkū a me kona mau kūlana

No laila, ʻo nā hana nui o ka poʻe i komo, ʻo ia ka hoʻokō ʻana i hoʻokahi a ʻoi aku paha o nā ʻaelike akamai i manaʻo ʻia, a me ka hana ʻana i nā manaʻo e hoʻomaikaʻi i ka kaiaola TON. Ua holo ka hoʻokūkū mai ka lā 24 o Kepakemapa a i ka lā 15 o ʻOkakopa, a ma ka lā 15 o Nowemapa wale nō i hoʻolaha ʻia ai nā hopena. He manawa lōʻihi, e noʻonoʻo ana i kēia manawa ua hiki iā Telegram ke hoʻopaʻa a hoʻolaha i nā hopena o nā hoʻokūkū ma ka hoʻolālā a me ka hoʻomohala ʻana i nā noi ma C ++ no ka hoʻāʻo ʻana a me ka loiloi i ka maikaʻi o nā kelepona VoIP ma Telegram.

Ua koho mākou i ʻelua mau ʻaelike akamai mai ka papa inoa i manaʻo ʻia e nā mea hoʻonohonoho. No kekahi o lākou, ua hoʻohana mākou i nā mea hana i puʻunaue ʻia me TON, a ua hoʻokō ʻia ka lua ma kahi ʻōlelo hou i hoʻomohala ʻia e kā mākou poʻe ʻenekinia no TON a kūkulu ʻia i Haskell.

ʻAʻole hikiwawe ke koho ʻana i kahi ʻōlelo hoʻolālā hana. I loko o kā mākou blog hui Ke kamaʻilio pinepine nei mākou e pili ana i ke kumu e manaʻo ai mākou he mea hoʻonui nui ka paʻakikī o nā ʻōlelo hana a no ke aha mākou e makemake ai iā lākou i nā mea pili. Ma ke ala, aia pū kekahi kumu o kēia ʻatikala.

No ke aha mākou i hoʻoholo ai e komo?

I ka pōkole, no ka mea, ʻo kā mākou ʻoihana kūikawā he mau papahana maʻamau a paʻakikī e koi ana i nā mākau kūikawā a he pinepine ka waiwai ʻepekema i ke kaiāulu IT. Kākoʻo ikaika mākou i ka hoʻomohala ʻana i ka open-source a ke komo nei mākou i kāna popularization, a hui pū pū me ke alakaʻi ʻana i nā kula Lūkini ma ke kula o ka ʻepekema kamepiula a me ka makemakika.

ʻO nā hana hoihoi o ka hoʻokūkū a me ke komo ʻana i kā mākou papahana Telegram aloha i loko o lākou iho he kumu hoʻoikaika maikaʻi loa, akā ua lilo ka waihona kālā i mea hoʻoikaika hou. 🙂

TON blockchain noiʻi

Ke nānā pono nei mākou i nā mea hou i ka blockchain, artificial intelligence a me ke aʻo ʻana i ka mīkini a hoʻāʻo e haʻalele i kahi hoʻokuʻu koʻikoʻi ma kēlā me kēia wahi a mākou e hana ai. No laila, i ka wā i hoʻomaka ai ka hoʻokūkū, ua kamaʻāina mua kā mākou hui i nā manaʻo mai TON pepa keʻokeʻo. Eia nō naʻe, ma mua o ka hoʻomaka ʻana i ka hana me TON, ʻaʻole mākou i kālailai i ka palapala ʻenehana a me ke kumu kumu maoli o ka paepae, no laila ua maopopo loa ka hana mua - kahi noiʻi hohonu o ka palapala mana ma kahua pūnaewele a i hale waihona papahana.

I ka wā i hoʻomaka ai ka hoʻokūkū, ua paʻi mua ʻia ke code, no laila e mālama i ka manawa, ua hoʻoholo mākou e ʻimi i kahi alakaʻi a i ʻole ka hōʻuluʻulu manaʻo i kākau ʻia e e nā mea hoʻohana. ʻO ka mea pōʻino, ʻaʻole i hāʻawi i nā hopena - ma waho o nā ʻōlelo aʻoaʻo no ka hoʻohui ʻana i ka paepae ma Ubuntu, ʻaʻole mākou i ʻike i nā mea ʻē aʻe.

Ua noiʻi maikaʻi ʻia ka palapala ponoʻī, akā paʻakikī ka heluhelu ʻana ma kekahi mau wahi. Pono mākou e hoʻi i kekahi mau wahi a hoʻololi mai nā wehewehe kiʻekiʻe o nā manaʻo abstract i nā kikoʻī hoʻokō haʻahaʻa.

E maʻalahi inā ʻaʻole i hoʻokomo ʻia ka wehewehe kikoʻī o ka hoʻokō ʻana. ʻO ka ʻike e pili ana i ke ʻano o ka mīkini virtual e hōʻike ana i kāna puʻupuʻu e hoʻohuli i nā mea hoʻomohala e hana ana i nā ʻaelike akamai no ka platform TON ma mua o ke kōkua ʻana iā lākou.

Nix: hoʻohui i ka papahana

Ma Serokel he poʻe pā nui mākou ʻO Nix. E hōʻiliʻili mākou i kā mākou papahana me ia a kau iā lākou me ka hoʻohana ʻana NixOps, a kau ʻia ma kā mākou mau kikowaena āpau Nix OS. Mahalo i kēia, hiki ke hana hou ʻia kā mākou kūkulu ʻana a hana i kekahi ʻōnaehana hana i hiki ke hoʻokomo iā Nix.

No laila hoʻomaka mākou ma ka hana ʻana Nix overlay me ka ʻōlelo no ka hui TON. Me kāna kōkua, ʻo ka hōʻuluʻulu ʻana i ka TON maʻalahi e like me ka hiki:

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

E hoʻomaopopo ʻaʻole pono ʻoe e hoʻokomo i nā mea hilinaʻi. E hana ʻo Nix i nā mea āpau no ʻoe, inā ʻoe e hoʻohana nei iā NixOS, Ubuntu, a i ʻole macOS.

Papahana no TON

E holo ana ke code aelike akamai ma ka TON Network ma ka TON Virtual Machine (TVM). ʻOi aku ka paʻakikī o TVM ma mua o ka nui o nā mīkini virtual ʻē aʻe, a he hana hoihoi loa, no ka laʻana, hiki ke hana pū me hoʻomau и nā loulou i ka ʻikepili.

Eia kekahi, ua hana nā kāne mai TON i ʻekolu mau ʻōlelo papahana hou:

ʻElima he ʻōlelo hoʻonohonoho hoʻopaʻa honua e like Kekahi. ʻO kāna mākaukau nui ka hiki ke launa pū me TVM.

LeʻaleʻaC he ʻōlelo hoʻolālā ʻaelike akamai e like me C a ua hōʻuluʻulu ʻia i kahi ʻōlelo ʻē aʻe - Fift Assembler.

Huina Elima — ʻElima waihona no ka hana ʻana i nā code binary executable no TVM. ʻAʻohe mea hōʻuluʻulu ʻo Fifth Assembler. ʻO kēia ʻŌlelo Kūikawā i hoʻokomo ʻia (eDSL).

Ke hana nei kā mākou hoʻokūkū

ʻO ka hope, ʻo ka manawa kēia e nānā i nā hopena o kā mākou hoʻoikaika ʻana.

Alanui uku ʻaʻohe

ʻO ke kahawai uku he ʻaelike akamai e hiki ai i nā mea hoʻohana ʻelua ke hoʻouna i nā uku ma waho o ka blockchain. ʻO ka hopena, ʻaʻole ʻoe e mālama i ke kālā wale nō (ʻaʻohe komisina), akā ʻo ka manawa pū kekahi (ʻaʻole pono ʻoe e kali no ka hana ʻana o ka poloka aʻe). Hiki ke liʻiliʻi nā uku e like me ka makemake a me ka manawa e pono ai. I kēia hihia, ʻaʻole pono nā ʻaoʻao e hilinaʻi kekahi i kekahi, no ka mea, ua hōʻoia ʻia ka pono o ka hoʻoholo hope e ka ʻaelike akamai.

Ua loaʻa iā mākou kahi hopena maʻalahi i ka pilikia. Hiki i nā ʻaoʻao ʻelua ke hoʻololi i nā memo i hoʻopaʻa ʻia, aia i kēlā me kēia me ʻelua mau helu—ʻo ka huina piha i uku ʻia e kēlā me kēia ʻaoʻao. Hana like kēia mau helu ʻelua uaki vector i nā ʻōnaehana puʻunaue kuʻuna a hoʻonohonoho i ke kauoha "hana mua" ma nā kālepa. Ke hoʻohana nei i kēia ʻikepili, hiki i ka ʻaelike ke hoʻoholo i nā paio hiki.

ʻOiaʻiʻo, lawa ka helu hoʻokahi no ka hoʻokō ʻana i kēia manaʻo, akā haʻalele mākou i nā mea ʻelua no kēia ala hiki iā mākou ke hana i kahi mea hoʻohana maʻalahi. Eia hou, ua hoʻoholo mākou e hoʻokomo i ka nui o ka uku i kēlā me kēia memo. Inā ʻaʻole ia, inā nalowale ka memo no kekahi kumu, a laila, ʻoiai e pololei nā helu āpau a me ka helu hope, ʻaʻole ʻike ka mea hoʻohana i ka nalowale.

No ka hoʻāʻo ʻana i ko mākou manaʻo, ʻimi mākou i nā hiʻohiʻona o ka hoʻohana ʻana i kahi protocol channel uku maʻalahi a pōkole. ʻO ka mea kupanaha, ʻelua wale nō i loaʻa iā mākou:

  1. hōʻikeʻano he ala like, no ka hihia o kahi kanal unidirectional.
  2. Aʻoaʻo, e wehewehe ana i ka manaʻo like me ko mākou, akā me ka wehewehe ʻole ʻana i nā kikoʻī koʻikoʻi he nui, e like me ka pololei maʻamau a me nā kaʻina hana hoʻoholo hakakā.

Ua maopopo he mea kūpono ke wehewehe kikoʻī i kā mākou protocol, e nānā pono i kona pololei. Ma hope o kekahi mau mea hou, ua mākaukau ka ʻōlelo kikoʻī, a hiki iā ʻoe ke hiki. e nana aku iaia.

Ua hoʻokō mākou i ka ʻaelike ma FunC, a ua kākau mākou i ka pono laina kauoha no ka launa pū ʻana me kā mākou ʻaelike ma Fift holoʻokoʻa, e like me ka ʻōlelo a nā mea hoʻonohonoho. Hiki iā mākou ke koho i kekahi ʻōlelo ʻē aʻe no kā mākou CLI, akā makemake mākou i ka hoʻāʻo ʻana iā Fit e ʻike i ke ʻano o ia hana ma ka hoʻomaʻamaʻa.

ʻO kaʻoiaʻiʻo, ma hope o ka hana ʻana me Fift, ʻaʻole mākou i ʻike i nā kumu koʻikoʻi e makemake ai i kēia ʻōlelo i nā ʻōlelo kaulana a hoʻohana ikaika ʻia me nā mea hana a me nā hale waihona puke. ʻAʻole ʻoluʻolu ka hoʻonohonoho ʻana i kahi ʻōlelo hoʻopaʻa ʻia, no ka mea, pono ʻoe e mālama mau i kou poʻo i ka mea ma ka waihona, ʻaʻole kōkua ka mea hoʻopili i kēia.

No laila, i ko mākou manaʻo, ʻo ke kumu wale nō o ke ola ʻana o Fift, ʻo ia kāna kuleana ma ke ʻano he ʻōlelo hoʻokipa no Fift Assembler. Akā ʻaʻole anei ʻoi aku ka maikaʻi o ka hoʻokomo ʻana i ka mea hui TVM i kekahi ʻōlelo e kū nei, ma mua o ka hana ʻana i kahi ʻōlelo hou no kēia kumu hoʻokahi?

TVM Haskell eDSL

ʻO ka manawa kēia e kamaʻilio e pili ana i kā mākou ʻaelike akamai lua. Ua hoʻoholo mākou e hoʻomohala i kahi ʻeke kau inoa nui, akā ʻo ke kākau ʻana i kahi ʻaelike akamai ʻē aʻe ma FunC e luhi loa. Makemake mākou e hoʻohui i kahi ʻono, a ʻo ia kā mākou ʻōlelo hui ponoʻī no TVM.

E like me Fift Assembler, ua hoʻokomo ʻia kā mākou ʻōlelo hou, akā ua koho mākou iā Haskell i mea hoʻokipa ma mua o Fift, e ʻae iā mākou e hoʻohana pono i kāna ʻano ʻano ʻano holomua. I ka hana ʻana me nā ʻaelike akamai, kahi hiki ke kiʻekiʻe loa ke kumukūʻai o kahi hewa liʻiliʻi, ʻo ka paʻi paʻa ʻana, i ko mākou manaʻo, he pōmaikaʻi nui.

No ka hōʻike ʻana i ke ʻano o ka TVM assembler i hoʻopili ʻia ma Haskell, ua hoʻokomo mākou i kahi ʻeke maʻamau ma luna. Eia kekahi mau mea e makaʻala ai:

  • Hoʻokahi hana kēia ʻaelike, akā hiki iā ʻoe ke hoʻohana i nā mea a pau āu e makemake ai. Ke wehewehe ʻoe i kahi hana hou ma ka ʻōlelo hoʻokipa (ʻo ia hoʻi ʻo Haskell), ʻae kā mākou eDSL iā ʻoe e koho inā makemake ʻoe e lilo ia i hana maʻamau i ka TVM a i ʻole i hoʻopaʻa ʻia ma kahi o ke kelepona.
  • E like me Haskell, loaʻa nā ʻano hana i nānā ʻia i ka manawa hōʻuluʻulu. Ma kā mākou eDSL, ʻo ke ʻano hoʻokomo o kahi hana ke ʻano o ka waihona i manaʻo ʻia e ka hana, a ʻo ke ʻano hopena ke ʻano o ka waihona e hana ʻia ma hope o ke kelepona.
  • Loaʻa i ke code nā hōʻike stacktype, e wehewehe ana i ke ʻano hoʻopaʻa i manaʻo ʻia ma ka helu kelepona. Ma ka ʻaelike putele mua he mau ʻōlelo wale nō kēia, akā i loko o kā mākou eDSL he ʻāpana maoli lākou o ke code a nānā ʻia i ka manawa hōʻuluʻulu. Hiki iā lākou ke lawelawe ma ke ʻano he palapala a i ʻole nā ​​ʻōlelo e kōkua i ka mea hoʻomohala e ʻike i ka pilikia inā hoʻololi ke code a hoʻololi ke ʻano hoʻopaʻa. ʻO kaʻoiaʻiʻo, ʻaʻole pili ia mau hōʻike i ka hana runtime, no ka mea, ʻaʻohe code TVM i hana ʻia no lākou.
  • He prototype kēia i kākau ʻia i loko o ʻelua pule, no laila, nui nā hana e hana ʻia ma ka papahana. No ka la'ana, pono e hana 'akomi 'ia na mea a pau o na papa au e ike ai ma ke code malalo.

ʻO kēia ke ʻano o ka hoʻokō ʻana i kahi ʻeke multisig ma kā mākou 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

Hiki ke loaʻa ke code kumu piha o kā mākou eDSL a me ka ʻaelike puʻuwai lehulehu ma keia waihona. A oi aku haʻi kikoʻī e pili ana i nā ʻōlelo i kūkulu ʻia, kā mākou hoa hana ʻo Georgy Agapov.

Nā hopena e pili ana i ka hoʻokūkū a me TON

Ma ka huina, ua lawe kā mākou hana i nā hola 380 (me ka hoʻomaʻamaʻa ʻana me nā palapala, nā hālāwai a me ka hoʻomohala maoli). ʻElima mau mea hoʻomohala i komo i ka papahana hoʻokūkū: CTO, alakaʻi hui, blockchain platform specialists a me Haskell software developers.

Ua loaʻa iā mākou nā kumuwaiwai e komo ai i ka hoʻokūkū me ka pilikia ʻole, ʻoiai ʻo ka ʻuhane o ka hackathon, pili i ka hui pū, a me ka pono e hoʻokomo koke iā mākou iho i nā ʻano o nā ʻenehana hou. ʻO kekahi mau pō hiamoe ʻole e hoʻokō i nā hopena kiʻekiʻe i nā kūlana o nā kumu waiwai i uku ʻia e ka ʻike waiwai a me nā hoʻomanaʻo maikaʻi loa. Eia kekahi, ʻo ka hana ʻana i ia mau hana he hoʻāʻo maikaʻi loa ia o nā kaʻina hana o ka ʻoihana, no ka mea paʻakikī loa ka loaʻa ʻana o nā hopena kūpono maoli me ka ʻole o ka hana maikaʻi ʻana o ka pilina kūloko.

Hoʻokaʻawale ʻia nā mele: mahalo mākou i ka nui o nā hana i kau ʻia e ka hui TON. Ua hiki iā lākou ke kūkulu i kahi ʻōnaehana paʻakikī, nani, a ʻo ka mea nui loa. Ua hōʻoia ʻo TON iā ia iho he kahua me ka mana nui. Eia naʻe, i mea e ulu ai kēia kaiaola, nui nā mea e pono ai ke hana, ma ke ʻano o kona hoʻohana ʻana i nā papahana blockchain a me ka hoʻomaikaʻi ʻana i nā mea hana hoʻomohala. Haʻaheo mākou i ke komo ʻana i kēia hana.

Inā ma hope o ka heluhelu ʻana i kēia ʻatikala he mau nīnau kāu a he manaʻo paha e pili ana i ka hoʻohana ʻana iā TON e hoʻoponopono i kou mau pilikia, e palapala mai ia makou - e hauʻoli mākou e kaʻana like i kā mākou ʻike.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka