Airson ceithir mìosan a-nis tha mi air a bhith ag obair air pròiseact leis an t-ainm “Leasachadh innealan dìon dàta agus riaghlaidh ann an roinnean riaghaltais is gnìomhachais stèidhichte air blockchain.”
A-nis bu mhath leam innse dhut mu mar a thòisich mi air a 'phròiseact seo, agus a-nis bheir mi cunntas mionaideach air còd a' phrògraim.
Is e seo a’ chiad artaigil ann an sreath de artaigilean. An seo tha mi a 'toirt cunntas air an fhrithealaiche agus am protocol. Gu dearbh, faodaidh an leughadair eadhon na dreachan aige fhèin de na h-eileamaidean blockchain sin a sgrìobhadh.
An-uiridh, aig an Digital Breakthrough hackathon, thàinig iad suas le beachd siostam feumail a dhèanamh airson gnìomhachas agus an eaconamaidh dhidseatach a’ cleachdadh teicneòlas leabhar-cunntais sgaoilte; chaidh tabhartas a thoirt seachad cuideachd airson leasachadh leis a’ Mhaoin Taic Ùr-ghnàthachaidh (bu chòir dhomh sgrìobhadh air leth. artaigil mun tabhartas, dhaibhsan a tha dìreach a’ tòiseachadh a’ dèanamh startups ), agus a-nis ann an òrdugh.
Bidh leasachadh a’ tachairt anns a’ chànan Go, agus is e LevelDB an stòr-dàta anns a bheil na blocaichean air an stòradh.
Is e na prìomh phàirtean am pròtacal, am frithealaiche (a bhios a ’ruith TCP agus WebSocket - a’ chiad fhear airson sioncronadh a dhèanamh air an blockchain, an dàrna fear airson luchd-dèiligidh a cheangal, gnothaichean a chuir agus òrdughan bho JavaScript, mar eisimpleir.
Mar a chaidh ainmeachadh, tha feum air an blockchain seo gu sònraichte gus iomlaid thoraidhean eadar solaraichean agus luchd-ceannach a dhèanamh fèin-ghluasadach agus a dhìon, no an dà chuid ann an aon neach. Chan eil na daoine sin ann an cabhag gus earbsa a chur ann an chèile. Ach chan e a-mhàin an obair “leabhar-sgrùdaidh” a chruthachadh le àireamhair togte, ach siostam a nì fèin-ghluasad air a ’mhòr-chuid de na gnìomhan àbhaisteach a thig am bàrr nuair a bhios tu ag obair le cearcall beatha toraidh. Tha am bytecode a tha an urra ris a’ chùis seo, mar a tha àbhaisteach le blockchains, air a stòradh ann an cuir a-steach agus toraidhean ghnothaichean (tha na gnothaichean fhèin air an stòradh ann am blocaichean, tha na blocaichean ann an LevelDB air an còdachadh ro-làimh ann an cruth GOB). An toiseach, bruidhnidh sinn mun phròtacal agus an fhrithealaiche (aka nód).
Chan eil am protocol iom-fhillte, is e a phuing gu lèir a bhith ag atharrachadh gu modh luchdachadh cuid de dhàta, mar as trice bloc no malairt, mar fhreagairt do loidhne-àithne sònraichte, agus tha feum air cuideachd airson iomlaid clàr-seilbhe, gus am bi fios aig an nód cò e. ceangailte ris agus mar a tha gnìomhachas aca ri dhèanamh (canar “neighbouring” ris na nodan a tha ceangailte airson an t-seisean sioncronaidh leis gu bheil fios air an IP aca agus gu bheil an dàta stàite aca air a stòradh mar chuimhneachan).
Canar pasganan ri pasganan (seòlaidhean mar a chanas Linux riutha) ann an tuigse prògramadairean Go, agus mar sin aig toiseach gach faidhle le còd Go bhon eòlaire seo bidh iad a’ sgrìobhadh pasgan folder_name_where_this_file suidhichte. Rud eile, cha bhith e comasach dhut am pasgan a bhiadhadh don neach-cruinneachaidh. Uill, chan eil seo na dhìomhaireachd dhaibhsan aig a bheil eòlas air a’ chànan seo. Seo na pacaidean:
- Conaltradh lìonra (frithealaiche, teachdaiche, protocol)
- Structar dàta air a stòradh agus air a ghluasad (bloc, malairt)
- Stòr-dàta (blockchain)
- Co-aontachd
- Inneal mas-fhìor air a chruachadh (xvm)
- Auxiliary (crypto, seòrsaichean) tha sin uile airson a-nis.
Is e dreach foghlaim a tha seo, chan eil eadar-obrachadh eadar-phròiseasan ann agus grunn phàirtean deuchainneach, ach tha an structar a rèir an fhear air a bheil leasachadh ga dhèanamh. Ma tha dad agad ri mholadh anns na beachdan, bidh mi toilichte aire a thoirt dha ann an tuilleadh leasachaidh. Agus a-nis airson mìneachadh air an fhrithealaiche agus protocol.
Bheir sinn sùil air an fhrithealaiche an toiseach.
Bidh fo-riaghailt an fhrithealaiche ag obair mar fhrithealaiche dàta a bhios a 'ruith air mullach a' phròtacail TCP a 'cleachdadh structaran dàta bhon phasgan protocol.
Bidh an cleachdadh àbhaisteach a’ cleachdadh na pacaidean a leanas: frithealaiche, protocol, seòrsa. Anns a 'phacaid fhèin tcp_server.go tha structar dàta ann Dèan frithealaidh.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
Faodaidh e gabhail ris na paramadairean a leanas:
- Port lìonra tron tèid dàta a iomlaid
- Faidhle rèiteachaidh an fhrithealaiche ann an cruth JSON
- Bratach airson ruith ann am modh deasbaid (blockchain prìobhaideach)
Adhartas:
- Leughadh rèiteachadh bho fhaidhle JSON
- Tha bratach modh deasbaid air a sgrùdadh: ma tha e air a shuidheachadh, chan eil clàr-ama sioncronaidh an lìonraidh air a chuir air bhog agus chan eil an blockchain air a luchdachadh
- A 'tòiseachadh air an structar dàta rèiteachaidh agus a' tòiseachadh air an fhrithealaiche
Server
- A’ cur air bhog am frithealaiche TCP agus eadar-obrachadh lìonra a rèir a’ phròtacal.
- Tha structar dàta Serve aige air a dhèanamh suas de àireamh port, meud bufair agus puing don structar seòrsaichean.Settings
- Bidh an dòigh Run a’ tòiseachadh eadar-obrachadh lìonra (ag èisteachd airson ceanglaichean a tha a’ tighinn a-steach air port sònraichte, nuair a gheibhear ceangal ùr, thèid a ghiullachd a ghluasad chun dòigh làimhseachaidh prìobhaideach ann an snàithlean ùr)
- В làimhseachadh tha dàta bhon cheangal air a leughadh gu bufair, air a thionndadh gu riochdachadh sreang agus air a chuir gu protocol.Choice
- protocol.Choice a' tilleadh thoradh air no ag adhbhrachadh mearachd. thoradh air an uairsin air a ghluasad gu protocol.Interpretea thilleas eadar-theachd - seòrsa de stuth Eadar-theangachadh Dàta, no ag adhbhrachadh mearachd ann a bhith a’ làimhseachadh toradh an taghaidh
- An uairsin tha an tionndadh air a chuir gu bàs intrpr.commands[0] a nì sgrùdadh air aon de: toradh, inv, mearachd agus tha earrann ann default
- Anns an earrainn thoradh air lorgar suidse a rèir luach intrpr.commands[1] a tha a’ sgrùdadh nan luachan fad bufair и dreach (anns gach cùis canar an gnìomh co-fhreagarrach)
Feartan Faigh Tionndadh и Fad Bufair tha anns an fhaidhle srvlib.go pasgan frithealaiche
GetVersion(conn net.Conn, version string)
bidh e dìreach a’ clò-bhualadh chun consol agus a ’cur an dreach a chaidh a chuir seachad sa pharameter chun neach-dèiligidh:
conn.Write([]byte("result:" + version))
.
gnìomh
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
a 'luchdachadh bloc, malairt, no dàta sònraichte eile mar a leanas:
- Clò-bhuail don consol an seòrsa dàta a tha air a shònrachadh sa phròtacal ris am feumar gabhail:
fmt.Println("DataType:", intrpr.Commands[2])
- Leughadh an luach intrpr.Body gu caochladair àireamhach buf_len
- A 'cruthachadh bufair ùr-buf meud ainmichte:
make([]byte, buf_len)
- A’ cur freagairt ceart gu leòr:
conn.Write([]byte("result:ok"))
- A’ lìonadh a’ bhufair bhon t-sruth leughaidh gu tur:
io.ReadFull(conn, newbuf)
.
- Clò-bhuail susbaint a’ bhufair chun chonsail
fmt.Println(string(newbuf))
agus an àireamh bytes a chaidh a leughadh
fmt.Println("Bytes length:", n)
- A’ cur freagairt ceart gu leòr:
conn.Write([]byte("result:ok"))
Tha dòighean bhon phasgan frithealaiche air an rèiteachadh gus dàta a fhuaireadh a phròiseasadh a’ cleachdadh gnìomhan bhon phacaid protocol.
Pròtacal
Tha protocol a 'frithealadh mar dhòigh a tha a' riochdachadh dàta ann an iomlaid lìonra.
Roghainn (str string) (sreang, mearachd) a’ coileanadh prìomh ghiollachd dàta a gheibh an frithealaiche, a’ faighinn riochdachadh sreang den dàta mar chur-a-steach agus a’ tilleadh sreang a chaidh ullachadh airson Eadar-theangair:
- Tha an sreang cuir a-steach air a roinn ann an cleachdadh ceann is bodhaig ReqParseN2(str)
- tha ceann air a roinn ann an eileamaidean agus air a chuir ann an sliseag òrdughan a’ cleachdadh ReqParseHead (ceann)
- В suidse (àitheantan[0]) tagh an àithne a fhuaireadh (cmd, iuchair, seòladh no tha an earrann air a phiobrachadh default)
- Tha 2 àithne air an sgrùdadh ann an cmd suidse (òrdughan [1]) - fad и faighinn tionndadh.
- fhad a’ sgrùdadh an seòrsa dàta a-steach òrduighean[2] agus ga shàbhaladh a-steach seòrsa dàta
- A’ dèanamh sgrùdadh air sin buidheann tha luach sreang ann
len(body) < 1
- A’ tilleadh an t-sreath fhreagairtean:
"result:bufferlength:" + datatype + "/" + body
- faighinn tionndadh a 'tilleadh sreang
return "result:version/auto"
Eadar-theangair
A’ gabhail a-steach structar InterpreteData agus a’ coileanadh giullachd àrd-sgoile air an dàta a chaidh a thilleadh roghainn sreathan agus cruthachadh stuthan Eadar-theangachadh Dàta.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
gnìomh
Interprete(str string) (*InterpreteData, error)
a' gabhail ri sreang thoradh air agus a’ cruthachadh agus a’ tilleadh iomradh air an nì Eadar-theangachadh Dàta.
Adhartas:
- San aon dòigh roghainn tha ceann agus corp air an toirt a-mach le bhith a’ cleachdadh ReqParseN2(str)
- Tha an ceann air a roinn ann an eileamaidean a 'cleachdadh ReqParseHead (ceann)
- Tha an nì air a thòiseachadh Eadar-theangachadh Dàta agus tha comharradh air a thoirt air ais :
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
Tha an nì seo air a chleachdadh ann an frithealaiche.go prìomh phacaid.
Client
Anns a’ phacaid teachdaiche tha na gnìomhan TCPConnect и Dàta freagairt TCPR.
gnìomh
TCPConnect(s *types.Settings, data []byte, payload []byte)
ag obair mar seo:
- Tha ceangal ga dhèanamh ris a’ cheangal a tha air a shònrachadh ann an nì nan roghainnean a chaidh seachad
net.Dial("tcp", s.Host + ":" + s.Port)
- Tha an dàta a thèid seachad anns a’ pharamadair dàta air a ghluasad:
conn.Write(data)
- Tha am freagairt air a leughadh
resp, n, _ := TCPResponseData(conn, s.BufSize)
agus air a chlò-bhualadh air a’ chonsail
fmt.Println(string(resp[:n]))
- Ma thèid a ghluasad luchd-pàighidh an uairsin ga thoirt seachad
conn.Write(payload)
agus cuideachd a 'leughadh freagairt an fhrithealaiche, ga chlò-bhualadh chun a' chonsail
gnìomh
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
a’ cruthachadh bufair den mheud ainmichte, a’ leughadh freagairt an fhrithealaiche an sin agus a’ tilleadh am bufair seo agus an àireamh de bytes a chaidh a leughadh, a bharrachd air nì mearachd.
Fo-riaghailt teachdaiche
A’ frithealadh òrdughan a chuir gu frithealaichean nód, a bharrachd air staitistig ghoirid agus deuchainn fhaighinn.
Gabhaidh iad ris na paramadairean a leanas: faidhle rèiteachaidh ann an cruth JSON, dàta ri chuir chun t-seirbheisiche mar shreang, slighe chun fhaidhle a thèid a chuir gu uallach pàighidh, bratach aithris clàr-ama nód, seòrsa dàta air a ghluasad mar luach àireamhach.
- A 'faighinn an rèiteachaidh
st := types.ParseConfig(*config)
- Ma thèid bratach an emu seachad, tòisichidh e sguabadair
- Ma thèid am bratach f a tha a’ comharrachadh an t-slighe chun fhaidhle a thoirt seachad, luchdaichidh sinn an dàta aige a-steach fdb agus thèid an susbaint a chuir chun t-seirbheisiche
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- Mura h-eil am faidhle air a shònrachadh, tha an dàta bhon bhratach dìreach air a chuir -d:
client.TCPConnect(st, []byte(*data), nil)
Tha seo uile na riochdachadh nas sìmplidhe a’ sealltainn structar a’ phròtacail. Rè leasachadh, tha an comas-gnìomh riatanach air a chur ris an structar aige.
Anns an dàrna pàirt bruidhnidh mi mu structaran dàta airson blocaichean agus gnothaichean, ann an 3 mun t-seirbheisiche WebSocket airson ceangal bho JavaScript, ann an 4 bheir mi sùil air a’ chlàr sioncronaidh, an uairsin inneal stac a bhios a’ pròiseasadh bytecode bho chuir a-steach agus toraidhean, cryptography agus pools airson toraidhean.
Source: www.habr.com