Табдил додани FunC ба FunCtional бо Ҳаскелл: Чӣ гуна Серокелл дар озмуни Blockchain Telegram ғолиб шуд

Шумо эҳтимол ин Telegram-ро шунидаед дар арафаи ба кор андохтани платформаи blockchain Ton аст. Аммо шумо шояд хабареро, ки чанде пеш Telegram буд, пазмон шуда бошед конкурс эълон кард барои татбиқи як ё якчанд шартномаҳои интеллектуалӣ барои ин платформа.

Дастаи Серокелл, ки таҷрибаи ғанӣ дар таҳияи лоиҳаҳои бузурги blockchain дорад, натавонист дар канор биистад. Мо панҷ кормандро ба озмун вакил кардем ва пас аз ду ҳафта онҳо дар он бо лақаби тасодуфии Sexy Chameleon ҷои аввалро гирифтанд. Дар ин мақола ман дар бораи он ки чӣ тавр онҳо ин корро карданд. Умедворем, ки дар даҳ дақиқаи оянда шумо ақаллан як ҳикояи ҷолибро хонед ва ҳадди аксар дар он чизе муфид хоҳед ёфт, ки шумо метавонед дар кори худ истифода баред.

Аммо биёед бо контексти каме оғоз кунем.

Рақобат ва шартҳои он

Ҳамин тариқ, вазифаҳои асосии иштирокчиён татбиқи як ё якчанд шартномаҳои интеллектуалии пешниҳодшуда, инчунин пешниҳоди пешниҳодҳо оид ба беҳтар намудани экосистемаи TON буданд. Озмун аз 24-уми сентябр то 15-уми октябр давом кард ва натиҷааш танҳо 15-уми ноябр эълон шуд. Муддати тӯлонӣ бо назардошти он, ки дар ин муддат Telegram тавонист озмунҳо оид ба тарҳрезӣ ва таҳияи замимаҳо дар C++ барои санҷиш ва арзёбии сифати зангҳои VoIP дар Telegram баргузор ва эълон кунад.

Мо аз рӯйхате, ки ташкилкунандагон пешниҳод кардаанд, ду шартномаи оқилонаро интихоб кардем. Барои яке аз онҳо, мо асбобҳоеро истифода бурдем, ки бо TON тақсим карда шудаанд ва дуюмӣ бо забони наве, ки муҳандисони мо махсусан барои TON таҳия кардаанд ва дар Ҳаскелл сохта шудаанд, амалӣ карда шуданд.

Интихоби забони функсионалии барномасозӣ тасодуфӣ нест. Дар мо блоги корпоративӣ Мо аксар вақт дар бораи он сӯҳбат мекунем, ки чаро мураккабии забонҳои функсионалӣ муболиғаи бузург аст ва чаро мо онҳоро умуман аз забонҳои ба объект нигаронидашуда афзал медонем. Дар омади гап, он инчунин дорои аслии ин мақола.

Чаро мо ҳатто тасмим гирифтем, ки иштирок кунем?

Хулоса, зеро ихтисоси мо лоиҳаҳои ғайристандартӣ ва мураккабест, ки малакаҳои махсусро талаб мекунанд ва аксар вақт барои ҷомеаи IT арзиши илмӣ доранд. Мо рушди сарчашмаҳои кушодро сахт дастгирӣ мекунем ва ба оммавӣ кардани он машғулем ва инчунин бо донишгоҳҳои пешбари Русия дар соҳаи илмҳои компютерӣ ва математика ҳамкорӣ мекунем.

Супоришҳои ҷолиби озмун ва ҷалб дар лоиҳаи маҳбуби мо Telegram худ як ангезаи олӣ буданд, аммо фонди ҷоиза як ҳавасмандии иловагӣ гардид. 🙂

Тадқиқоти blockchain TON

Мо пешрафтҳои навро дар blockchain, зеҳни сунъӣ ва омӯзиши мошинсозӣ бодиққат назорат мекунем ва мекӯшем, ки як нашри муҳимро дар ҳар як соҳае, ки мо кор мекунем, аз даст надиҳем. Аз ин ру, то огози мусобика коллективи мо аллакай бо идеяхои аз ТОН когази сафед. Аммо, пеш аз оғози кор бо TON, мо ҳуҷҷатҳои техникӣ ва коди аслии платформаро таҳлил накардаем, аз ин рӯ қадами аввал комилан аён буд - омӯзиши ҳамаҷонибаи ҳуҷҷатҳои расмӣ дар бораи сомона ва дар анборҳои лоиҳа.

То оғози озмун, код аллакай нашр шуда буд, аз ин рӯ, барои сарфаи вақт мо тасмим гирифтем, ки роҳнамо ё хулосаеро, ки навиштааст, ҷустуҷӯ кунем. аз ҷониби истифодабарандагон. Мутаассифона, ин ягон натиҷа надод - ба ғайр аз дастурҳо оид ба васл кардани платформа дар Ubuntu, мо ягон маводи дигар пайдо накардем.

Худи ҳуҷҷатҳо хуб омӯхта шуда буд, аммо дар баъзе минтақаҳо хондан душвор буд. Аксар вақт ба мо лозим омад, ки ба нуктаҳои муайян баргардем ва аз тавсифи сатҳи баланди идеяҳои абстрактӣ ба ҷузъиёти татбиқи сатҳи паст гузарем.

Агар дар спецификация умуман тавсифи муфассали амалй нагардида бошад, осонтар мебуд. Маълумот дар бораи он, ки мошини маҷозӣ стеки худро чӣ гуна муаррифӣ мекунад, эҳтимол дорад, ки таҳиягаронро барои эҷоди шартномаҳои интеллектуалӣ барои платформаи TON парешон кунад, на ба онҳо кӯмак кунад.

Nix: якҷоя кардани лоиҳа

Дар Серокелл мо мухлисони бузург ҳастем Ник. Мо лоиҳаҳои худро бо он ҷамъ меорем ва онҳоро бо истифода аз он ҷойгир мекунем NixOps, ва дар ҳама серверҳои мо насб карда шудааст Nix OS. Ба шарофати ин, ҳамаи сохторҳои мо такроршавандаанд ва дар ҳама гуна системаи оператсионӣ кор мекунанд, ки дар он Nix насб карда мешавад.

Ҳамин тавр, мо аз эҷод кардан оғоз кардем Никс қабати бо ифода барои васлкунии TON. Бо ёрии он, тартиб додани TON то ҳадди имкон содда аст:

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

Дар хотир доред, ки ба шумо лозим нест, ки ягон вобастагӣ насб кунед. Nix ба таври ҷодугарӣ ҳама чизро барои шумо иҷро мекунад, новобаста аз он ки шумо NixOS, Ubuntu ё macOS-ро истифода мебаред.

Барномасозӣ барои TON

Рамзи шартномаи интеллектуалӣ дар Шабакаи TON дар мошини виртуалии TON (TVM) кор мекунад. TVM нисбат ба аксари дигар мошинҳои виртуалӣ мураккабтар аст ва дорои функсияҳои хеле ҷолиб аст, масалан, он метавонад бо он кор кунад идома и пайвандҳо ба маълумот.

Ғайр аз он, бачаҳо аз TON се забони нави барномасозиро эҷод карданд:

Панҷ як забони универсалии барномасозии стек мебошад, ки ба он монанд аст Фурсати. Қобилияти олии ӯ қобилияти муошират бо TVM мебошад.

FunC як забони барномасозии шартномаи интеллектуалӣ аст, ки ба он монанд аст C ва ба забони дигар - Fift Assembler тартиб дода шудааст.

Ассамблеяи панҷум - Китобхонаи панҷоҳ барои тавлиди коди иҷрошавандаи бинарӣ барои TVM. Панҷум Ассемблер компилятор надорад. Ин Забони мушаххаси домени дохилӣ (eDSL).

Мусобикаи мо кор мекунад

Нихоят, вакти он расидааст, ки ба натичахои чидду чахди худ назар кунем.

Канали пардохти асинхронӣ

Канали пардохт як шартномаи оқилонаест, ки ба ду корбар имкон медиҳад, ки берун аз blockchain пардохт фиристанд. Дар натиҷа, шумо на танҳо пулро сарфа мекунед (комиссия вуҷуд надорад), балки вақтро низ сарфа мекунед (ба шумо лозим нест, ки коркарди блоки навбатиро интизор шавед). Пардохтҳо метавонанд ба қадри дилхоҳ ва ба қадри зарурӣ кам бошанд. Дар ин ҳолат, тарафҳо набояд ба ҳамдигар бовар кунанд, зеро адолати ҳисоббаробаркунии ниҳоӣ бо шартномаи оқилона кафолат дода мешавад.

Мо роҳи ҳалли хеле соддаи мушкилотро ёфтем. Ду тараф метавонанд паёмҳои имзошударо мубодила кунанд, ки ҳар яки онҳо ду рақамро дар бар мегиранд - маблағи пурраи ҳар як тараф пардохтшударо дар бар мегирад. Ин ду рақам чунин кор мекунанд соати векторӣ дар системаҳои тақсимоти анъанавӣ ва муқаррар кардани тартиби "пеш аз рӯй дод" оид ба муомилот. Бо истифода аз ин маълумот, шартнома метавонад ҳама гуна ихтилофоти имконпазирро ҳал кунад.

Дарвоқеъ, як рақам барои амалӣ кардани ин идея кифоя аст, аммо мо ҳардуро тарк кардем, зеро бо ин роҳ мо метавонем интерфейси корбарро қулайтар созем. Илова бар ин, мо тасмим гирифтем, ки маблағи пардохтро дар ҳар як паём дохил кунем. Бе он, агар паём бо ягон сабаб гум шавад, пас, гарчанде ки ҳамаи маблағҳо ва ҳисобҳои ниҳоӣ дуруст хоҳанд буд, корбар метавонад талафотро пайхас накунад.

Барои санҷидани идеяи худ, мо намунаҳои истифодаи чунин протоколи канали пардохти оддӣ ва мухтасарро ҷустуҷӯ кардем. Тааҷҷубовар аст, ки мо танҳо ду ёфтем:

  1. Шарҳи муносибати шабеҳ, танҳо барои як канали яктарафа.
  2. Дарсӣ, ки як идеяи моро тасвир мекунад, вале бидуни тавзеҳ додани бисёр ҷузъиёти муҳим, ба монанди дурустии умумӣ ва тартиби ҳалли низоъҳо.

Маълум шуд, ки ба дурустии он диккати махсус дода, протоколи моро муфассал тавсиф кардан ба максад мувофик аст. Пас аз чанд такрор, мушаххасот омода шуд ва акнун шумо низ метавонед. ба вай нигар.

Мо шартномаро дар FunC амалӣ кардем ва мо утилитаи сатри фармонро барои ҳамкорӣ бо шартномаи худ комилан дар Fift навиштем, ки ташкилкунандагон тавсия кардаанд. Мо метавонистем ягон забони дигарро барои CLI-и худ интихоб кунем, аммо мо манфиатдор будем, ки Fit-ро санҷем, то бубинем, ки он дар амал чӣ гуна иҷро шудааст.

Рости гап, пас аз кор бо Fift мо ягон сабабҳои асоснокро надидем, ки ин забонро ба забонҳои маъмул ва фаъолона истифодашаванда бо абзорҳо ва китобхонаҳои таҳияшуда бартарӣ диҳем. Барномасозӣ бо забони стекӣ хеле ногувор аст, зеро шумо бояд ҳамеша дар сари худ он чизеро, ки дар стек аст, нигоҳ доред ва компилятор дар ин кор кӯмак намекунад.

Аз ин рӯ, ба назари мо, ягона далели мавҷудияти Fift нақши он ҳамчун забони мизбон барои Fift Assembler мебошад. Аммо оё беҳтар нест, ки ассемблери TVM ба ягон забони мавҷуда ворид карда шавад, на ин ки барои ин ҳадафи аслӣ як забони навро ихтироъ кунад?

TVM Haskell eDSL

Ҳоло вақти он расидааст, ки дар бораи шартномаи дуюми интеллектуалии мо сӯҳбат кунем. Мо тасмим гирифтем, ки ҳамёни бисёр имзо таҳия кунем, аммо навиштани як шартномаи интеллектуалии дигар дар FunC хеле дилгиркунанда хоҳад буд. Мо мехостем каме мазза илова кунем ва ин забони маҷлиси худи мо барои TVM буд.

Мисли Fift Assembler, забони нави мо дарунсохт аст, аммо мо ба ҷои Fift Haskell-ро ҳамчун мизбон интихоб кардем ва ба мо имкон дод, ки аз системаи пешрафтаи навъи он пурра истифода барем. Ҳангоми кор бо шартномаҳои интеллектуалӣ, ки арзиши ҳатто хатои хурд метавонад хеле баланд бошад, чопкунии статикӣ, ба андешаи мо, бартарии калон аст.

Барои нишон додани он, ки ассемблери TVM дар Ҳаскелл чӣ гуна аст, мо дар он ҳамёни стандартиро татбиқ кардем. Инҳоянд чанд чизҳое, ки бояд ба онҳо диққат диҳем:

  • Ин шартнома аз як функсия иборат аст, аммо шумо метавонед шумораи зиёди онро истифода баред. Вақте ки шумо функсияи навро дар забони мизбон (яъне Ҳаскелл) муайян мекунед, eDSL-и мо ба шумо имкон медиҳад, ки интихоб кунед, ки оё шумо мехоҳед, ки он реҷаи алоҳида дар TVM шавад ё танҳо дар нуқтаи занг ворид карда шавад.
  • Мисли Ҳаскелл, функсияҳо намудҳое доранд, ки дар вақти тартибдиҳӣ тафтиш карда мешаванд. Дар eDSL-и мо, навъи вуруди функсия навъи стек мебошад, ки функсия интизор аст ва навъи натиҷа навъи стек аст, ки пас аз занг тавлид мешавад.
  • Рамз дорои эзоҳҳо мебошад stacktype, тавсифи навъи стек интизорӣ дар нуқтаи занг. Дар шартномаи аслии ҳамён инҳо танҳо шарҳҳо буданд, аммо дар eDSL-и мо онҳо воқеан як қисми код мебошанд ва дар вақти тартибдиҳӣ тафтиш карда мешаванд. Онҳо метавонанд ҳамчун ҳуҷҷат ё изҳорот хидмат кунанд, ки ба таҳиякунанда дар ёфтани мушкилот дар сурати тағир додани код ва тағир додани навъи стек кӯмак мекунанд. Албатта, чунин эзоҳҳо ба иҷрои вақти корӣ таъсир намерасонанд, зеро барои онҳо ягон рамзи TVM тавлид намешавад.
  • Ин ҳанӯз як прототипест, ки дар ду ҳафта навишта шудааст, аз ин рӯ дар лоиҳа кори зиёде бояд анҷом дода шавад. Масалан, ҳама намунаҳои синфҳое, ки шумо дар коди зер мебинед, бояд ба таври худкор тавлид карда шаванд.

Татбиқи ҳамёни multisig дар 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

Рамзи пурраи сарчашмаи eDSL ва шартномаи ҳамёни бисёримзои моро дар ин ҷо пайдо кардан мумкин аст ин анбор. Ва бештар муфассал накл кард дар бораи забонхои сохташуда, хамкорамон Георгий Агапов.

Хулоса дар бораи мусобика ва ТОН

Дар маҷмӯъ, кори мо 380 соат тӯл кашид (бо назардошти шиносоӣ бо ҳуҷҷатҳо, вохӯриҳо ва таҳияи воқеӣ). Дар лоиҳаи озмун панҷ таҳиягар иштирок карданд: CTO, роҳбари даста, мутахассисони платформаи blockchain ва таҳиягарони нармафзори Haskell.

Мо захираҳоро барои иштирок дар озмун пайдо кардем, зеро рӯҳияи ҳакатон, кори дастаҷамъона ва зарурати зуд ба ҷанбаҳои технологияҳои нав ғарқ шудан ҳамеша ҳаяҷоновар аст. Якчанд шабҳои бехоби барои ноил шудан ба натиҷаҳои ҳадди аксар дар шароити захираҳои маҳдуд бо таҷрибаи бебаҳо ва хотираҳои олӣ ҷуброн карда мешаванд. Илова бар ин, кор дар чунин вазифаҳо ҳамеша як санҷиши хуби равандҳои ширкат аст, зеро бе ҳамкории хуби дохилӣ ноил шудан ба натиҷаҳои воқеан сазовор хеле душвор аст.

Матни суруд як сӯ: мо аз ҳаҷми коре, ки дастаи ТОН ба анҷом расонидааст, ба ваҷд омад. Ба онхо муяссар гардид, ки системам мураккаб, зебо ва аз хама мухимаш кор-куниро барпо кунанд. ТОН худро платформаи дорой иктидори калон нишон дод. Аммо, барои рушди ин экосистема, ҳам аз ҷиҳати истифодаи он дар лоиҳаҳои blockchain ва ҳам дар робита ба такмили абзорҳои рушд корҳои зиёдеро анҷом додан лозим аст. Мо ифтихор дорем, ки ҳоло як қисми ин раванд ҳастем.

Агар пас аз хондани ин мақола шумо то ҳол ягон савол дошта бошед ё дар бораи чӣ гуна истифода бурдани ТОН барои ҳалли мушкилоти худ фикре дошта бошед, ба мо нависед — мо бо камоли хурсандй аз тачрибаи худ накл мекунем.

Манбаъ: will.com

Илова Эзоҳ