Troi FunC yn FunCtional gyda Haskell: Sut enillodd Serokell Gystadleuaeth Blockchain Telegram

Mae'n debyg eich bod wedi clywed y Telegram hwnnw ar fin lansio platfform blockchain Ton. Ond efallai eich bod wedi colli'r newyddion nad oedd Telegram yn bell yn ôl cyhoeddi cystadleuaeth ar gyfer gweithredu un neu fwy o gontractau smart ar gyfer y platfform hwn.

Ni allai tîm Serokell, sydd â phrofiad helaeth o ddatblygu prosiectau blockchain mawr, sefyll o'r neilltu. Fe wnaethom ddirprwyo pum gweithiwr i'r gystadleuaeth, a phythefnos yn ddiweddarach daethant yn gyntaf ynddi o dan y llysenw ar hap (mewn) cymedrol Sexy Chameleon. Yn yr erthygl hon byddaf yn siarad am sut y gwnaethant hynny. Gobeithiwn y byddwch o leiaf yn darllen stori ddiddorol yn ystod y deng munud nesaf, ac ar y mwyaf y byddwch yn dod o hyd i rywbeth defnyddiol ynddi y gallwch ei gymhwyso yn eich gwaith.

Ond gadewch i ni ddechrau gydag ychydig o gyd-destun.

Cystadleuaeth a'i hamodau

Felly, prif dasgau'r cyfranogwyr oedd gweithredu un neu fwy o'r contractau smart arfaethedig, yn ogystal â gwneud cynigion i wella ecosystem TON. Cynhaliwyd y gystadleuaeth rhwng Medi 24 a Hydref 15, a dim ond ar Dachwedd 15 y cyhoeddwyd y canlyniadau. Amser eithaf hir, o ystyried bod Telegram wedi llwyddo yn ystod y cyfnod hwn i gynnal a chyhoeddi canlyniadau cystadlaethau ar ddylunio a datblygu cymwysiadau yn C ++ ar gyfer profi ac asesu ansawdd galwadau VoIP yn Telegram.

Fe wnaethom ddewis dau gontract smart o'r rhestr a gynigiwyd gan y trefnwyr. Ar gyfer un ohonynt, fe wnaethom ddefnyddio offer a ddosbarthwyd gyda TON, a gweithredwyd yr ail mewn iaith newydd a ddatblygwyd gan ein peirianwyr yn benodol ar gyfer TON ac a adeiladwyd yn Haskell.

Nid yw'r dewis o iaith raglennu swyddogaethol yn ddamweiniol. Yn ein blog corfforaethol Rydyn ni'n aml yn siarad am pam rydyn ni'n meddwl bod cymhlethdod ieithoedd swyddogaethol yn or-ddweud enfawr a pham rydyn ni'n gyffredinol yn ffafrio rhai sy'n canolbwyntio ar wrthrychau. Gyda llaw, mae hefyd yn cynnwys gwreiddiol o'r erthygl hon.

Pam wnaethon ni hyd yn oed benderfynu cymryd rhan?

Yn fyr, oherwydd bod ein harbenigedd yn brosiectau ansafonol a chymhleth sy'n gofyn am sgiliau arbennig ac sydd yn aml o werth gwyddonol i'r gymuned TG. Rydym yn cefnogi datblygiad ffynhonnell agored yn gryf ac yn ymwneud â'i boblogeiddio, a hefyd yn cydweithredu â phrifysgolion Rwsia blaenllaw ym maes cyfrifiadureg a mathemateg.

Roedd tasgau diddorol y gystadleuaeth a chymryd rhan yn ein prosiect Telegram annwyl ynddynt eu hunain yn gymhelliant rhagorol, ond daeth y gronfa wobrau yn gymhelliant ychwanegol. 🙂

ymchwil blockchain TON

Rydym yn monitro datblygiadau newydd mewn cadwyni bloc, deallusrwydd artiffisial a dysgu peirianyddol yn agos ac yn ceisio peidio â cholli un datganiad arwyddocaol ym mhob un o'r meysydd rydym yn gweithio ynddynt. Felly, erbyn i’r gystadleuaeth ddechrau, roedd ein tîm eisoes yn gyfarwydd â syniadau gan papur gwyn TON. Fodd bynnag, cyn dechrau gweithio gyda TON, ni wnaethom ddadansoddi'r ddogfennaeth dechnegol a chod ffynhonnell gwirioneddol y platfform, felly roedd y cam cyntaf yn eithaf amlwg - astudiaeth drylwyr o'r ddogfennaeth swyddogol ar Ar-lein a storfeydd prosiect.

Erbyn i'r gystadleuaeth ddechrau, roedd y cod eisoes wedi'i gyhoeddi, felly er mwyn arbed amser, fe benderfynon ni chwilio am ganllaw neu grynodeb a ysgrifennwyd gan defnyddwyr. Yn anffodus, ni roddodd hyn unrhyw ganlyniadau - ar wahân i gyfarwyddiadau ar gyfer cydosod y platfform ar Ubuntu, ni wnaethom ddod o hyd i unrhyw ddeunyddiau eraill.

Roedd y ddogfennaeth ei hun wedi'i hymchwilio'n dda, ond roedd yn anodd ei darllen mewn rhai meysydd. Yn aml iawn roedd yn rhaid i ni ddychwelyd at rai pwyntiau a newid o ddisgrifiadau lefel uchel o syniadau haniaethol i fanylion gweithredu lefel isel.

Byddai'n haws pe na bai'r fanyleb yn cynnwys disgrifiad manwl o'r gweithredu o gwbl. Mae gwybodaeth am sut mae peiriant rhithwir yn cynrychioli ei bentwr yn fwy tebygol o dynnu sylw datblygwyr sy'n creu contractau smart ar gyfer y platfform TON nag i'w helpu.

Nix: rhoi'r prosiect at ei gilydd

Yn Serokell rydyn ni'n gefnogwyr mawr Nix. Rydym yn casglu ein prosiectau ag ef ac yn eu defnyddio gan ddefnyddio NixOps, a gosod ar ein holl weinyddion Nix OS. Diolch i hyn, mae ein holl adeiladau yn atgynhyrchadwy ac yn gweithio ar unrhyw system weithredu y gellir gosod Nix arni.

Felly dechreuon ni trwy greu Troshaen Nix gyda mynegiant ar gyfer cynulliad TON. Gyda'i help, mae llunio TON mor syml â phosibl:

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

Sylwch nad oes angen i chi osod unrhyw ddibyniaethau. Bydd Nix yn gwneud popeth i chi yn hudol, p'un a ydych chi'n defnyddio NixOS, Ubuntu, neu macOS.

Rhaglennu ar gyfer TON

Mae'r cod contract smart yn y Rhwydwaith TON yn rhedeg ar y TON Virtual Machine (TVM). Mae TVM yn fwy cymhleth na'r rhan fwyaf o beiriannau rhithwir eraill, ac mae ganddo ymarferoldeb diddorol iawn, er enghraifft, gall weithio gydag ef parhad и dolenni i ddata.

Ar ben hynny, creodd y bechgyn o TON dair iaith raglennu newydd:

Pumed yn iaith raglennu pentwr cyffredinol sy'n debyg allan. Ei allu gwych yw'r gallu i ryngweithio â TVM.

HwylC yn iaith raglennu contract smart sy'n debyg i C ac wedi ei chrynhoi i iaith arall — Fift Assembler.

Pumed Cynullydd — Pumed llyfrgell ar gyfer cynhyrchu cod gweithredadwy deuaidd ar gyfer TVM. Nid oes gan Fifth Assembler gasglwr. hwn Iaith Parth Penodol wedi'i Gwreiddio (eDSL).

Mae ein cystadleuaeth yn gweithio

Yn olaf, mae'n bryd edrych ar ganlyniadau ein hymdrechion.

Sianel dalu asyncronig

Mae sianel dalu yn gontract smart sy'n caniatáu i ddau ddefnyddiwr anfon taliadau y tu allan i'r blockchain. O ganlyniad, rydych chi'n arbed arian nid yn unig (nid oes comisiwn), ond hefyd amser (nid oes rhaid i chi aros i'r bloc nesaf gael ei brosesu). Gall taliadau fod mor fach ag y dymunir ac mor aml ag sy'n ofynnol. Yn yr achos hwn, nid oes rhaid i'r partïon ymddiried yn ei gilydd, gan fod tegwch y setliad terfynol yn cael ei warantu gan y contract smart.

Daethom o hyd i ateb eithaf syml i'r broblem. Gall dau barti gyfnewid negeseuon wedi'u llofnodi, pob un yn cynnwys dau rif - y swm llawn a dalwyd gan bob parti. Mae'r ddau rif hyn yn gweithio fel cloc fector mewn systemau dosbarthedig traddodiadol a gosod y gorchymyn "digwyddodd o'r blaen" ar drafodion. Gan ddefnyddio'r data hwn, bydd y contract yn gallu datrys unrhyw wrthdaro posibl.

Mewn gwirionedd, mae un rhif yn ddigon i weithredu'r syniad hwn, ond fe adawon ni'r ddau oherwydd fel hyn gallem wneud rhyngwyneb defnyddiwr mwy cyfleus. Yn ogystal, penderfynom gynnwys swm y taliad ym mhob neges. Hebddo, os collir y neges am ryw reswm, yna, er y bydd yr holl symiau a'r cyfrifiad terfynol yn gywir, efallai na fydd y defnyddiwr yn sylwi ar y golled.

I brofi ein syniad, fe wnaethom edrych am enghreifftiau o ddefnyddio protocol sianel dalu mor syml a chryno. Yn syndod, dim ond dau a welsom:

  1. Disgrifiad dull tebyg, dim ond yn achos sianel un cyfeiriad.
  2. Tiwtorial, sy'n disgrifio'r un syniad â ni, ond heb esbonio llawer o fanylion pwysig, megis cywirdeb cyffredinol a gweithdrefnau datrys gwrthdaro.

Daeth yn amlwg ei bod yn gwneud synnwyr i ddisgrifio ein protocol yn fanwl, gan roi sylw arbennig i'w gywirdeb. Ar ôl sawl iteriad, roedd y fanyleb yn barod, a nawr gallwch chi hefyd. edrych arni.

Gweithredwyd y contract gennym yn FunC, ac fe wnaethom ysgrifennu'r cyfleustodau llinell orchymyn ar gyfer rhyngweithio â'n contract yn gyfan gwbl yn Fift, fel yr argymhellwyd gan y trefnwyr. Gallem fod wedi dewis unrhyw iaith arall ar gyfer ein CLI, ond roedd gennym ddiddordeb mewn rhoi cynnig ar Ffit i weld sut roedd yn perfformio yn ymarferol.

I fod yn onest, ar ôl gweithio gyda Fift, ni welsom unrhyw resymau cymhellol dros ffafrio'r iaith hon nag ieithoedd poblogaidd a ddefnyddir yn weithredol gydag offer a llyfrgelloedd datblygedig. Mae rhaglennu mewn iaith sy'n seiliedig ar stac yn eithaf annymunol, gan fod yn rhaid i chi gadw yn eich pen yn gyson yr hyn sydd ar y pentwr, ac nid yw'r casglwr yn helpu gyda hyn.

Felly, yn ein barn ni, yr unig gyfiawnhad dros fodolaeth Fift yw ei rôl fel iaith letyol i Fift Assembler. Ond oni fyddai'n well gwreiddio'r cyfosodwr TVM mewn rhyw iaith sy'n bodoli eisoes, yn hytrach na dyfeisio un newydd at yr unig ddiben hwn yn ei hanfod?

TVM Haskell eDSL

Nawr mae'n bryd siarad am ein hail gontract smart. Fe wnaethom benderfynu datblygu waled aml-lofnod, ond byddai ysgrifennu contract smart arall yn FunC yn rhy ddiflas. Roedden ni eisiau ychwanegu ychydig o flas, a dyna oedd ein hiaith ymgynnull ein hunain ar gyfer TVM.

Fel Fift Assembler, mae ein hiaith newydd wedi'i gwreiddio, ond fe wnaethom ddewis Haskell fel y gwesteiwr yn lle Fift, gan ganiatáu inni fanteisio'n llawn ar ei system math datblygedig. Wrth weithio gyda chontractau smart, lle gall cost hyd yn oed gwall bach fod yn uchel iawn, mae teipio statig, yn ein barn ni, yn fantais fawr.

Er mwyn dangos sut olwg sydd ar gydosodwr TVM wedi'i wreiddio yn Haskell, fe wnaethom weithredu waled safonol arno. Dyma ychydig o bethau i roi sylw iddynt:

  • Mae'r contract hwn yn cynnwys un swyddogaeth, ond gallwch ddefnyddio cymaint ag y dymunwch. Pan fyddwch chi'n diffinio swyddogaeth newydd yn yr iaith letyol (h.y. Haskell), mae ein eDSL yn caniatáu ichi ddewis a ydych chi am iddo ddod yn drefn ar wahân yn TVM neu wedi'i leinio'n syml ar y pwynt galw.
  • Fel Haskell, mae gan swyddogaethau fathau sy'n cael eu gwirio ar amser llunio. Yn ein eDSL, math mewnbwn swyddogaeth yw'r math o stac y mae'r swyddogaeth yn ei ddisgwyl, a'r math canlyniad yw'r math o stac a fydd yn cael ei gynhyrchu ar ôl yr alwad.
  • Mae gan y cod anodiadau stacktype, gan ddisgrifio'r math pentwr disgwyliedig yn y pwynt galw. Yn y contract waled gwreiddiol dim ond sylwadau oedd y rhain, ond yn ein eDSL maent mewn gwirionedd yn rhan o'r cod ac yn cael eu gwirio ar amser llunio. Gallant wasanaethu fel dogfennaeth neu ddatganiadau sy'n helpu'r datblygwr i ddod o hyd i'r broblem os bydd y cod yn newid a'r math o stac yn newid. Wrth gwrs, nid yw anodiadau o'r fath yn effeithio ar berfformiad amser rhedeg, gan nad oes cod TVM yn cael ei gynhyrchu ar eu cyfer.
  • Mae hwn yn dal i fod yn brototeip a ysgrifennwyd mewn pythefnos, felly mae llawer o waith i'w wneud o hyd ar y prosiect. Er enghraifft, dylai pob enghraifft o'r dosbarthiadau a welwch yn y cod isod gael eu cynhyrchu'n awtomatig.

Dyma sut olwg sydd ar weithredu waled multisig ar ein 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

Gellir dod o hyd i god ffynhonnell llawn ein eDSL a chontract waled aml-lofnod yn yr ystorfa hon. A mwy wedi ei hadrodd yn fanwl am ieithoedd adeiledig, ein cydweithiwr Georgy Agapov.

Casgliadau am y gystadleuaeth a TON

Cymerodd ein gwaith gyfanswm o 380 awr (gan gynnwys ymgyfarwyddo â dogfennaeth, cyfarfodydd a datblygiad gwirioneddol). Cymerodd pum datblygwr ran yn y prosiect cystadleuaeth: CTO, arweinydd tîm, arbenigwyr platfform blockchain a datblygwyr meddalwedd Haskell.

Daethom o hyd i adnoddau i gymryd rhan yn y gystadleuaeth heb anhawster, gan fod ysbryd hacathon, gwaith tîm agos, a'r angen i ymgolli'n gyflym mewn agweddau ar dechnolegau newydd bob amser yn gyffrous. Mae sawl noson ddi-gwsg i gyflawni'r canlyniadau mwyaf posibl mewn amodau o adnoddau cyfyngedig yn cael eu digolledu gan brofiad amhrisiadwy ac atgofion gwych. Yn ogystal, mae gweithio ar dasgau o'r fath bob amser yn brawf da o brosesau'r cwmni, gan ei bod yn anodd iawn cyflawni canlyniadau gwirioneddol weddus heb ryngweithio mewnol sy'n gweithredu'n dda.

Geiriau o'r neilltu: gwnaeth faint o waith a wnaed gan dîm TON argraff arnom. Llwyddasant i adeiladu system waith gymhleth, hardd, ac yn bwysicaf oll. Mae TON wedi dangos ei fod yn llwyfan gyda photensial mawr. Fodd bynnag, er mwyn i'r ecosystem hon ddatblygu, mae angen gwneud llawer mwy, o ran ei ddefnydd mewn prosiectau blockchain ac o ran gwella offer datblygu. Rydym bellach yn falch o fod yn rhan o’r broses hon.

Ar ôl darllen yr erthygl hon, os oes gennych unrhyw gwestiynau o hyd neu os oes gennych chi syniadau ar sut i ddefnyddio TON i ddatrys eich problemau, ysgrifennu atom - byddwn yn hapus i rannu ein profiad.

Ffynhonnell: hab.com

Ychwanegu sylw