A’ tionndadh FunC gu FunCtional le Haskell: Mar a bhuannaich Serokell Farpais Blockchain Telegram

Is dòcha gu bheil thu air an Telegram sin a chluinntinn an impis an àrd-ùrlar Ton blockchain a chuir air bhog. Ach is dòcha gu robh thu air na naidheachdan nach deach Telegram a chall o chionn fhada farpais ainmeachadh airson aon chùmhnant snasail no barrachd a chuir an gnìomh airson an àrd-ùrlar seo.

Cha b’ urrainn don sgioba Serokell, le eòlas farsaing ann a bhith a’ leasachadh phròiseactan mòra blockchain, seasamh gu aon taobh. Thug sinn còignear luchd-obrach don cho-fharpais, agus dà sheachdain às deidh sin ghabh iad a’ chiad àite ann fon fhar-ainm air thuaiream (ann) Sexy Chameleon. San artaigil seo bruidhnidh mi mu mar a rinn iad e. Tha sinn an dòchas anns na deich mionaidean a tha romhainn gun leugh thu co-dhiù sgeulachd inntinneach, agus aig a’ char as motha gheibh thu rudeigin feumail ann a dh’fhaodas tu a chuir a-steach nad obair.

Ach tòisichidh sinn le beagan co-theacsa.

Farpais agus a chumhachan

Mar sin, b’ e prìomh ghnìomhan nan com-pàirtichean buileachadh aon no barrachd de na cùmhnantan snasail a chaidh a mholadh, a bharrachd air molaidhean a dhèanamh gus eag-shiostam TON a leasachadh. Bha an fharpais a’ ruith bho 24 Sultain gu 15 Dàmhair, agus cha deach na toraidhean ainmeachadh ach air 15 Samhain. Gu math fada, leis gu bheil Telegram air a bhith comasach aig an àm seo air toraidhean farpaisean a chumail agus ainmeachadh air dealbhadh agus leasachadh thagraidhean ann an C ++ airson deuchainn agus measadh càileachd gairmean VoIP ann an Telegram.

Thagh sinn dà chùmhnant snasail bhon liosta a mhol an luchd-eagrachaidh. Airson aon dhiubh, chleachd sinn innealan air an cuairteachadh le TON, agus chaidh an dàrna fear a chuir an gnìomh ann an cànan ùr a chaidh a leasachadh leis na h-innleadairean againn gu sònraichte airson TON agus a chaidh a thogail a-steach do Haskell.

Chan eil roghainn cànan prògramadh gnìomh gun fhiosta. Anns an blog corporra Bidh sinn gu tric a’ bruidhinn air carson a tha sinn den bheachd gu bheil iom-fhillteachd chànanan gnìomh na àibheiseachadh mòr agus carson as fheàrr leinn san fharsaingeachd iad na feadhainn a tha ag amas air nithean. Air an t-slighe, tha e cuideachd a 'gabhail a-steach tùsail den artaigil seo.

Carson a cho-dhùin sinn eadhon pàirt a ghabhail?

Ann an ùine ghoirid, leis gu bheil an speisealachadh againn mar phròiseactan neo-àbhaisteach agus iom-fhillte a dh’ fheumas sgilean sònraichte agus a tha gu tric de luach saidheansail don choimhearsnachd IT. Tha sinn gu làidir a’ toirt taic do leasachadh stòr fosgailte agus tha sinn an sàs ann a bhith mòr-chòrdte, agus bidh sinn cuideachd a’ co-obrachadh le prìomh oilthighean Ruiseanach ann an raon saidheans coimpiutair agus matamataig.

Bha gnìomhan inntinneach na farpais agus an sàs anns a’ phròiseact Telegram againn annta fhèin nan deagh bhrosnachadh, ach thàinig a’ mhaoin duais gu bhith na bhrosnachadh a bharrachd. 🙂

Rannsachadh blockchain TON

Bidh sinn a’ cumail sùil gheur air leasachaidhean ùra ann an blockchain, inntleachd fuadain agus ionnsachadh innealan agus a’ feuchainn gun a bhith ag ionndrainn aon fhoillseachadh cudromach anns gach raon sa bheil sinn ag obair. Mar sin, mus do thòisich an fharpais, bha an sgioba againn eòlach mu thràth air beachdan bho TON pàipear geal. Ach, mus do thòisich sinn ag obair le TON, cha do rinn sinn mion-sgrùdadh air na sgrìobhainnean teicnigeach agus fìor chòd stòr an àrd-ùrlar, agus mar sin bha a’ chiad cheum gu math follaiseach - sgrùdadh mionaideach air na sgrìobhainnean oifigeil air làrach agus a-staigh stòran pròiseict.

Mun àm a thòisich an fharpais, bha an còd air fhoillseachadh mu thràth, agus mar sin gus ùine a shàbhaladh, chuir sinn romhainn coimhead airson stiùireadh no geàrr-chunntas air a sgrìobhadh le le luchd-cleachdaidh. Gu mì-fhortanach, cha tug seo toradh sam bith - a bharrachd air stiùireadh airson an àrd-ùrlar a chuir ri chèile air Ubuntu, cha do lorg sinn stuthan sam bith eile.

Bha na sgrìobhainnean fhèin air an deagh rannsachadh, ach bha e doirbh a leughadh ann an cuid de raointean. Gu math tric bha againn ri tilleadh gu puingean sònraichte agus atharrachadh bho thuairisgeulan àrd-ìre de bheachdan eas-chruthach gu mion-fhiosrachadh buileachaidh aig ìre ìosal.

Bhiodh e na b’ fhasa mura biodh tuairisgeul mionaideach air a’ bhuileachadh idir anns an t-sònrachadh. Tha fiosrachadh mu mar a tha inneal brìgheil a’ riochdachadh a chruach nas dualtaiche luchd-leasachaidh a tharraing a’ cruthachadh cùmhnantan snasail airson àrd-ùrlar TON na bhith gan cuideachadh.

Nix: a 'cur a' phròiseict ri chèile

Aig Serokell tha sinn nar luchd-leantainn mòr nix. Bidh sinn a’ cruinneachadh ar pròiseactan leis agus gan cleachdadh a’ cleachdadh NixOps, agus air a chuir a-steach air na frithealaichean againn uile Nix OS. Taing dha seo, tha na togalaichean againn uile air an ath-riochdachadh agus ag obair air siostam obrachaidh sam bith air an urrainnear Nix a chuir a-steach.

Mar sin thòisich sinn le bhith a’ cruthachadh Ath-chòmhdach Nix le faireachdainn airson co-chruinneachadh TON. Le cuideachadh, tha e cho sìmplidh 's as urrainn dhut TON a chur ri chèile:

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

Thoir an aire nach fheum thu eisimeileachd sam bith a stàladh. Nì Nix a h-uile càil dhut gu draoidheil, ge bith a bheil thu a’ cleachdadh NixOS, Ubuntu, no macOS.

Prògramachadh airson TON

Tha an còd cùmhnant snasail ann an Lìonra TON a’ ruith air an TON Virtual Machine (TVM). Tha TVM nas iom-fhillte na a’ mhòr-chuid de dh’ innealan brìgheil eile, agus tha comas-gnìomh gu math inntinneach aige, mar eisimpleir, faodaidh e obrachadh leis leantainneachd и ceanglaichean gu dàta.

A bharrachd air an sin, chruthaich na balaich bho TON trì cànanan prògramaidh ùra:

Còigeamh na chànan prògramadh stac uile-choitcheann a tha coltach Foirthe. Is e an sàr chomas aige an comas eadar-obrachadh le TVM.

FunC na chànan prògramadh cùmhnant snasail a tha coltach ri C agus tha e air a chur ri chèile ann an cànan eile - Fift Assembler.

An còigeamh fear-cruinneachaidh - Còigeamh leabharlann airson còd gnìomh dà-chànanach a ghineadh airson TVM. Chan eil inneal-cruinneachaidh aig Fifth Assembler. Seo Cànan Sònraichte Àrainn Leabaichte (eDSL).

Bidh ar farpais ag obair

Mu dheireadh, tha an t-àm ann coimhead air toraidhean ar n-oidhirpean.

Sianal pàighidh asyncronach

Is e cùmhnant snasail a th’ ann an sianal pàighidh a leigeas le dà neach-cleachdaidh pàighidhean a chuir taobh a-muigh an blockchain. Mar thoradh air an sin, bidh thu a ’sàbhaladh chan e a-mhàin airgead (chan eil coimisean ann), ach cuideachd ùine (chan fheum thu feitheamh gus an ath bhloc a phròiseasadh). Faodaidh pàighidhean a bhith cho beag 'sa tha iad ag iarraidh agus cho tric' sa tha feum air. Anns a 'chùis seo, chan fheum na pàrtaidhean earbsa a bhith ann an càch a chèile, oir tha cothromachd an tuineachaidh mu dheireadh air a ghealltainn leis a' chùmhnant snasail.

Lorg sinn fuasgladh gu math sìmplidh don duilgheadas. Faodaidh dà phàrtaidh teachdaireachdan soidhnichte iomlaid, gach fear le dà àireamh - an t-suim iomlan a phàigh gach pàrtaidh. Bidh an dà àireamh seo ag obair mar uaireadair vector ann an siostaman sgaoilte traidiseanta agus shuidhich iad an òrdugh “a thachair roimhe” air gnothaichean. A’ cleachdadh an dàta seo, bidh e comasach don chùmhnant còmhstri sam bith fhuasgladh.

Gu dearbh, tha aon àireamh gu leòr airson a 'bheachd seo a chur an gnìomh, ach dh' fhàg sinn an dà chuid oir mar seo b 'urrainn dhuinn eadar-aghaidh cleachdaiche nas goireasaiche a dhèanamh. A bharrachd air an sin, chuir sinn romhainn an t-suim pàighidh a thoirt a-steach do gach teachdaireachd. Às aonais, ma thèid an teachdaireachd a chall airson adhbhar air choireigin, an uairsin, ged a bhios na suimean uile agus an àireamhachadh deireannach ceart, is dòcha nach mothaich an neach-cleachdaidh an call.

Gus ar beachd a dhearbhadh, choimhead sinn airson eisimpleirean de bhith a’ cleachdadh protocol seanail pàighidh cho sìmplidh agus cho mionaideach. Gu h-iongantach, cha do lorg sinn ach dà:

  1. Tuairisgeul dòigh-obrach coltach ris, dìreach airson sianal aon-stiùiridh.
  2. Oideachadh, a tha a’ toirt cunntas air an aon bheachd ris an fhear againn, ach gun a bhith a’ mìneachadh mòran mion-fhiosrachaidhean cudromach, leithid ceartachd choitcheann agus modhan fuasglaidh còmhstri.

Dh'fhàs e soilleir gu bheil e ciallach cunntas mionaideach a thoirt air ar protocol, a’ toirt aire shònraichte do cheartachd. Às deidh grunn thursan, bha an sònrachadh deiseil, agus a-nis faodaidh tu cuideachd. seall oirre.

Chuir sinn an cùmhnant an gnìomh ann am FunC, agus sgrìobh sinn goireas na loidhne-àithne airson a bhith ag eadar-obrachadh leis a’ chùmhnant againn gu tur ann am Fift, mar a mhol an luchd-eagrachaidh. Dh’ fhaodadh sinn a bhith air cànan sam bith eile a thaghadh airson ar CLI, ach bha ùidh againn ann a bhith a’ feuchainn Fit gus faicinn mar a rinn e ann an cleachdadh.

Gus a bhith onarach, às deidh dhuinn a bhith ag obair le Fift, chan fhaca sinn adhbharan làidir airson a bhith nas fheàrr leis a’ chànan seo na cànanan mòr-chòrdte agus gnìomhach le innealan leasaichte agus leabharlannan. Tha prògramadh ann an cànan stèidhichte air stac gu math mì-thlachdmhor, oir feumaidh tu an-còmhnaidh na tha air a’ chruach a chumail nad cheann, agus chan eil an compiler a’ cuideachadh le seo.

Mar sin, nar beachd, is e an aon fhìreanachadh airson Fift a bhith ann a dhreuchd mar chànan aoigheachd airson Fift Assembler. Ach nach biodh e na b’ fheàrr an inneal-cruinneachaidh TVM fhighe a-steach do chànan a th’ ann mar-thà, seach cànan ùr a chruthachadh airson an aon adhbhar seo?

TVM Haskell eDSL

A-nis tha an t-àm ann bruidhinn mun dàrna cùmhnant snasail againn. Cho-dhùin sinn wallet ioma-ainm-sgrìobhte a leasachadh, ach bhiodh sgrìobhadh cùmhnant snasail eile ann am FunC ro thrang. Bha sinn airson beagan blas a chuir ris, agus b’ e sin ar cànan cruinneachaidh fhèin airson TVM.

Coltach ri Fift Assembler, tha ar cànan ùr freumhaichte, ach thagh sinn Haskell mar an aoigh an àite Fift, a’ toirt cothrom dhuinn làn bhuannachd a ghabhail den t-siostam seòrsa adhartach aige. Nuair a bhios tu ag obair le cùmhnantan snasail, far am faod cosgais eadhon mearachd bheag a bhith gu math àrd, tha clò-sgrìobhadh statach, nar beachd, na bhuannachd mhòr.

Gus sealltainn cò ris a tha assembler TVM coltach freumhaichte ann an Haskell, chuir sinn wallet àbhaisteach an gnìomh air. Seo beagan rudan airson aire a thoirt dhaibh:

  • Tha aon ghnìomh anns a’ chùmhnant seo, ach faodaidh tu nas urrainn dhut a chleachdadh. Nuair a mhìnicheas tu gnìomh ùr sa chànan aoigheachd (ie Haskell), leigidh an eDSL againn dhut taghadh a bheil thu airson gum bi e na chleachdadh air leth ann an TVM no dìreach air a lìnigeadh aig a’ phuing gairm.
  • Coltach ri Haskell, tha seòrsachan aig gnìomhan a thèid a sgrùdadh aig àm cruinneachaidh. Anns an eDSL againn, is e an seòrsa cuir a-steach gnìomh an seòrsa stac ris a bheil dùil aig a’ ghnìomh, agus is e an seòrsa toraidh an seòrsa stac a thèid a thoirt a-mach às deidh a ’ghairm.
  • Tha notaichean air a’ chòd stacktype, a’ toirt cunntas air an t-seòrsa stac ris a bheil dùil aig a’ phuing gairm. Anns a’ chùmhnant wallet tùsail b’ e dìreach beachdan a bh’ annta, ach anns an eDSL againn tha iad dha-rìribh mar phàirt den chòd agus thathas gan sgrùdadh aig àm cruinneachaidh. Faodaidh iad a bhith nan sgrìobhainnean no aithrisean a chuidicheas an leasaiche gus an duilgheadas a lorg ma dh’ atharraicheas an còd agus ma dh’ atharraicheas an seòrsa stac. Gu dearbh, chan eil na notaichean sin a’ toirt buaidh air coileanadh ùine ruith, leis nach eil còd TVM air a chruthachadh dhaibh.
  • Tha seo fhathast na prototype sgrìobhte ann an dà sheachdain, agus mar sin tha tòrr obair ri dhèanamh fhathast air a’ phròiseact. Mar eisimpleir, bu chòir a h-uile suidheachadh de na clasaichean a chì thu sa chòd gu h-ìosal a chruthachadh gu fèin-ghluasadach.

Seo mar a tha buileachadh wallet multisig coltach air an eDSL againn:

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

Gheibhear còd stòr iomlan ar eDSL agus cùmhnant wallet ioma-ainm-sgrìobhte aig an tasgaidh seo. Agus barrachd air innse gu mionaideach mu chànanan togte, ar co-obraiche Georgy Agapov.

Co-dhùnaidhean mun cho-fharpais agus TON

Uile gu lèir, thug ar n-obair 380 uair (a’ gabhail a-steach eòlas air sgrìobhainnean, coinneamhan agus fìor leasachadh). Ghabh còignear luchd-leasachaidh pàirt anns a’ phròiseact farpais: CTO, stiùir sgioba, eòlaichean àrd-ùrlar blockchain agus luchd-leasachaidh bathar-bog Haskell.

Lorg sinn goireasan airson pàirt a ghabhail san fharpais gun duilgheadas, leis gu bheil spiorad hackathon, obair-sgioba dlùth, agus an fheum air sinn fhèin a bhogadh gu sgiobalta ann an taobhan de theicneòlasan ùra an-còmhnaidh brosnachail. Tha grunn oidhcheannan gun chadal gus na toraidhean as àirde a choileanadh ann an suidheachaidhean de ghoireasan cuibhrichte air an dìoladh le eòlas luachmhor agus deagh chuimhneachain. A bharrachd air an sin, tha a bhith ag obair air na gnìomhan sin an-còmhnaidh na dheagh dheuchainn air pròiseasan na companaidh, leis gu bheil e air leth duilich toraidhean fìor mhath a choileanadh às aonais conaltradh a-staigh ag obair gu math.

Lyrics gu aon taobh: bha an obair a chuir sgioba TON air leth toilichte leinn. Chaidh aca air siostam obrachaidh iom-fhillte, brèagha, agus as cudromaiche, a thogail. Tha TON air dearbhadh gu bheil e na àrd-ùrlar le comas mòr. Ach, gus an tèid an eag-shiostam seo a leasachadh, feumar tòrr a bharrachd a dhèanamh, an dà chuid a thaobh a bhith ga chleachdadh ann am pròiseactan blockchain agus a thaobh leasachadh innealan leasachaidh. Tha sinn moiteil a bhith mar phàirt den phròiseas seo a-nis.

Ma tha ceist sam bith agad fhathast às deidh dhut an artaigil seo a leughadh no ma tha beachdan agad air mar a chleachdas tu TON gus na duilgheadasan agad fhuasgladh, sgrìobhadh thugainn - bidh sinn toilichte ar n-eòlas a cho-roinn.

Source: www.habr.com

Cuir beachd ann