Te huri i te FunC ki te FunCtional me Haskell: Me pehea te wikitoria a Serokell i te Whakataetae Poraka Poraka Telegram

Kua rongo pea koe ki taua Telegram kei te tata ki te whakarewa i te turanga poraka Ton. Engari kua ngaro pea koe i nga korero kaore ano i mua ko Telegram i whakapuakina he whakataetae mo te whakatinanatanga o tetahi, neke atu ranei o nga kirimana atamai mo tenei turanga.

Ko te roopu Serokell, he nui nga wheako ki te whakawhanake i nga kaupapa poraka nui, kaore i taea te tu ki tahaki. I tukuna e matou nga kaimahi tokorima ki te whakataetae, a e rua wiki i muri mai ka eke ratou ki te tuunga tuatahi i raro i te (i roto i) ingoa īngoa kore noa Sexy Chameleon. I roto i tenei tuhinga ka korero ahau mo te pehea i mahia ai e ratou. Te ti'aturi nei matou i roto i nga meneti tekau e whai ake nei ka panui koe i tetahi korero whakamere, i te nuinga ka kitea e koe he mea whai hua ki roto ka taea e koe te tono i roto i to mahi.

Engari me timata tatou ki tetahi horopaki iti.

Te whakataetae me ona tikanga

Na, ko nga mahi matua a nga kaiuru ko te whakatinanatanga o tetahi, neke atu ranei o nga kirimana atamai e whakaarohia ana, me te whakatakoto whakaaro hei whakapai ake i te rauwiringa kaiao TON. I timata te whakataetae mai i te 24 o Hepetema ki te 15 o Whiringa-a-nuku, a, no te 15 o Whiringa-a-rangi anake i panuitia nga hua. He wa roa, i te whakaaro i tenei wa i whakahaere a Telegram ki te pupuri me te whakapuaki i nga hua o nga whakataetae mo te hoahoa me te whakawhanaketanga o nga tono i roto i te C ++ mo te whakamatautau me te aromatawai i te kounga o nga waea VoIP i Telegram.

I tohua e matou nga kirimana atamai e rua mai i te rarangi i tohua e nga kaiwhakarite. Mo tetahi o ratou, i whakamahia e matou nga taputapu kua tohatohahia me te TON, a ko te tuarua i whakatinanahia i roto i te reo hou i whakawhanakehia e o maatau miihini mo TON me te hanga ki Haskell.

Ko te kowhiringa o te reo hotaka mahi ehara i te mea ohorere. I roto i to tatou rangitaki umanga He maha nga wa e korero ana matou he aha ta matou whakaaro ko te uaua o nga reo mahi he tino whakanuia me te aha e pai ake ai taatau ki nga reo kaupapa. Ma te ara, kei roto ano hoki taketake o tenei tuhinga.

He aha matou i whakatau ai ki te whai waahi?

I te poto, na te mea ko to maatau motuhake he kaupapa kore-paerewa me nga kaupapa uaua e hiahia ana ki nga pukenga motuhake, he maha nga wa e whai hua ana ki te hapori IT. E kaha tautoko ana matou i te whanaketanga puna tuwhera me te whai waahi ki tana rongonui, me te mahi tahi me nga whare wananga rangatira o Ruhia i roto i nga mahi rorohiko me te pangarau.

Ko nga mahi whakamere o te whakataetae me te whai waahi ki ta maatau kaupapa Telegram e arohaina ana i roto i a raatau ano he tino hihiri, engari ko te putea taonga he mea whakatenatena. 🙂

rangahau poraka TON

Ka aro turuki maatau i nga whanaketanga hou i roto i te poraka, te matauranga hangai me te ako miihini me te ngana kia kaua e ngaro tetahi tuku nui ki ia waahi e mahi ana matou. No reira, i te wa i timata ai te whakataetae, kua waia kee to matou kapa ki nga whakaaro mai TON pepa ma. Heoi, i mua i te tiimata o te mahi me te TON, kaore matou i te tātari i nga tuhinga hangarau me te waehere puna pono o te papaahi, na reira i tino kitea te taahiraa tuatahi - he rangahau tino o nga tuhinga whaimana i runga pae Tuhinga o mua whare pupuri kaupapa.

I te wa i timata ai te whakataetae, kua oti te whakaputa te waehere, no reira kia pai ai te wa, ka whakatau matou ki te rapu i tetahi aratohu, whakarāpopototanga ranei i tuhia e na nga kaiwhakamahi. Heoi, kaore i puta he hua - i tua atu i nga tohutohu mo te whakahiato i te papaahi i runga i te Ubuntu, kaore i kitea etahi atu rauemi.

Ko nga tuhinga ake i rangahaua pai, engari he uaua ki te panui i etahi waahi. I te nuinga o nga wa ka hoki matou ki etahi waahi ka huri mai i nga whakaahuatanga taumata teitei o nga whakaaro waitara ki nga taipitopito whakatinanatanga taumata iti.

He maamaa ake mena kaore i whakauruhia e te waahanga he whakaahuatanga mo te whakatinanatanga. Ko nga korero mo te ahua o te miihini mariko e whakaatu ana i tana puranga ka kaha ake te whakararu i nga kaiwhakawhanake ki te hanga kirimana atamai mo te papaaho TON i te awhina i a raatau.

Nix: te whakakotahi i te kaupapa

I Serokel he kaiwhaiwhai nui matou Nix. Ka kohia e maatau a maatau kaupapa me te tohatoha ma te whakamahi NixOps, ka whakauruhia ki runga i o maatau tūmau katoa Nix OS. He mihi ki tenei, ko o maatau hanga katoa ka taea te whakaputa me te mahi i runga i nga punaha whakahaere ka taea te whakauru i a Nix.

Na ka timata ma te hanga Whakakikoruatia a Nix me te korero mo te huihuinga TON. Ma tana awhina, he ngawari noa te whakahiato TON:

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

Kia mahara kaore koe e hiahia ki te whakauru i nga whakawhirinaki. Ka mahia e Nix nga mea katoa mo koe, ahakoa kei te whakamahi koe i a NixOS, Ubuntu, macOS ranei.

Papatonotanga mo TON

Ko te waehere kirimana atamai i roto i te Whatunga TON e rere ana i runga i te TON Virtual Machine (TVM). He uaua ake te TVM i te nuinga atu o nga miihini mariko, a he tino pai nga mahi, hei tauira, ka taea te mahi haere tonu и hononga ki raraunga.

I tua atu, ko nga taangata mai i TON i hanga e toru nga reo hootaka hou:

Rima he reo hootaka o te ao e rite ana Matawhaki. Ko tana tino kaha ko te kaha ki te mahi tahi me TVM.

AreareaC he reo whakamahere kirimana atamai e rite ana ki C ka whakaemihia ki tetahi atu reo - Fift Assembler.

Huihui Tuarima — E rima nga whare pukapuka mo te whakaputa waehere ka taea te whakahaere a-rua mo TVM. Ko te Fifth Assembler kare he kaikohi. Tenei Reo Tauwhāiti Rohe Tāmau (eDSL).

Ka mahi a maatau whakataetae

Ka mutu, kua tae ki te wa ki te titiro ki nga hua o a tatou mahi.

Hongere utu tukutahi

Ko te waahana utu he kirimana mohio e taea ai e nga kaiwhakamahi e rua te tuku utu i waho o te poraka. Ko te mutunga, kaore koe e penapena moni anake (kare he komihana), engari he wa ano (kaore koe e tatari mo te poraka e whai ake nei kia tukatukahia). Ko nga utu ka taea te iti ki te hiahia me nga wa e hiahiatia ana. I tenei keehi, kaore nga roopu e whakawhirinaki tetahi ki tetahi, na te mea ko te tika o te whakataunga whakamutunga ka whakamanahia e te kirimana atamai.

I kitea e matou he otinga tino ngawari ki te raru. Ka taea e nga roopu e rua te whakawhiti i nga karere kua hainatia, e rua nga nama kei roto—te moni katoa i utua e ia roopu. He rite enei tau e rua karaka vector i roto i nga punaha tohatoha tuku iho me te whakarite i te raupapa "i tupu i mua" mo nga whakawhitinga. Ma te whakamahi i enei raraunga, ka taea e te kirimana te whakatau i nga raruraru ka taea.

Inaa, kotahi noa te nama hei whakatinana i tenei whakaaro, engari i waiho e matou nga mea e rua na te mea ka taea e matou te hanga i tetahi atanga kaiwhakamahi pai ake. I tua atu, i whakatau matou ki te whakauru i te moni utu ki ia karere. Ki te kore, mena ka ngaro te karere mo etahi take, na, ahakoa ka tika nga moni katoa me te tatauranga whakamutunga, kaore pea te kaiwhakamahi e kite i te mate.

Hei whakamatautau i to maatau whakaaro, i rapua e matou he tauira mo te whakamahi i taua kawa hongere utu ngawari me te poto. He mea whakamiharo, e rua anake i kitea e matou:

  1. Whakaahuatanga he huarahi rite, mo te take o te hongere kotahi.
  2. Akoranga, e whakaatu ana i te whakaaro rite ki o maatau, engari me te kore e whakamaarama i te maha o nga korero nui, penei i te tika whanui me nga tikanga whakatau pakanga.

I tino marama he mea tika te whakamaarama i a maatau kawa, me te aro nui ki tona tika. Whai muri i te maha o nga whitiwhitinga, kua rite te whakaritenga, a inaianei ka taea ano e koe. titiro ki a ia.

I whakatinanahia e matou te kirimana ki FunC, a ka tuhia e matou te taputapu raina whakahau mo te taunekeneke me o maatau kirimana i roto i te rima, i runga i te tohutohu a nga kaiwhakahaere. Ka taea e matou te whiriwhiri i tetahi atu reo mo to matou CLI, engari i hiahia matou ki te whakamatau i a Fit kia kite i te ahuatanga o te mahi i roto i nga mahi.

Kia pono, i muri i te mahi tahi me te Fift, kaore matou i kite i nga take kaha ki te pai ki tenei reo ki nga reo rongonui me te kaha ki te whakamahi i nga taputapu me nga whare pukapuka. Ko te whakamaoritanga i roto i te reo e pa ana ki te taapu he tino kino, na te mea me pupuri tonu koe i roto i to mahunga i nga mea kei runga i te puranga, a kaore te kaitoi e awhina i tenei.

No reira, ki ta matou nei whakaaro, ko te tika anake mo te noho a Fift ko tana mahi hei reo manaaki mo Fift Assembler. Engari he pai ke ki te whakauru i te TVM assembler ki etahi reo o naianei, kaua ki te tito i tetahi reo hou mo tenei kaupapa anake?

TVM Haskell eDSL

Inaianei kua tae ki te korero mo ta maatau kirimana atamai tuarua. I whakatau matou ki te whakawhanake i tetahi putea waitohu-maha, engari ko te tuhi i tetahi atu kirimana atamai i FunC ka tino hoha. I pirangi matou ki te tapiri i etahi reka, a ko ta matou ake reo huihuinga mo TVM.

Pērā i te Fift Assembler, kua whakauruhia to tatou reo hou, engari i whiriwhiria e matou ko Haskell te kaihautu hei utu mo te Fift, ka taea e matou te whakamahi i tana punaha momo matatau. I te wa e mahi tahi ana me nga kirimana atamai, ko te utu mo te hapa iti ka nui rawa te utu, ko te tuhi pateko, ki ta matou whakaaro, he painga nui.

Hei whakaatu he aha te ahua o te Kaihanga TVM kua whakauruhia ki Haskell, i whakatinanahia e matou he putea paerewa ki runga. Anei etahi mea hei aro ki:

  • Ko tenei kirimana he mahi kotahi, engari ka taea e koe te whakamahi i nga mea e pai ana koe. Ina tautuhia e koe he mahi hou i roto i te reo kaihautu (arā, Haskell), ka taea e to maatau eDSL te whiriwhiri mehemea e hiahia ana koe kia noho hei mahinga motuhake i roto i te TVM, me te whakauru noa ranei i te waahi waea.
  • Pērā i a Haskell, he momo momo mahi ka tirohia i te wa whakahiato. I roto i to maatau eDSL, ko te momo whakauru o tetahi mahi ko te momo taaputanga e tumanakohia ana e te mahi, a ko te momo hua ko te momo puranga ka puta i muri i te waea.
  • Kei te waehere nga korero stacktype, e whakaahua ana i te momo puranga e tumanakohia ana i te waahi karanga. I roto i te kirimana putea taketake he korero noa enei, engari i roto i ta maatau eDSL he waahanga o te waehere ka tirohia i te waa whakahiato. Ka taea e ratou te mahi hei tuhinga, hei korero ranei hei awhina i te kaiwhakawhanake ki te rapu i te raru mena ka huri te waehere ka huri te momo puranga. Ae ra, kaore enei korero e pa ki nga mahi oma, na te mea kaore he waehere TVM i hangaia mo ratou.
  • He tauira tonu tenei i tuhia i roto i nga wiki e rua, no reira he nui tonu nga mahi hei mahi mo te kaupapa. Hei tauira, ko nga tauira katoa o nga karaehe ka kitea e koe i te waehere i raro nei me hanga aunoa.

Koinei te ahua o te whakatinanatanga o te putea multisig i runga i ta maatau 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

Ka kitea te katoa o te waehere puna o ta maatau eDSL me te kirimana putea maha-waitohu i tenei putunga. Me etahi atu korerotia taipitopito mo nga reo hanga-i roto, to matou hoa mahi a Georgy Agapov.

Nga whakatau mo te whakataetae me te TON

Huihui katoa, 380 haora te roa o a maatau mahi (tae atu ki te maarama ki nga tuhinga, hui me te whakawhanaketanga tonu). E rima nga kaiwhakawhanake i whai waahi ki te kaupapa whakataetae: CTO, te kaiarahi o te roopu, nga tohunga mo te papaaho poraka me nga kaihanga rorohiko Haskell.

I kitea e matou he rauemi hei uru atu ki te whakataetae me te kore uaua, na te mea ko te wairua o te hackathon, kati te mahi tahi, me te hiahia kia tere te ruku ki nga ahuatanga o nga hangarau hou he mea whakahihiri tonu. He maha nga po kore moe ki te whakatutuki i nga hua tino nui i roto i nga ahuatanga iti o nga rauemi ka utua e nga wheako tino nui me nga maharatanga pai. I tua atu, ko te mahi i nga mahi penei he whakamatautau pai mo nga mahi a te kamupene, na te mea he tino uaua ki te whakatutuki i nga hua tino tika me te kore e pai te mahi o roto.

Taha nga kupu: i miharo matou ki te nui o nga mahi a te roopu TON. I kaha ratou ki te hanga i tetahi punaha mahi uaua, ataahua, me te mea nui. Kua whakamatauhia e TON ko ia ano he papa me te kaha nui. Heoi, kia whanake ai tenei puunaha rauwiringa kaiao, he nui noa atu te mahi, mo te whakamahi i nga kaupapa poraka me te whakapai ake i nga taputapu whanaketanga. E whakahīhī ana mātou ināianei kua uru ki tēnei hātepe.

Mena i muri i to panui i tenei tuhinga kei a koe tonu etahi patai, he whakaaro ranei mo te whakamahi i te TON hei whakaoti i o raru, tuhia mai ki a matou — ka koa matou ki te whakapuaki i o maatau wheako.

Source: will.com

Tāpiri i te kōrero