Is dòcha gu bheil thu air an Telegram sin a chluinntinn . Ach is dòcha gu robh thu air na naidheachdan nach deach Telegram a chall o chionn fhada airson aon chÚmhnant snasail no barrachd a chuir an gnÏomh airson an à rd-Úrlar seo.
Cha bâ urrainn don sgioba Serokell, le eòlas farsaing ann a bhith aâ leasachadh phròiseactan mòra blockchain, seasamh gu aon taobh. Thug sinn còignear luchd-obrach don cho-fharpais, agus dĂ sheachdain Ă s deidh sin ghabh iad aâ chiad Ă ite ann fon fhar-ainm air thuaiream (ann) Sexy Chameleon. San artaigil seo bruidhnidh mi mu mar a rinn iad e. Tha sinn an dòchas anns na deich mionaidean a tha romhainn gun leugh thu co-dhiĂš sgeulachd inntinneach, agus aig aâ char as motha gheibh thu rudeigin feumail ann a dhâfhaodas tu a chuir a-steach nad obair.
Ach tòisichidh sinn le beagan co-theacsa.
Farpais agus a chumhachan
Mar sin, bâ e prĂŹomh ghnĂŹomhan nan com-pĂ irtichean buileachadh aon no barrachd de na cĂšmhnantan snasail a chaidh a mholadh, a bharrachd air molaidhean a dhèanamh gus eag-shiostam TON a leasachadh. Bha an fharpais aâ ruith bho 24 Sultain gu 15 DĂ mhair, agus cha deach na toraidhean ainmeachadh ach air 15 Samhain. Gu math fada, leis gu bheil Telegram air a bhith comasach aig an Ă m seo air toraidhean farpaisean a chumail agus ainmeachadh air dealbhadh agus leasachadh thagraidhean ann an C ++ airson deuchainn agus measadh cĂ ileachd gairmean VoIP ann an Telegram.
Thagh sinn dà chÚmhnant snasail bhon liosta a mhol an luchd-eagrachaidh. Airson aon dhiubh, chleachd sinn innealan air an cuairteachadh le TON, agus chaidh an dà rna fear a chuir an gnÏomh ann an cà nan Úr a chaidh a leasachadh leis na h-innleadairean againn gu sònraichte airson TON agus a chaidh a thogail a-steach do Haskell.
Chan eil roghainn cĂ nan prògramadh gnĂŹomh gun fhiosta. Anns an Bidh sinn gu tric aâ bruidhinn air carson a tha sinn den bheachd gu bheil iom-fhillteachd chĂ nanan gnĂŹomh na Ă ibheiseachadh mòr agus carson as fheĂ rr leinn san fharsaingeachd iad na feadhainn a tha ag amas air nithean. Air an t-slighe, tha e cuideachd a 'gabhail a-steach .
Carson a cho-dhĂšin sinn eadhon pĂ irt a ghabhail?
Ann an Ăšine ghoirid, leis gu bheil an speisealachadh againn mar phròiseactan neo-Ă bhaisteach agus iom-fhillte a dhâ fheumas sgilean sònraichte agus a tha gu tric de luach saidheansail don choimhearsnachd IT. Tha sinn gu lĂ idir aâ toirt taic do leasachadh stòr fosgailte agus tha sinn an sĂ s ann a bhith mòr-chòrdte, agus bidh sinn cuideachd aâ co-obrachadh le prĂŹomh oilthighean Ruiseanach ann an raon saidheans coimpiutair agus matamataig.
Bha gnĂŹomhan inntinneach na farpais agus an sĂ s anns aâ phròiseact Telegram againn annta fhèin nan deagh bhrosnachadh, ach thĂ inig aâ mhaoin duais gu bhith na bhrosnachadh a bharrachd. đ
Rannsachadh blockchain TON
Bidh sinn aâ cumail sĂšil gheur air leasachaidhean Ăšra ann an blockchain, inntleachd fuadain agus ionnsachadh innealan agus aâ feuchainn gun a bhith ag ionndrainn aon fhoillseachadh cudromach anns gach raon sa bheil sinn ag obair. Mar sin, mus do thòisich an fharpais, bha an sgioba againn eòlach mu thrĂ th air beachdan bho . Ach, mus do thòisich sinn ag obair le TON, cha do rinn sinn mion-sgrĂšdadh air na sgrĂŹobhainnean teicnigeach agus fĂŹor chòd stòr an Ă rd-Ăšrlar, agus mar sin bha aâ chiad cheum gu math follaiseach - sgrĂšdadh mionaideach air na sgrĂŹobhainnean oifigeil air agus a-staigh .
Mun à m a thòisich an fharpais, bha an còd air fhoillseachadh mu thrà th, agus mar sin gus Úine a shà bhaladh, chuir sinn romhainn coimhead airson stiÚireadh no geà rr-chunntas air a sgrÏobhadh le le luchd-cleachdaidh. Gu mÏ-fhortanach, cha tug seo toradh sam bith - a bharrachd air stiÚireadh airson an à rd-Úrlar a chuir ri chèile air Ubuntu, cha do lorg sinn stuthan sam bith eile.
Bha na sgrÏobhainnean fhèin air an deagh rannsachadh, ach bha e doirbh a leughadh ann an cuid de raointean. Gu math tric bha againn ri tilleadh gu puingean sònraichte agus atharrachadh bho thuairisgeulan à rd-Ïre de bheachdan eas-chruthach gu mion-fhiosrachadh buileachaidh aig Ïre Ïosal.
Bhiodh e na bâ fhasa mura biodh tuairisgeul mionaideach air aâ bhuileachadh idir anns an t-sònrachadh. Tha fiosrachadh mu mar a tha inneal brĂŹgheil aâ riochdachadh a chruach nas dualtaiche luchd-leasachaidh a tharraing aâ cruthachadh cĂšmhnantan snasail airson Ă rd-Ăšrlar TON na bhith gan cuideachadh.
Nix: a 'cur a' phròiseict ri chèile
Aig Serokell tha sinn nar luchd-leantainn mòr . Bidh sinn aâ cruinneachadh ar pròiseactan leis agus gan cleachdadh aâ cleachdadh , agus air a chuir a-steach air na frithealaichean againn uile . Taing dha seo, tha na togalaichean againn uile air an ath-riochdachadh agus ag obair air siostam obrachaidh sam bith air an urrainnear Nix a chuir a-steach.
Mar sin thòisich sinn le bhith aâ cruthachadh . Le cuideachadh, tha e cho sĂŹmplidh 's as urrainn dhut TON a chur ri chèile:
$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && makeThoir an aire nach fheum thu eisimeileachd sam bith a stĂ ladh. NĂŹ Nix a h-uile cĂ il dhut gu draoidheil, ge bith a bheil thu aâ cleachdadh NixOS, Ubuntu, no macOS.
Prògramachadh airson TON
Tha an còd cĂšmhnant snasail ann an LĂŹonra TON aâ ruith air an TON Virtual Machine (TVM). Tha TVM nas iom-fhillte na aâ mhòr-chuid de dhâ innealan brĂŹgheil eile, agus tha comas-gnĂŹomh gu math inntinneach aige, mar eisimpleir, faodaidh e obrachadh leis leantainneachd и ceanglaichean gu dĂ ta.
A bharrachd air an sin, chruthaich na balaich bho TON trÏ cà nanan prògramaidh Úra:
Còigeamh na chà nan prògramadh stac uile-choitcheann a tha coltach . Is e an sà r chomas aige an comas eadar-obrachadh le TVM.
FunC na chà nan prògramadh cÚmhnant snasail a tha coltach ri agus tha e air a chur ri chèile ann an cà nan eile - Fift Assembler.
An còigeamh fear-cruinneachaidh - Còigeamh leabharlann airson còd gnÏomh dà -chà nanach a ghineadh airson TVM. Chan eil inneal-cruinneachaidh aig Fifth Assembler. Seo .
Bidh ar farpais ag obair
Mu dheireadh, tha an t-Ă m ann coimhead air toraidhean ar n-oidhirpean.
Sianal pĂ ighidh asyncronach
Is e cĂšmhnant snasail a thâ ann an sianal pĂ ighidh a leigeas le dĂ neach-cleachdaidh pĂ ighidhean a chuir taobh a-muigh an blockchain. Mar thoradh air an sin, bidh thu a âsĂ bhaladh chan e a-mhĂ in airgead (chan eil coimisean ann), ach cuideachd Ăšine (chan fheum thu feitheamh gus an ath bhloc a phròiseasadh). Faodaidh pĂ ighidhean a bhith cho beag 'sa tha iad ag iarraidh agus cho tric' sa tha feum air. Anns a 'chĂšis seo, chan fheum na pĂ rtaidhean earbsa a bhith ann an cĂ ch a chèile, oir tha cothromachd an tuineachaidh mu dheireadh air a ghealltainn leis a' chĂšmhnant snasail.
Lorg sinn fuasgladh gu math sĂŹmplidh don duilgheadas. Faodaidh dĂ phĂ rtaidh teachdaireachdan soidhnichte iomlaid, gach fear le dĂ Ă ireamh - an t-suim iomlan a phĂ igh gach pĂ rtaidh. Bidh an dĂ Ă ireamh seo ag obair mar ann an siostaman sgaoilte traidiseanta agus shuidhich iad an òrdugh âa thachair roimheâ air gnothaichean. Aâ cleachdadh an dĂ ta seo, bidh e comasach don chĂšmhnant còmhstri sam bith fhuasgladh.
Gu dearbh, tha aon Ă ireamh gu leòr airson a 'bheachd seo a chur an gnĂŹomh, ach dh' fhĂ g sinn an dĂ chuid oir mar seo b 'urrainn dhuinn eadar-aghaidh cleachdaiche nas goireasaiche a dhèanamh. A bharrachd air an sin, chuir sinn romhainn an t-suim pĂ ighidh a thoirt a-steach do gach teachdaireachd. Ăs aonais, ma thèid an teachdaireachd a chall airson adhbhar air choireigin, an uairsin, ged a bhios na suimean uile agus an Ă ireamhachadh deireannach ceart, is dòcha nach mothaich an neach-cleachdaidh an call.
Gus ar beachd a dhearbhadh, choimhead sinn airson eisimpleirean de bhith aâ cleachdadh protocol seanail pĂ ighidh cho sĂŹmplidh agus cho mionaideach. Gu h-iongantach, cha do lorg sinn ach dĂ :
- dòigh-obrach coltach ris, dÏreach airson sianal aon-stiÚiridh.
- , a tha aâ toirt cunntas air an aon bheachd ris an fhear againn, ach gun a bhith aâ mĂŹneachadh mòran mion-fhiosrachaidhean cudromach, leithid ceartachd choitcheann agus modhan fuasglaidh còmhstri.
Dh'fhĂ s e soilleir gu bheil e ciallach cunntas mionaideach a thoirt air ar protocol, aâ toirt aire shònraichte do cheartachd. Ăs deidh grunn thursan, bha an sònrachadh deiseil, agus a-nis faodaidh tu cuideachd. .
Chuir sinn an cĂšmhnant an gnĂŹomh ann am FunC, agus sgrĂŹobh sinn goireas na loidhne-Ă ithne airson a bhith ag eadar-obrachadh leis aâ chĂšmhnant againn gu tur ann am Fift, mar a mhol an luchd-eagrachaidh. Dhâ fhaodadh sinn a bhith air cĂ nan sam bith eile a thaghadh airson ar CLI, ach bha Ăšidh againn ann a bhith aâ feuchainn Fit gus faicinn mar a rinn e ann an cleachdadh.
Gus a bhith onarach, Ă s deidh dhuinn a bhith ag obair le Fift, chan fhaca sinn adhbharan lĂ idir airson a bhith nas fheĂ rr leis aâ chĂ nan seo na cĂ nanan mòr-chòrdte agus gnĂŹomhach le innealan leasaichte agus leabharlannan. Tha prògramadh ann an cĂ nan stèidhichte air stac gu math mĂŹ-thlachdmhor, oir feumaidh tu an-còmhnaidh na tha air aâ chruach a chumail nad cheann, agus chan eil an compiler aâ cuideachadh le seo.
Mar sin, nar beachd, is e an aon fhĂŹreanachadh airson Fift a bhith ann a dhreuchd mar chĂ nan aoigheachd airson Fift Assembler. Ach nach biodh e na bâ fheĂ rr an inneal-cruinneachaidh TVM fhighe a-steach do chĂ nan a thâ ann mar-thĂ , seach cĂ nan Ăšr a chruthachadh airson an aon adhbhar seo?
TVM Haskell eDSL
A-nis tha an t-Ă m ann bruidhinn mun dĂ rna cĂšmhnant snasail againn. Cho-dhĂšin sinn wallet ioma-ainm-sgrĂŹobhte a leasachadh, ach bhiodh sgrĂŹobhadh cĂšmhnant snasail eile ann am FunC ro thrang. Bha sinn airson beagan blas a chuir ris, agus bâ e sin ar cĂ nan cruinneachaidh fhèin airson TVM.
Coltach ri Fift Assembler, tha ar cĂ nan Ăšr freumhaichte, ach thagh sinn Haskell mar an aoigh an Ă ite Fift, aâ toirt cothrom dhuinn lĂ n bhuannachd a ghabhail den t-siostam seòrsa adhartach aige. Nuair a bhios tu ag obair le cĂšmhnantan snasail, far am faod cosgais eadhon mearachd bheag a bhith gu math Ă rd, tha clò-sgrĂŹobhadh statach, nar beachd, na bhuannachd mhòr.
Gus sealltainn cò ris a tha assembler TVM coltach freumhaichte ann an Haskell, chuir sinn wallet à bhaisteach an gnÏomh air. Seo beagan rudan airson aire a thoirt dhaibh:
- Tha aon ghnĂŹomh anns aâ chĂšmhnant seo, ach faodaidh tu nas urrainn dhut a chleachdadh. Nuair a mhĂŹnicheas tu gnĂŹomh Ăšr sa chĂ nan aoigheachd (ie Haskell), leigidh an eDSL againn dhut taghadh a bheil thu airson gum bi e na chleachdadh air leth ann an TVM no dĂŹreach air a lĂŹnigeadh aig aâ phuing gairm.
- Coltach ri Haskell, tha seòrsachan aig gnĂŹomhan a thèid a sgrĂšdadh aig Ă m cruinneachaidh. Anns an eDSL againn, is e an seòrsa cuir a-steach gnĂŹomh an seòrsa stac ris a bheil dĂšil aig aâ ghnĂŹomh, agus is e an seòrsa toraidh an seòrsa stac a thèid a thoirt a-mach Ă s deidh a âghairm.
- Tha notaichean air aâ chòd
stacktype, aâ toirt cunntas air an t-seòrsa stac ris a bheil dĂšil aig aâ phuing gairm. Anns aâ chĂšmhnant wallet tĂšsail bâ e dĂŹreach beachdan a bhâ annta, ach anns an eDSL againn tha iad dha-rĂŹribh mar phĂ irt den chòd agus thathas gan sgrĂšdadh aig Ă m cruinneachaidh. Faodaidh iad a bhith nan sgrĂŹobhainnean no aithrisean a chuidicheas an leasaiche gus an duilgheadas a lorg ma dhâ atharraicheas an còd agus ma dhâ atharraicheas an seòrsa stac. Gu dearbh, chan eil na notaichean sin aâ toirt buaidh air coileanadh Ăšine ruith, leis nach eil còd TVM air a chruthachadh dhaibh. - Tha seo fhathast na prototype sgrĂŹobhte ann an dĂ sheachdain, agus mar sin tha tòrr obair ri dhèanamh fhathast air aâ phròiseact. Mar eisimpleir, bu chòir a h-uile suidheachadh de na clasaichean a chĂŹ thu sa chòd gu h-ĂŹosal a chruthachadh gu fèin-ghluasadach.
Seo mar a tha buileachadh wallet multisig coltach air an eDSL againn:
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 @Word32Gheibhear còd stòr iomlan ar eDSL agus cÚmhnant wallet ioma-ainm-sgrÏobhte aig Agus barrachd mu chà nanan togte, ar co-obraiche Georgy Agapov.
Co-dhĂšnaidhean mun cho-fharpais agus TON
Uile gu lèir, thug ar n-obair 380 uair (aâ gabhail a-steach eòlas air sgrĂŹobhainnean, coinneamhan agus fĂŹor leasachadh). Ghabh còignear luchd-leasachaidh pĂ irt anns aâ phròiseact farpais: CTO, stiĂšir sgioba, eòlaichean Ă rd-Ăšrlar blockchain agus luchd-leasachaidh bathar-bog Haskell.
Lorg sinn goireasan airson pà irt a ghabhail san fharpais gun duilgheadas, leis gu bheil spiorad hackathon, obair-sgioba dlÚth, agus an fheum air sinn fhèin a bhogadh gu sgiobalta ann an taobhan de theicneòlasan Úra an-còmhnaidh brosnachail. Tha grunn oidhcheannan gun chadal gus na toraidhean as à irde a choileanadh ann an suidheachaidhean de ghoireasan cuibhrichte air an dÏoladh le eòlas luachmhor agus deagh chuimhneachain. A bharrachd air an sin, tha a bhith ag obair air na gnÏomhan sin an-còmhnaidh na dheagh dheuchainn air pròiseasan na companaidh, leis gu bheil e air leth duilich toraidhean fÏor mhath a choileanadh às aonais conaltradh a-staigh ag obair gu math.
Lyrics gu aon taobh: bha an obair a chuir sgioba TON air leth toilichte leinn. Chaidh aca air siostam obrachaidh iom-fhillte, brèagha, agus as cudromaiche, a thogail. Tha TON air dearbhadh gu bheil e na à rd-Úrlar le comas mòr. Ach, gus an tèid an eag-shiostam seo a leasachadh, feumar tòrr a bharrachd a dhèanamh, an dà chuid a thaobh a bhith ga chleachdadh ann am pròiseactan blockchain agus a thaobh leasachadh innealan leasachaidh. Tha sinn moiteil a bhith mar phà irt den phròiseas seo a-nis.
Ma tha ceist sam bith agad fhathast às deidh dhut an artaigil seo a leughadh no ma tha beachdan agad air mar a chleachdas tu TON gus na duilgheadasan agad fhuasgladh, - bidh sinn toilichte ar n-eòlas a cho-roinn.
Source: www.habr.com
