Juya FunC zuwa Aiki tare da Haskell: Yadda Serokell ya ci Gasar Blockchain Telegram

Wataƙila kun ji wannan Telegram yana gab da ƙaddamar da dandalin Ton blockchain. Amma watakila kun rasa labarin cewa ba da daɗewa ba Telegram ya sanar da gasar don aiwatar da kwangiloli ɗaya ko fiye masu wayo don wannan dandamali.

Ƙungiyar Serokell, tare da ƙwarewa mai yawa wajen haɓaka manyan ayyukan blockchain, ba za su iya tsayawa ba. Mun ba da ma'aikata biyar zuwa gasar, kuma bayan makonni biyu sun zama na farko a cikinta a karkashin (a) suna bazuwar suna Sexy Chameleon. A cikin wannan labarin zan yi magana game da yadda suka yi. Muna fatan cewa a cikin minti goma masu zuwa akalla za ku karanta labari mai ban sha'awa, kuma a mafi yawan za ku sami wani abu mai amfani a ciki wanda za ku iya amfani da shi a cikin aikinku.

Amma bari mu fara da ɗan mahallin.

Gasar da sharuddan ta

Don haka, manyan ayyuka na mahalarta sune aiwatar da ɗaya ko fiye na kwangilar wayo da aka tsara, da kuma yin shawarwari don inganta yanayin yanayin TON. An gudanar da gasar ne daga ranar 24 ga watan Satumba zuwa 15 ga watan Oktoba, kuma an bayyana sakamakon ne a ranar 15 ga watan Nuwamba. Tsawon lokaci mai tsawo, la'akari da cewa a wannan lokacin Telegram ya gudanar da riƙewa da sanar da sakamakon gasa akan ƙira da haɓaka aikace-aikacen a C ++ don gwaji da tantance ingancin kiran VoIP a cikin Telegram.

Mun zaɓi kwangiloli masu wayo guda biyu daga jerin abubuwan da masu shirya suka gabatar. A daya daga cikinsu, mun yi amfani da kayan aikin da aka rarraba da TON, na biyu kuma an aiwatar da shi a cikin sabon yare da injiniyoyinmu suka kirkira musamman na TON kuma aka gina shi cikin Haskell.

Zaɓin yaren shirye-shiryen aiki ba na haɗari ba ne. A cikin mu blog na kamfani Sau da yawa muna magana game da dalilin da ya sa muke tunanin hadaddun harsunan aiki babban wuce gona da iri ne kuma dalilin da ya sa muke fifita su gabaɗaya zuwa waɗanda ke da manufa. Af, shi ma ya ƙunshi asalin wannan labarin.

Me ya sa ma muka yanke shawarar shiga?

A takaice, saboda ƙwarewar mu ba daidaitattun ayyuka ba ne kuma hadaddun ayyuka waɗanda ke buƙatar ƙwarewa na musamman kuma galibi suna da ƙimar kimiyya ga jama'ar IT. Muna goyon bayan bunkasuwar tushen tushe kuma muna tsunduma cikin yaɗuwarta, kuma muna ba da haɗin kai tare da manyan jami'o'in Rasha a fagen kimiyyar kwamfuta da lissafi.

Ayyuka masu ban sha'awa na gasar da kuma shiga cikin ƙaunataccen aikin Telegram ɗinmu sun kasance a cikin kansu kyakkyawan dalili, amma asusun kyauta ya zama ƙarin abin ƙarfafawa. 🙂

TON binciken blockchain

Muna sa ido sosai a kan sabbin abubuwan da ke faruwa a cikin blockchain, hankali na wucin gadi da koyan injin kuma muna ƙoƙarin kada mu rasa wani mahimmancin saki ɗaya a cikin kowane yanki da muke aiki. Saboda haka, a lokacin da aka fara gasar, ƙungiyarmu ta riga ta saba da ra'ayoyi daga TON farar takarda. Duk da haka, kafin fara aiki tare da TON, ba mu bincika takardun fasaha da ainihin lambar tushe na dandamali ba, don haka mataki na farko ya kasance a bayyane - cikakken nazari na takardun hukuma akan. shafin da kuma cikin wuraren ajiyar aikin.

A lokacin da aka fara gasar, an riga an buga lambar, don haka don adana lokaci, mun yanke shawarar neman jagora ko taƙaitaccen rubutu wanda ya rubuta. ta masu amfani. Abin takaici, wannan bai ba da wani sakamako ba - ban da umarnin haɗa dandamali akan Ubuntu, ba mu sami wasu kayan ba.

Takardar kanta an yi bincike sosai, amma yana da wahalar karantawa a wasu wuraren. Yawancin lokaci dole ne mu koma ga wasu maki kuma mu canza daga manyan kwatancen ra'ayoyin ra'ayoyin zuwa ƙananan bayanan aiwatarwa.

Zai fi sauƙi idan ƙayyadaddun bai ƙunshi cikakken bayanin aiwatarwa ba kwata-kwata. Bayani game da yadda injin kama-da-wane ke wakiltar tarin sa yana da yuwuwar kawar da hankalin masu haɓaka ƙirƙirar kwangiloli masu wayo don dandalin TON fiye da taimaka musu.

Nix: hada aikin tare

A Serokell mu manyan magoya baya ne nix. Muna tattara ayyukanmu da shi kuma muna tura su ta amfani da su NixOps, da kuma shigar a kan dukkan sabobin mu Nix OS. Godiya ga wannan, duk abubuwan da muke ginawa ana iya sake su kuma suna aiki akan kowane tsarin aiki wanda za'a iya shigar da Nix akansa.

Don haka muka fara da ƙirƙira Nix mai rufi tare da magana don taron TON. Tare da taimakonsa, haɗa TON yana da sauƙi kamar yadda zai yiwu:

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

Lura cewa ba kwa buƙatar shigar da kowane abin dogaro. Nix zai yi muku sihiri da sihiri, ko kuna amfani da NixOS, Ubuntu, ko macOS.

Shirye-shiryen don TON

Lambar kwangilar wayo a cikin hanyar sadarwa ta TON tana gudana akan injin Virtual Machine (TVM). TVM ya fi rikitarwa fiye da sauran na'urori masu mahimmanci, kuma yana da ayyuka masu ban sha'awa, alal misali, yana iya aiki tare da ci gaba и hanyoyin haɗi zuwa bayanai.

Haka kuma, mutanen TON sun kirkiro sabbin harsunan shirye-shirye guda uku:

Biyar harshen duniya stack programming language ne wanda yayi kama da Makoma. Babban ikonsa shine ikon yin hulɗa da TVM.

FunC Harshen shirye-shiryen kwangila ne mai wayo wanda yayi kama da C kuma an haɗa shi zuwa wani harshe - Fift Assembler.

Mai Taruwa Na Biyar - Laburaren biyar don ƙirƙirar lambar aiwatar da binary don TVM. Mai tarawa na biyar bashi da mai tarawa. Wannan Harshen Musamman na yanki (eDSL).

Gasar mu tana aiki

A ƙarshe, lokaci ya yi da za mu duba sakamakon ƙoƙarinmu.

Tashar biyan kuɗi asynchronous

Tashar biyan kuɗi wata kwangila ce mai wayo wacce ke ba masu amfani biyu damar aika kuɗi a waje da blockchain. A sakamakon haka, kuna adana ba kawai kuɗi ba (babu hukumar), amma kuma lokaci (ba dole ba ne ku jira toshe na gaba don sarrafa shi). Biyan kuɗi na iya zama ƙanana kamar yadda ake so kuma sau da yawa kamar yadda ake buƙata. A wannan yanayin, bangarorin ba dole ba ne su amince da juna, tun lokacin da aka tabbatar da adalcin sulhu na ƙarshe ta hanyar kwangilar basira.

Mun sami mafita mai sauƙi ga matsalar. Bangarorin biyu na iya musayar sa hannun sa hannu, kowanne yana ɗauke da lambobi biyu-cikakken adadin da kowane ɓangare ya biya. Waɗannan lambobi biyu suna aiki kamar agogon vector a cikin tsarin da aka rarraba na gargajiya da kuma saita tsarin "wanda ya faru a baya" akan ma'amaloli. Yin amfani da wannan bayanan, kwangilar za ta iya magance duk wani rikici mai yiwuwa.

A haƙiƙa, lamba ɗaya ta isa aiwatar da wannan ra'ayin, amma mun bar duka biyun saboda ta wannan hanyar za mu iya samar da mafi dacewa ga mai amfani. Bugu da ƙari, mun yanke shawarar haɗa adadin kuɗin a cikin kowane saƙo. Idan ba tare da shi ba, idan sakon ya ɓace saboda wasu dalilai, to, kodayake duk adadin da lissafin ƙarshe zai zama daidai, mai amfani bazai lura da asarar ba.

Don gwada ra'ayinmu, mun nemi misalan amfani da irin wannan ƙa'idar biyan kuɗi mai sauƙi da taƙaitaccen tsari. Abin mamaki, mun sami biyu kawai:

  1. Description irin wannan hanya, kawai ga yanayin tashar unidirectional.
  2. Koyarwa, wanda ke bayyana ra'ayi iri ɗaya kamar namu, amma ba tare da bayyana mahimman bayanai masu yawa ba, kamar daidaitattun gabaɗaya da hanyoyin warware rikici.

Ya bayyana a fili cewa yana da ma'ana don bayyana ka'idar mu daki-daki, tare da ba da kulawa ta musamman ga daidaito. Bayan gyare-gyare da yawa, ƙayyadaddun ya shirya, kuma yanzu kuna iya. kallonta.

Mun aiwatar da kwangilar a FunC, kuma mun rubuta layin umarni don yin hulɗa tare da kwangilar mu gaba ɗaya a cikin Fift, kamar yadda masu shirya suka ba da shawarar. Za mu iya zaɓar kowane harshe don CLI ɗinmu, amma muna da sha'awar gwada Fit don ganin yadda yake gudana a aikace.

A gaskiya, bayan yin aiki tare da Fift, ba mu ga wasu dalilai masu karfi ba don fifita wannan harshe zuwa shahararrun harsunan da aka yi amfani da su tare da kayan aiki da ɗakunan karatu. Shirya shirye-shirye a cikin yare mai tushe ba shi da daɗi sosai, tunda dole ne ku ci gaba da kiyaye abin da ke kan tari, kuma mai tarawa bai taimaka da wannan ba.

Saboda haka, a ra'ayinmu, kawai hujjar kasancewar Fift shine rawar da yake takawa a matsayin harshen masauki na Fift Assembler. Amma shin ba zai fi kyau a shigar da mai tara TVM cikin wani yare da ake da shi ba, maimakon ƙirƙiro wani sabo don wannan kawai manufa?

TVM Haskell eDSL

Yanzu lokaci ya yi da za mu yi magana game da kwangilarmu mai wayo ta biyu. Mun yanke shawarar haɓaka walat ɗin sa hannu da yawa, amma rubuta wani kwangila mai wayo a FunC zai zama mai ban sha'awa. Mun so mu ƙara ɗanɗano, kuma wannan shine yaren taron mu na TVM.

Kamar Fift Assembler, sabon harshen mu yana cikin ciki, amma mun zaɓi Haskell a matsayin mai masaukin baki maimakon Fift, yana ba mu damar cin gajiyar tsarinsa na ci gaba. Lokacin aiki tare da kwangiloli masu wayo, inda farashin ko da ƙaramin kuskure zai iya zama mai girma, buga rubutu a tsaye, a cikin ra'ayinmu, babban fa'ida ne.

Don nuna abin da mai haɗa TVM yayi kama da sakawa a cikin Haskell, mun aiwatar da madaidaicin walat akansa. Ga kadan abubuwan da ya kamata a kula da su:

  • Wannan kwangilar ta ƙunshi aiki guda ɗaya, amma kuna iya amfani da su gwargwadon yadda kuke so. Lokacin da kuka ayyana sabon aiki a cikin yaren baƙi (watau Haskell), eDSL ɗinmu yana ba ku damar zaɓar ko kuna son ta zama na yau da kullun a cikin TVM ko kuma kawai a sa layi a wurin kira.
  • Kamar Haskell, ayyuka suna da nau'ikan da ake dubawa a lokacin tattarawa. A cikin eDSL ɗin mu, nau'in shigarwar aiki shine nau'in tari wanda aikin yake tsammani, kuma nau'in sakamako shine nau'in tari da za'a samar bayan kira.
  • Lambar tana da annotations stacktype, yana bayyana nau'in tari da ake tsammanin a wurin kira. A cikin ainihin kwantiragin wallet waɗannan maganganu ne kawai, amma a cikin eDSL ɗinmu a zahiri ɓangaren lamba ne kuma ana duba su a lokacin tattarawa. Suna iya aiki azaman takaddun bayanai ko bayanan da ke taimaka wa mai haɓakawa gano matsalar idan lambar ta canza kuma nau'in tari ya canza. Tabbas, irin waɗannan bayanan ba su tasiri aikin lokacin gudu ba, tunda ba a samar musu da lambar TVM ba.
  • Har yanzu wannan samfuri ne da aka rubuta cikin makonni biyu, don haka akwai sauran aiki da yawa a kan aikin. Misali, duk misalin azuzuwan da kuke gani a lambar da ke ƙasa yakamata a samar dasu ta atomatik.

Wannan shine abin da aiwatar da wallet ɗin multisig yayi kama akan 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

Ana iya samun cikakken lambar tushe na eDSL da kwangilar sa hannu mai yawa a wannan ma'ajiyar. Da ƙari ya fada dalla-dalla game da ginanniyar harsuna, abokin aikinmu Georgy Agapov.

Ƙarshe game da gasar da TON

Gabaɗaya, aikinmu ya ɗauki sa'o'i 380 (ciki har da sanin takardu, tarurruka da haɓakawa na ainihi). Masu haɓakawa biyar sun shiga cikin aikin gasa: CTO, jagorar ƙungiyar, ƙwararrun dandamali na blockchain da masu haɓaka software na Haskell.

Mun sami albarkatu don shiga cikin takara ba tare da wahala ba, tun da ruhun hackathon, kusancin haɗin gwiwa, da buƙatar da sauri nutsad da kanmu a cikin sassan sabbin fasahohi koyaushe yana da ban sha'awa. Yawancin dare marasa barci don cimma iyakar sakamako a cikin yanayi na iyakataccen albarkatu ana biya su ta hanyar ƙwarewa mai ƙima da kyawawan abubuwan tunawa. Bugu da ƙari, yin aiki a kan irin waɗannan ayyuka koyaushe gwaji ne mai kyau na tsarin tafiyar da kamfanin, tun da yake yana da matukar wahala a cimma sakamako mai kyau na gaske ba tare da yin hulɗar cikin gida da kyau ba.

Waƙoƙin waje: yawan aikin da ƙungiyar TON ta yi ta burge mu. Sun yi nasarar gina hadaddun, kyakkyawa, kuma mafi mahimmanci, tsarin aiki. TON ya tabbatar da kansa a matsayin dandamali mai mahimmanci. Duk da haka, domin wannan yanayin ya ci gaba, ana buƙatar yin abubuwa da yawa, duka dangane da amfani da shi a ayyukan blockchain da kuma inganta kayan aikin ci gaba. Muna alfahari da kasancewa cikin wannan tsari.

Idan bayan karanta wannan labarin har yanzu kuna da wasu tambayoyi ko kuna da ra'ayoyi kan yadda ake amfani da TON don magance matsalolin ku, rubuta mana - za mu yi farin cikin raba abubuwan da muka samu.

source: www.habr.com

Add a comment