Conversus funC in FunCtional cum Haskell: Quam Serokell vicit ad Telegram Blockchain Competition

Probabiliter audisti Telegram de launch Ton blockchain platform. Sed fortasse nuntium non pridem telegraphum exciderunt nuntiatum est competition ad exsequendam unum vel plures captiosos contractus pro hoc suggestu.

Turma Serokell, magna experientia in magnis impedimentis inceptis explicandis, secedere non potuit. Quinque conductos ad certamen delegavimus et duas septimanas postea primum locum in eo ceperunt sub cognomentum parum pudicum Sexy Chameleon. In hoc articulo quomodo fecerint loquar. Speramus in proximis decem minutis saltem fabulas annales legendas esse, et ad summum aliquid in ea utile invenies quod in opere tuo adhibere potes.

Sed a contextu paulo incipiamus.

Competition and its conditions

Praecipua igitur opera participantium exsecutionem unum vel plures ex contractibus captiosis propositis, necnon propositiones TON ecosystem emendandas. Certamen procurrit a die 24 Septembris ad 15 Octobris, et eventus tantum die 15 Novembris nuntiatus est. Satis diu, considerans Telegram hoc tempore tenere ac nuntiare eventus certaminum de consilio et progressu applicationum in C ++ ad probandum et perpendendum qualitatem VoIP vocat in Telegram.

Nos duos contractus callidi de elenchis ab auctoribus propositis delegimus. Una enim ex eis instrumenta cum TON distributa usi sumus, altera nova lingua a fabris nostris nominatim pro TON evoluta et in Haskell constructa est.

Electio linguae programmationis functionis non est accidentalis. In nobis corporatum blog Saepe loquimur cur implicationem linguarum functionis censemus ingens exaggeratio et cur eas plerumque anteponamus iis quae res ordinantur. Viam etiam continet originale huius articuli.

Cur nos etiam participare placet?

Denique, quod nostra specialitas non norma et multiplex est incepta quae speciales artes requirunt et saepe valoris scientifici ad IT communitatem pertinent. Vehementer evolutionem apertam-fontem sustinemus et in eius popularizatione versamur, ac etiam cooperamur cum primariis universitatibus Russorum in campo scientiae et mathematicae computatricis.

Praeclara opera certationis et implicationis apud dilectum nostrum Telegram propositum in seipsis optimum motivum fuerunt, sed praemium fiscus additus incitamentum factus est. πŸ™‚

TON blockchain investigationis

Novos progressiones in clausura, artificiosae intelligentiae et machinae eruditionem arctissime monentes et non desideramus unam notabilem remissionem in singulis locis in quibus laboramus. Ergo, tempore certationis incepit, turma nostra iam notis notionibus exstitit TON album charta. Sed antequam opus TON proficisceretur, documenta technica et ipsum principium codicis suggesti resolvere non potuimus, itaque primus gradus satis evidens fuit - pervestigationis documentorum officialium in website quod repositoria project.

Per tempus certationis incepit, codicem iam editum, ut tempus conservet, ducem vel epitomen scriptam quaerere decrevimus. per users. Infeliciter, hoc nullum eventum dedit - sine mandatis ut suggestum in Ubuntu conveniendi, alias materias non invenimus.

Documenta ipsa bene explorata erat, sed in nonnullis locis legere difficile erat. Saepius ad quaedam puncta redire debebamus et ex alto gradu descriptiones notionum abstractarum ad singula deducenda humiliora transire.

Facilius esset si nominatio accuratiorem exsecutionem omnino non comprehenderet. Informationes quomodo virtualis apparatus suum acervum repraesentat, magis verisimile est ad distrahendum tincidunt creandos captivos contractus pro suggestu TON quam adiuvando.

Nix: posito incepto

In Serokell sumus magnus fans nix. Incepta nostra cum eo colligimus et eas utendo explicamus NixOpset in omnibus servientibus nostris constitutus Nix OS. Propter hoc omnes aedificationes nostrae producibiles sunt et operantur in aliquo systemate operante in quo Nix institui potest.

Sic incepit a creando Nix deaurabis cum expressione pro TON ecclesia. Auxiliante TON componendo quam maxime simplex est;

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

Nota te non opus esse ut aliquas clientelas instituas. Nix tibi omnia facient, sive NixOS, Decuria, sive macOS uteris.

Programmatio ad TON

Dolor contractus code in TON Retis incurrit in TON Apparatus Virtualis (TVM). TVM implicatior est quam plurimae aliae machinis virtualis, ac valde interesting functionality, exempli gratia, operari potest continuationes ΠΈ Nexus ad notitia.

Insuper guys e TON tres novas linguas programmantes creaverunt;

Quintum est universalis BIBLIOTHECA programmandi linguam similem foras. Facultas eius super facultatem penitus TVM est.

FunC Est dolor programmandi contractus linguae quae similis est C et in aliam linguam compilata - Fift Assembler.

Quintus Assembler β€” Quinta bibliotheca ad binarium exsecutabile codicem generandum pro TVM. Quintus Congregator compilator non habet. Hoc Domain Imprimis Language (eDSL).

Nostra competition operatur

Tempus est denique eventus laboris nostri intueri.

Asynchronous pretium channel

Merces channel est dolor contractus qui duos users utentes extra impedimentum mittere praestationes concedit. Quam ob rem non modo pecuniam servas (nulla est commissio), sed etiam tempus (proximum scandalum non exspectandum est ut discursum). Liberationes tam parvae esse possunt quam desiderantur et quoties requiritur. In hoc casu, partes non se invicem confidere debent, cum aequitas finalis compositionis cauta stipulatione cavetur.

Invenimus solutionem problematis satis simplicem. Duae partes nuntiis signatis commutare possunt, in se binos numeros continentesβ€”plenam pecuniam ab unaquaque partium solvunt. Hi duo numeri operantur sicut vector horologium in institutis systematibus distribuit et ordinem in transactionibus "antequam" dedit. Hac data utens, contractus potest quamlibet pugnam possibilis solvere.

In facto, unus numerus sufficit ad hanc notionem efficiendam, sed relinquemus utrumque quia hoc modo commodiorem interfacem facere potuimus. Praeterea quantum in singulis nuntiis solutionem complecti decrevimus. Sine ea, si nuntius aliqua de causa amittitur, tum, licet omnia summa et calculus ultimus recte sit, utentis damnum animadvertere non potest.

Ad nostram ideam probandam, exempla quaesivimus utendi canalis protocollo tam simplicis quam pressae solutionis. Mire duo tantum invenimus;

  1. Description similis accessus, modo ad canalem unidirectionalem.
  2. Tutorialqui eandem notionem quam nostratem describit, sed non explicans multa et magna, ut communium rectitudinis et certaminis solutionis ratio.

Patuit quod sensum nostrum singillatim protocollum describere, sedulo ad eius rectitudinem attendere. Post aliquot iterationes, nominatio parata erat, nunc etiam potes. at illi.

Nos contractus in FunC implevimus et utilitatem lineam mandatum scripsimus ut interacting cum contractu nostro omnino in Fift, ut ab auctoribus commendatur. Linguam nostram aliam eligere potuimus pro CLI, sed quaerebamus idoneos videre quomodo in praxi perageretur.

Ut honesti essemus, cum Fift operati sumus, nullas rationes cogentes vidimus hanc linguam popularibus et naviter adhibitis instrumentis et bibliothecis amplificatis praeferre. Programma in lingua acervo fundata satis ingrata est, quia constanter in capite tuo servare debes quod in ACERVUS est, et hoc compilator non adiuvat.

Itaque, in nostra opinione, sola iustificatio pro exsistentia Fift est eius munus hospitii linguae pro Fift Assembler. Sed annon melius sit TVM coadunatorem in linguam aliquam exsistentem infigi, quam novam ob hoc essentialiter solum propositum excogitare?

TVM Haskell eDSL

Nunc tempus est loqui de secundo contractu captioso. Placuimus ut multi-signaturae crumenam evolverent, sed alium contractum callidior in FunC scribens nimis taediosum esset. Aliquid saporis addere voluimus, et quod erat nostra ecclesia in lingua TVM.

Sicut Fift Assembler, nova lingua nostra infixa est, sed Haskell exercitum loco Fift elegimus, nos permittentes utendi sui generis systematis provectis plene uteretur. Cum operando cum contractibus captiosis, ubi sumptus etiam parvi erroris altissimi esse possunt, typing statice, in opinione nostra, magnum commodum est.

Ad demonstrandum quid TVM coadunator in Haskell immersus similis apparet, vexillum crumenam in ea implevimus. Pauca hic attendere;

  • Hic contractus unius functionis consistit, sed quot voles uti potes. Cum novam functionem in lingua hospitis definias (i.e. Haskell), nostrum eDSL permittit eligere utrum vis in TVM separatum fieri an in puncto vocationis tantum inlineatum.
  • Sicut Haskell, functiones habent figuras quae tempore compilationis deprimuntur. In nostro eDSL, genus muneris initus est genus ACERVUS quem munus expectat, et effectus generis est genus ACERVUS qui post vocationem productus erit.
  • Codex habet annotationes stacktypetypum in vocationi puncto expectatum describens. In schedula originalis contractus hae tantum commentationes fuerunt, sed in nostro eDSL ipsae codicis parte sunt et tempore compilatae sedantur. Possunt documenta vel propositiones adiuvantes quaestionem invenire si signum mutationes et generis ACERVUS mutationes. Scilicet annotationes tales non sol- runtime perficiendi sunt, cum nullus TVM codice illis generatus sit.
  • Hoc exemplum adhuc in duabus septimanis scriptum est, ut adhuc multum laboris in re faciendum sit. Exempli gratia: omnes instantiae classes, quas in codice infra vides, automatice generandae sunt.

Hoc est quod multisig vidulum exsequendum videtur, sicut in nostro 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

Fons plenus codicis nostrae eDSL et multi- signaturae pera contractus inveniri potest repositio. Et plus narravit in speciali de constructis linguis collega noster Georgy Agapov.

Conclusiones de competition et TON

In summa, opus nostrum 380 horas suscepit (inclusa familiarizatione cum documentis, conventibus et progressu actuali). Quinque tincidunt interfuit in project activitatis: CTO, ipsum dolor, plumbum, blockchain diam elit, ac luctus tincidunt Haskell.

Invenimus facultates ad certamen sine difficultate participandum, quandoquidem spiritus hackathonis, arctis activitatis et necessitatis nos cito in novarum technologiarum aspectibus immergi semper excitat. Plures noctes insomnes ad maximos eventus obtinendos in condicionibus facultatum modicarum per inaestimabilem experientiam et praeclaram memoriam compensantur. Praeterea in talibus operibus semper bonum processuum societatis probatum est, quia difficillimum est consequi vere honestos eventus sine interna commercio bene operando.

Lyrics enini: impressi sumus moles laboris ab TON quadrigis immissa. Curarunt aedificare complexum, pulchrum, ac potissimum ratio operandi. TON probavit se suggestum esse magna potentia. Attamen, ut haec oecosystematis ratio enucleetur, multo magis opus est fieri, tum secundum usum in clausulis inceptis et secundum instrumenta evolutionis melioris. Superbi sumus nunc partem huius processus.

Si, cum hunc articulum legeres, adhuc quaestiones habes vel ideas habes in quo utaris TON ad solvendas tuas quaestiones, scribere nobis β€” beati erimus experti participes.

Source: www.habr.com