Ou te genlè tande Telegram sa . Men, ou ta ka rate nouvèl la ki pa gen lontan Telegram pou aplikasyon youn oswa plis kontra entelijan pou platfòm sa a.
Ekip Serokell la, ki gen anpil eksperyans nan devlope gwo pwojè blockchain, pa t 'kapab kanpe sou kote. Nou delege senk anplwaye nan konpetisyon an, ak de semèn pita yo te pran premye plas nan li anba ti non an (an) modès o aza Sexy Chameleon. Nan atik sa a mwen pral pale sou ki jan yo te fè li. Nou espere ke nan dis minit kap vini yo ou pral omwen li yon istwa enteresan, epi nan pi plis ou pral jwenn yon bagay itil nan li ke ou ka aplike nan travay ou.
Men, ann kòmanse ak yon ti kontèks.
Konpetisyon ak kondisyon li yo
Se konsa, travay prensipal yo nan patisipan yo te aplikasyon an nan youn oswa plis nan kontra entelijan yo pwopoze yo, osi byen ke fè pwopozisyon amelyore ekosistèm nan TON. Konpetisyon an te kòmanse soti 24 septanm rive 15 oktòb, e rezilta yo te anonse sèlman 15 novanm. Byen lontan, konsidere ke pandan tan sa a Telegram jere yo kenbe ak anonse rezilta yo nan konkou sou konsepsyon ak devlopman nan aplikasyon nan C++ pou teste ak evalye kalite apèl VoIP nan Telegram.
Nou te chwazi de kontra entelijan nan lis òganizatè yo pwopoze a. Pou youn nan yo, nou te itilize zouti ki te distribye ak TON, epi dezyèm lan te aplike nan yon nouvo lang enjenyè nou yo devlope espesyalman pou TON epi ki te bati nan Haskell.
Chwa a nan yon langaj pwogramasyon fonksyonèl se pa aksidan. Nan nou Nou souvan pale sou poukisa nou panse konpleksite nan lang fonksyonèl se yon gwo egzajerasyon e poukisa nou jeneralman prefere yo nan lang ki oryante objè yo. By wout la, li genyen tou .
Poukisa nou menm deside patisipe?
Nan ti bout tan, paske espesyalizasyon nou an se pwojè ki pa estanda ak konplèks ki mande pou konpetans espesyal epi yo souvan gen valè syantifik nan kominote a IT. Nou fòtman sipòte devlopman sous louvri epi yo angaje nan popilarizasyon li yo, epi tou kolabore ak dirijan inivèsite Ris nan domèn syans òdinatè ak matematik.
Travay yo enteresan nan konpetisyon an ak patisipasyon nan pwojè renmen anpil Telegram nou an te nan tèt yo yon motivasyon ekselan, men fon an te vin tounen yon ankourajman adisyonèl. 🙂
TON rechèch blockchain
Nou kontwole ak anpil atansyon nouvo devlopman nan blockchain, entèlijans atifisyèl ak aprantisaj machin epi eseye pa rate yon sèl lage enpòtan nan chak nan domèn kote nou travay. Se poutèt sa, lè konpetisyon an te kòmanse, ekip nou an te deja abitye ak lide ki soti nan . Sepandan, anvan nou kòmanse travay ak TON, nou pa t analize dokiman teknik yo ak kòd sous aktyèl platfòm la, kidonk premye etap la te byen evidan - yon etid apwofondi sou dokiman ofisyèl la. ak .
Lè konpetisyon an te kòmanse, kòd la te deja pibliye, kidonk pou n ekonomize tan, nou te deside chèche yon gid oswa rezime ekri pa pa itilizatè yo. Malerezman, sa a pa bay okenn rezilta - apa de enstriksyon pou rasanble platfòm la sou Ubuntu, nou pa t jwenn okenn lòt materyèl.
Dokiman an tèt li te byen rechèch, men li te difisil pou li nan kèk zòn. Byen souvan nou te oblije retounen nan sèten pwen epi chanje soti nan deskripsyon wo nivo nan lide abstrè nan detay aplikasyon ki ba nivo.
Li ta pi fasil si spesifikasyon an pa t gen ladann yon deskripsyon detaye sou aplikasyon an ditou. Enfòmasyon sou fason yon machin vityèl reprezante pil li yo gen plis chans pou distrè devlopè yo kreye kontra entelijan pou platfòm TON pase pou ede yo.
Nix: mete pwojè a ansanm
Nan Serokell nou se gwo fanatik . Nou kolekte pwojè nou yo ak li epi deplwaye yo lè l sèvi avèk , ak enstale sou tout serveurs nou yo . Mèsi a sa a, tout bati nou yo se repwodiktif ak travay sou nenpòt sistèm opere sou ki Nix ka enstale.
Se konsa, nou te kòmanse pa kreye . Avèk èd li, konpile TON se senp ke posib:
$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && makeRemake byen ke ou pa bezwen enstale okenn depandans. Nix pral maji fè tout bagay pou ou, si w ap itilize NixOS, Ubuntu, oswa macOS.
Pwogramasyon pou TON
Kòd kontra entelijan nan TON Network kouri sou TON Virtual Machine (TVM). TVM se pi konplèks pase pifò lòt machin vityèl, e li gen yon fonksyon trè enteresan, pou egzanp, li ka travay avèk kontinyasyon и lyen ki mennen nan done yo.
Anplis, mesye TON yo te kreye twa nouvo langaj pwogramasyon:
Senk se yon langaj pwogramasyon pile inivèsèl ki sanble . Super kapasite li se kapasite nan kominike avèk TVM.
FunC se yon langaj pwogram entelijan kontra ki sanble ak epi li konpile nan yon lòt lang - Fift Assembler.
Senkyèm Asanble — Senkyèm bibliyotèk pou jenere kòd binè ègzekutabl pou TVM. Fifth Assembler pa gen yon du. Sa a .
Konpetisyon nou an ap travay
Finalman, li lè pou nou gade rezilta efò nou yo.
Chanèl peman asynchrone
Chanèl peman se yon kontra entelijan ki pèmèt de itilizatè yo voye peman deyò blockchain la. Kòm yon rezilta, ou ekonomize non sèlman lajan (pa gen okenn komisyon), men tou, tan (ou pa oblije rete tann pou pwochen blòk la dwe trete). Peman yo ka piti jan yo vle ak osi souvan sa nesesè. Nan ka sa a, pati yo pa gen konfyans youn ak lòt, depi jis nan règleman final la garanti pa kontra a entelijan.
Nou jwenn yon solisyon jistis senp pou pwoblèm nan. De pati yo ka echanje mesaj siyen, chak gen de nimewo— montan total chak pati yo peye. De nimewo sa yo travay tankou nan sistèm distribiye tradisyonèl yo epi mete lòd "te pase anvan" sou tranzaksyon yo. Sèvi ak done sa yo, kontra a pral kapab rezoud nenpòt konfli posib.
An reyalite, yon nimewo se ase aplike lide sa a, men nou kite tou de paske fason sa a nou te kapab fè yon koòdone itilizatè pi pratik. Anplis de sa, nou deside mete montan peman an nan chak mesaj. San li, si mesaj la pèdi pou kèk rezon, lè sa a, byenke tout kantite lajan yo ak kalkil final la pral kòrèk, itilizatè a ka pa remake pèt la.
Pou teste lide nou an, nou gade pou egzanp lè l sèvi avèk yon pwotokòl chanèl peman senp ak kout. Etonan, nou jwenn sèlman de:
- yon apwòch menm jan an, sèlman pou ka a nan yon chanèl unidirectional.
- , ki dekri menm lide ak nou an, men san yo pa eksplike anpil detay enpòtan, tankou kòrèkteman jeneral ak pwosedi rezolisyon konfli.
Li te vin klè ke li fè sans pou dekri pwotokòl nou an an detay, peye atansyon espesyal sou kòrèkteman li yo. Apre plizyè iterasyon, spesifikasyon la te pare, epi kounye a ou kapab tou. .
Nou aplike kontra a nan FunC, epi nou te ekri sèvis piblik liy kòmand pou kominike avèk kontra nou an antyèman nan Fift, jan òganizatè yo rekòmande. Nou te ka chwazi nenpòt lòt lang pou CLI nou an, men nou te enterese nan eseye Fit pou wè ki jan li te fè nan pratik.
Pou nou onèt, apre nou fin travay ak Fift, nou pa t 'wè okenn rezon konvenkan pito lang sa a lang popilè ak aktivman itilize ak zouti devlope ak bibliyotèk. Pwogramasyon nan yon lang ki baze sou pil se byen dezagreyab, depi ou gen toujou ap kenbe nan tèt ou sa ki sou chemine a, ak du a pa ede ak sa a.
Kidonk, nan opinyon nou, sèl jistifikasyon pou egzistans Fift se wòl li kòm yon lang lame pou Fift Assembler. Men, èske li pa ta pi bon pou entegre TVM asanble a nan kèk lang ki deja egziste, olye ke envante yon nouvo pou objektif esansyèl sa a?
TVM Haskell eDSL
Kounye a li lè pou nou pale sou dezyèm kontra entelijan nou an. Nou deside devlope yon bous milti-siyati, men ekri yon lòt kontra entelijan nan FunC ta twò raz. Nou te vle ajoute kèk gou, e se te pwòp lang asanble pa nou pou TVM.
Menm jan ak Fift Assembler, nouvo lang nou an entegre, men nou te chwazi Haskell kòm animatè olye de Fift, sa ki pèmèt nou pwofite anpil avantaj de sistèm tip avanse li a. Lè w ap travay ak kontra entelijan, kote pri a nan menm yon ti erè ka trè wo, sezisman estatik, nan opinyon nou an, se yon gwo avantaj.
Pou demontre kisa TVM assembler sanble entegre nan Haskell, nou aplike yon bous estanda sou li. Men kèk bagay ou dwe peye atansyon sou:
- Kontra sa a konsiste de yon fonksyon, men ou ka itilize otan ke ou vle. Lè ou defini yon nouvo fonksyon nan lang lame a (sa vle di Haskell), eDSL nou an pèmèt ou chwazi si ou vle li vin yon woutin separe nan TVM oswa tou senpleman enline nan pwen apèl la.
- Menm jan ak Haskell, fonksyon yo gen kalite yo tcheke nan tan konpile. Nan eDSL nou an, kalite antre nan yon fonksyon se kalite pil ke fonksyon an espere, ak kalite rezilta a se kalite pil ki pral pwodwi apre apèl la.
- Kòd la gen anotasyon
stacktype, ki dekri kalite pile espere nan pwen apèl la. Nan kontra orijinal la bous sa yo te jis kòmantè, men nan eDSL nou an yo aktyèlman yon pati nan kòd la epi yo tcheke nan tan konpile. Yo ka sèvi kòm dokiman oswa deklarasyon ki ede pwomotè a jwenn pwoblèm nan si kòd la chanje ak kalite pile a chanje. Natirèlman, anotasyon sa yo pa afekte pèfòmans ègzekutabl, paske pa gen okenn kòd TVM pwodwi pou yo. - Sa a se toujou yon pwototip ekri nan de semèn, kidonk gen toujou anpil travay yo dwe fè sou pwojè a. Pou egzanp, tout sikonstans klas ou wè nan kòd ki anba a ta dwe pwodwi otomatikman.
Men sa aplikasyon an nan yon bous multisig sanble sou eDSL nou an:
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 @Word32Ou ka jwenn tout kòd sous eDSL nou an ak kontra bous milti-siyati nou an nan E plis sou langaj bati, kòlèg nou Georgy Agapov.
Konklizyon sou konpetisyon an ak TON
An total, travay nou an te pran 380 èdtan (ki gen ladann familyarize ak dokiman, reyinyon ak devlopman aktyèl). Senk devlopè te patisipe nan pwojè konpetisyon an: CTO, dirijan ekip, espesyalis platfòm blockchain ak devlopè lojisyèl Haskell.
Nou te jwenn resous pou patisipe nan konkou a san difikilte, depi lespri yon hackathon, travay ann ekip sere, ak bezwen byen vit plonje tèt nou nan aspè nan nouvo teknoloji se toujou enteresan. Plizyè nwit san dòmi pou reyalize rezilta maksimòm nan kondisyon resous limite yo rekonpanse pa eksperyans anpil valè ak memwa ekselan. Anplis de sa, travay sou travay sa yo se toujou yon bon tès nan pwosesis konpayi an, paske li trè difisil pou reyalize rezilta vrèman desan san kominikasyon entèn ki byen fonksyone.
Lyrics akote: nou te enpresyone pa kantite travay ki te mete nan ekip TON an. Yo jere yo bati yon konplèks, bèl, ak pi enpòtan, sistèm k ap travay. TON te pwouve tèt li yo dwe yon platfòm ki gen gwo potansyèl. Sepandan, nan lòd pou ekosistèm sa a devlope, yon anpil plis bezwen fè, tou de an tèm de itilizasyon li nan pwojè blòk ak an tèm de amelyore zouti devlopman. Nou fyè pou kounye a fè pati pwosesis sa a.
Si apre ou fin li atik sa a ou toujou gen nenpòt kesyon oswa gen lide sou fason pou itilize TON pou rezoud pwoblèm ou yo, — nou pral kontan pataje eksperyans nou an.
Sous: www.habr.com
