Probabbilment smajt dak it-Telegram . Imma forsi tlift l-aħbar li ftit ilu Telegram għall-implimentazzjoni ta’ kuntratt intelliġenti wieħed jew aktar għal din il-pjattaforma.
It-tim ta 'Serokell, b'esperjenza estensiva fl-iżvilupp ta' proġetti kbar ta 'blockchain, ma setax joqgħod fil-ġenb. Iddelegajna ħames impjegati għall-kompetizzjoni, u ġimgħatejn wara ħadu l-ewwel post fiha taħt il-laqam (in)modest każwali Sexy Chameleon. F'dan l-artikolu ser nitkellem dwar kif għamlu dan. Nittamaw li fl-għaxar minuti li ġejjin mill-inqas taqra storja interessanti, u l-aktar issib xi ħaġa utli fiha li tista’ tapplika fix-xogħol tiegħek.
Imma ejja nibdew bi ftit kuntest.
Il-kompetizzjoni u l-kundizzjonijiet tagħha
Għalhekk, il-kompiti ewlenin tal-parteċipanti kienu l-implimentazzjoni ta 'wieħed jew aktar mill-kuntratti intelliġenti proposti, kif ukoll li jagħmlu proposti biex tittejjeb l-ekosistema TON. Il-kompetizzjoni saret mill-24 ta’ Settembru sal-15 ta’ Ottubru, u r-riżultati tħabbru biss fil-15 ta’ Novembru. Żmien pjuttost twil, meta wieħed iqis li matul dan iż-żmien Telegram irnexxielu jżomm u jħabbar ir-riżultati tal-konkorsi dwar id-disinn u l-iżvilupp ta 'applikazzjonijiet f'C++ għall-ittestjar u l-valutazzjoni tal-kwalità tas-sejħiet VoIP f'Telegram.
Aħna għażilna żewġ kuntratti intelliġenti mil-lista proposta mill-organizzaturi. Għal waħda minnhom, użajna għodda mqassma b'TON, u t-tieni ġiet implimentata f'lingwa ġdida żviluppata mill-inġiniera tagħna speċifikament għal TON u mibnija f'Haskell.
L-għażla ta 'lingwa ta' programmar funzjonali mhix aċċidentali. Fil tagħna Ħafna drabi nitkellmu dwar għaliex naħsbu li l-kumplessità tal-lingwi funzjonali hija eżaġerazzjoni kbira u għaliex ġeneralment nippreferuhom minn dawk orjentati lejn l-oġġetti. Mill-mod, fih ukoll .
Għaliex iddeċidejna li nieħdu sehem?
Fil-qosor, għaliex l-ispeċjalizzazzjoni tagħna hija proġetti mhux standard u kumplessi li jeħtieġu ħiliet speċjali u ħafna drabi huma ta 'valur xjentifiku għall-komunità tal-IT. Aħna nappoġġaw bil-qawwa l-iżvilupp ta 'sors miftuħ u aħna impenjati fil-popolarizzazzjoni tiegħu, u nikkooperaw ukoll ma' universitajiet Russi ewlenin fil-qasam tax-xjenza tal-kompjuter u l-matematika.
Il-kompiti interessanti tal-kompetizzjoni u l-involviment fil-proġett maħbub tagħna Telegram kienu fihom infushom motivazzjoni eċċellenti, iżda l-fond tal-premju sar inċentiv addizzjonali. 🙂
Riċerka blockchain TON
Aħna nissorveljaw mill-qrib żviluppi ġodda fil-blockchain, l-intelliġenza artifiċjali u t-tagħlim tal-magni u nippruvaw ma nitilfux rilaxx sinifikanti wieħed f'kull wieħed mill-oqsma li naħdmu fihom. Għalhekk, sa meta bdiet il-kompetizzjoni, it-tim tagħna kien diġà familjari ma 'ideat minn . Madankollu, qabel ma bdejna x-xogħol ma 'TON, aħna ma analizzajniex id-dokumentazzjoni teknika u l-kodiċi tas-sors attwali tal-pjattaforma, għalhekk l-ewwel pass kien pjuttost ovvju - studju bir-reqqa tad-dokumentazzjoni uffiċjali dwar u .
Sakemm bdiet il-kompetizzjoni, il-kodiċi kien diġà ġie ppubblikat, għalhekk biex niffrankaw il-ħin, iddeċidejna li nfittxu gwida jew sommarju miktub minn mill-utenti. Sfortunatament, dan ma ta l-ebda riżultat - apparti l-istruzzjonijiet għall-assemblaġġ tal-pjattaforma fuq Ubuntu, ma sibna l-ebda materjal ieħor.
Id-dokumentazzjoni nnifisha kienet riċerkata tajjeb, iżda kienet diffiċli biex tinqara f'xi oqsma. Ħafna drabi kellna nerġgħu lura għal ċerti punti u naqilbu minn deskrizzjonijiet ta 'livell għoli ta' ideat astratti għal dettalji ta 'implimentazzjoni ta' livell baxx.
Ikun aktar faċli jekk l-ispeċifikazzjoni ma tinkludi xejn deskrizzjoni dettaljata tal-implimentazzjoni. Informazzjoni dwar kif magna virtwali tirrappreżenta l-munzell tagħha hija aktar probabbli li tfixkel lill-iżviluppaturi li joħolqu kuntratti intelliġenti għall-pjattaforma TON milli tgħinhom.
Nix: tpoġġi l-proġett flimkien
F'Serokell aħna fans kbar . Aħna niġbru l-proġetti tagħna magħha u niskjerawhom bl-użu , u installati fuq is-servers kollha tagħna . Grazzi għal dan, il-bini kollu tagħna huwa riproduċibbli u jaħdem fuq kwalunkwe sistema operattiva li fuqha jista 'jiġi installat Nix.
Allura bdejna billi noħolqu . Bl-għajnuna tagħha, il-kumpilazzjoni ta 'TON hija sempliċi kemm jista' jkun:
$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && makeInnota li m'għandekx bżonn tinstalla xi dipendenzi. Nix se jagħmel kollox għalik b'mod maġiku, kemm jekk qed tuża NixOS, Ubuntu, jew macOS.
Ipprogrammar għal TON
Il-kodiċi tal-kuntratt intelliġenti fin-Netwerk TON jaħdem fuq il-Magni Virtwali TON (TVM). TVM huwa aktar kumpless mill-biċċa l-kbira tal-magni virtwali l-oħra, u għandu funzjonalità interessanti ħafna, pereżempju, jista’ jaħdem ma’ kontinwazzjonijiet и links għad-dejta.
Barra minn hekk, in-nies minn TON ħolqu tliet lingwi ġodda ta' programmar:
Ħamsa hija lingwa ta 'programmar universali li tixbaħ . Il-ħila super tiegħu hija l-abbiltà li jinteraġixxi ma 'TVM.
FunC hija lingwa ta 'programmar ta' kuntratt intelliġenti li hija simili għal u huwa miġbur f'lingwa oħra - Fift Assembler.
Il-Ħames Assembler — Ħames librerija għall-ġenerazzjoni ta’ kodiċi binarju eżekutibbli għal TVM. Il-Ħames Assembler m'għandux kompilatur. Dan .
Il-kompetizzjoni tagħna taħdem
Fl-aħħarnett, wasal iż-żmien li nħarsu lejn ir-riżultati tal-isforzi tagħna.
Kanal ta 'ħlas mhux sinkroniku
Il-kanal tal-ħlas huwa kuntratt intelliġenti li jippermetti li żewġ utenti jibagħtu ħlasijiet barra l-blockchain. Bħala riżultat, inti tiffranka mhux biss flus (m'hemm l-ebda kummissjoni), iżda wkoll ħin (m'għandekx għalfejn tistenna li l-blokk li jmiss jiġi pproċessat). Il-ħlasijiet jistgħu jkunu żgħar kemm mixtieq u kemm-il darba jkun meħtieġ. F'dan il-każ, il-partijiet m'għandhomx għalfejn jafdaw lil xulxin, peress li l-ġustizzja tas-saldu finali hija garantita mill-kuntratt intelliġenti.
Sibna soluzzjoni pjuttost sempliċi għall-problema. Żewġ partijiet jistgħu jiskambjaw messaġġi ffirmati, kull wieħed ikun fih żewġ numri—l-ammont sħiħ imħallas minn kull parti. Dawn iż-żewġ numri jaħdmu bħal f'sistemi mqassma tradizzjonali u ssettja l-ordni "ġara qabel" fuq it-tranżazzjonijiet. Bl-użu ta' din id-dejta, il-kuntratt ikun jista' jsolvi kwalunkwe kunflitt possibbli.
Fil-fatt, numru wieħed huwa biżżejjed biex timplimenta din l-idea, iżda ħallejna t-tnejn għax b'dan il-mod nistgħu nagħmlu user interface aktar konvenjenti. Barra minn hekk, iddeċidejna li ninkludu l-ammont tal-ħlas f'kull messaġġ. Mingħajrha, jekk il-messaġġ jintilef għal xi raġuni, allura, għalkemm l-ammonti kollha u l-kalkolu finali jkunu korretti, l-utent jista 'ma jindunax it-telf.
Biex nittestjaw l-idea tagħna, fittixna eżempji ta 'użu ta' protokoll tal-kanal tal-ħlas sempliċi u konċiż. B'mod sorprendenti, sibna tnejn biss:
- approċċ simili, biss għall-każ ta 'kanal unidirezzjonali.
- , li tiddeskrivi l-istess idea bħal tagħna, iżda mingħajr ma tispjega ħafna dettalji importanti, bħall-korrettezza ġenerali u l-proċeduri tar-riżoluzzjoni tal-kunflitti.
Deher ċar li jagħmel sens li tiddeskrivi l-protokoll tagħna fid-dettall, filwaqt li tingħata attenzjoni speċjali għall-korrettezza tiegħu. Wara diversi iterazzjonijiet, l-ispeċifikazzjoni kienet lesta, u issa tista 'wkoll. .
Implimentajna l-kuntratt f'FunC, u ktibna l-utilità tal-linja tal-kmand għall-interazzjoni mal-kuntratt tagħna kompletament f'Fift, kif rakkomandat mill-organizzaturi. Stajna għażilna kwalunkwe lingwa oħra għas-CLI tagħna, iżda konna interessati li nippruvaw Fit biex naraw kif wettaq fil-prattika.
Biex inkun onest, wara li ħdimna ma 'Fift, ma rajna l-ebda raġuni konvinċenti biex nippreferu din il-lingwa għal lingwi popolari u użati b'mod attiv b'għodod u libreriji żviluppati. L-ipprogrammar f'lingwa bbażata fuq munzell hija pjuttost spjaċevoli, peress li trid iżżomm f'rasek kontinwament dak li hemm fuq il-munzell, u l-kompilatur ma jgħinx f'dan.
Għalhekk, fl-opinjoni tagħna, l-unika ġustifikazzjoni għall-eżistenza ta’ Fift hija r-rwol tagħha bħala lingwa ospitanti għal Fift Assembler. Imma ma jkunx aħjar li l-assembler ta' TVM jiġi mdaħħal f'xi lingwa eżistenti, aktar milli tivvinta waħda ġdida għal dan l-iskop essenzjalment uniku?
TVM Haskell eDSL
Issa wasal iż-żmien li nitkellmu dwar it-tieni kuntratt intelliġenti tagħna. Iddeċidejna li niżviluppaw kartiera b'ħafna firem, iżda l-kitba ta 'kuntratt intelliġenti ieħor f'FunC tkun wisq boring. Ridna nżidu ftit togħma, u dik kienet il-lingwaġġ tal-assemblaġġ tagħna stess għal TVM.
Bħal Fift Assembler, il-lingwa l-ġdida tagħna hija inkorporata, iżda għażilna lil Haskell bħala l-ospitant minflok Fift, li jippermettilna nieħdu vantaġġ sħiħ mis-sistema tat-tip avvanzat tagħha. Meta taħdem ma 'kuntratti intelliġenti, fejn l-ispiża ta' anki żball żgħir tista 'tkun għolja ħafna, it-tajpjar statiku, fl-opinjoni tagħna, huwa vantaġġ kbir.
Biex nuru kif jidher TVM assembler inkorporat f'Haskell, implimentajna kartiera standard fuqha. Hawn huma ftit affarijiet li għandek tagħti attenzjoni għalihom:
- Dan il-kuntratt jikkonsisti f'funzjoni waħda, iżda tista' tuża kemm trid. Meta tiddefinixxi funzjoni ġdida fil-lingwa ospitanti (jiġifieri Haskell), l-eDSL tagħna jippermettilek tagħżel jekk tridx li ssir rutina separata f'TVM jew sempliċement inlined fil-punt tat-telefonata.
- Bħal Haskell, il-funzjonijiet għandhom tipi li huma kkontrollati fil-ħin tal-kompilazzjoni. Fl-eDSL tagħna, it-tip ta 'input ta' funzjoni huwa t-tip ta 'munzell li l-funzjoni tistenna, u t-tip ta' riżultat huwa t-tip ta 'munzell li se jiġi prodott wara s-sejħa.
- Il-kodiċi għandu annotazzjonijiet
stacktype, li jiddeskrivi t-tip ta' munzell mistenni fil-punt tas-sejħa. Fil-kuntratt oriġinali tal-kartiera dawn kienu biss kummenti, iżda fl-eDSL tagħna huma fil-fatt parti mill-kodiċi u huma kkontrollati fil-ħin tal-kompilazzjoni. Jistgħu jservu bħala dokumentazzjoni jew dikjarazzjonijiet li jgħinu lill-iżviluppatur isib il-problema jekk il-kodiċi jinbidel u t-tip ta 'munzell jinbidel. Naturalment, annotazzjonijiet bħal dawn ma jaffettwawx il-prestazzjoni tar-runtime, peress li l-ebda kodiċi TVM ma jiġi ġġenerat għalihom. - Dan għadu prototip miktub f'ġimagħtejn, għalhekk għad fadal ħafna xogħol xi jsir fuq il-proġett. Pereżempju, l-istanzi kollha tal-klassijiet li tara fil-kodiċi hawn taħt għandhom jiġu ġġenerati awtomatikament.
Hekk tidher l-implimentazzjoni ta' kartiera multisig fuq l-eDSL tagħna:
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 @Word32Il-kodiċi tas-sors sħiħ tal-kuntratt tal-kartiera eDSL u b'ħafna firem tagħna jista' jinstab fuq U iktar dwar il-lingwi integrati, il-kollega tagħna Georgy Agapov.
Konklużjonijiet dwar il-kompetizzjoni u TON
B'kollox, ix-xogħol tagħna ħa 380 siegħa (inkluża l-familjarizzazzjoni mad-dokumentazzjoni, il-laqgħat u l-iżvilupp attwali). Ħames żviluppaturi ħadu sehem fil-proġett tal-kompetizzjoni: CTO, team lead, speċjalisti tal-pjattaforma blockchain u żviluppaturi tas-softwer Haskell.
Sibna riżorsi biex nipparteċipaw fil-konkors mingħajr diffikultà, peress li l-ispirtu ta 'hackathon, ħidma f'tim mill-qrib, u l-ħtieġa li ngħaddu malajr f'aspetti ta' teknoloġiji ġodda huwa dejjem eċċitanti. Diversi iljieli bla rqad biex jinkisbu riżultati massimi f'kundizzjonijiet ta 'riżorsi limitati huma kkumpensati minn esperjenza imprezzabbli u memorji eċċellenti. Barra minn hekk, ix-xogħol fuq kompiti bħal dawn huwa dejjem test tajjeb tal-proċessi tal-kumpanija, peress li huwa estremament diffiċli li jinkisbu riżultati tassew deċenti mingħajr komunikazzjoni interna li taħdem tajjeb.
Lyrics aside: konna impressjonat bl-ammont ta 'xogħol imqiegħed fit-tim TON. Irnexxielhom jibnu sistema kumplessa, sabiħa, u l-aktar importanti, ta’ ħidma. TON wriet ruħha li hija pjattaforma b'potenzjal kbir. Madankollu, sabiex din l-ekosistema tiżviluppa, jeħtieġ li jsir ħafna aktar, kemm f’termini tal-użu tagħha fi proġetti blockchain kif ukoll f’termini ta’ titjib tal-għodod tal-iżvilupp. Aħna kburin li issa nkunu parti minn dan il-proċess.
Jekk wara li taqra dan l-artikolu għad għandek xi mistoqsijiet jew għandek ideat dwar kif tuża TON biex issolvi l-problemi tiegħek, — se nkunu kuntenti li naqsmu l-esperjenza tagħna.
Sors: www.habr.com
