Izinyanga ezine manje ngisebenza kuphrojekthi ebizwa ngokuthi "Ukuthuthukiswa kwamathuluzi okuvikela idatha kanye nokuphatha kuhulumeni kanye nezimboni ezisekelwe ku-blockchain."
Manje ngithanda ukukutshela ukuthi ngaqala kanjani le phrojekthi, futhi manje ngizochaza ikhodi yohlelo ngokuningiliziwe.
Lesi isihloko sokuqala ochungechungeni lwezihloko. Lapha ngichaza iseva nephrothokholi. Eqinisweni, umfundi angakwazi ngisho nokubhala izinguqulo zakhe zalezi zici ze-blockchain.
Ngonyaka odlule, ku-Digital Breakthrough hackathon, baqhamuke nombono wokwenza uhlelo oluwusizo lwemboni kanye nomnotho wedijithali kusetshenziswa ubuchwepheshe beleja esabalalisiwe; uxhaso lwaphinde lwakhishwa ukuze kuthuthukiswe i-Innovation Assistance Fund (kufanele ngibhale okwehlukile isihloko esimayelana nesibonelelo, salabo abasaqala ukuqalisa ), futhi manje ngohlelo.
Ukuthuthukiswa kwenzeka ngolimi lwe-Go, kanye nesizindalwazi lapho amabhulokhi agcinwa khona yi-LevelDB.
Izingxenye eziyinhloko ziyi-protocol, iseva (esebenzisa i-TCP ne-WebSocket - eyokuqala yokuvumelanisa i-blockchain, eyesibili yokuxhuma amaklayenti, ukuthumela ukuthengiselana nemiyalo evela ku-JavaScript, isibonelo.
Njengoba kushiwo, le blockchain iyadingeka ngokuyinhloko ukwenza ngokuzenzakalelayo nokuvikela ukushintshaniswa kwemikhiqizo phakathi kwabahlinzeki namakhasimende, noma kokubili kumuntu oyedwa. Laba bantu abajahile ukuthembana. Kodwa umsebenzi awukona nje ukudala "ibhuku lokuhlola" elinesibali esakhelwe ngaphakathi, kodwa isistimu eyenza ngokuzenzakalelayo imisebenzi eminingi evamile ephakama lapho usebenza nomjikelezo wokuphila womkhiqizo. I-bytecode enesibopho salolu daba, njengoba kuwumkhuba kuma-blockchains, igcinwa kokokufaka kanye nokuphumayo kokuthengiselana (imisebenzi ngokwayo igcinwa kumabhulokhi, amabhulokhi ku-LevelDB afakwe ikhodi ngaphambili ngefomethi ye-GOB). Okokuqala, ake sikhulume ngephrothokholi kanye neseva (i-aka node).
I-protocol ayiyona inkimbinkimbi, iphuzu layo lonke ukushintshela kumodi yokulayisha idatha ethile, ngokuvamile i-block noma ukuthengiselana, ngokuphendula umugqa womyalo okhethekile, futhi kuyadingeka ukushintshanisa i-inventory, ukuze i-node yazi ukuthi ubani ixhunywe kuyo nokuthi banebhizinisi okumele balenze kanjani (amanodi axhunywe kuseshini yokuvumelanisa abuye abizwe ngokuthi βumakhelwaneβ ngoba i-IP yabo iyaziwa futhi idatha yabo yesimo igcinwa kumemori).
Amafolda (imibhalo njengoba i-Linux iwabiza kanjalo) ekuqondeni kwabahleli bezinhlelo ze-Go abizwa ngokuthi amaphakheji, ngakho ekuqaleni kwefayela ngalinye elinekhodi ye-Go kusuka kulolu hlu lwemibhalo babhala iphakheji ifolda_name_where_this_file itholakala. Uma kungenjalo, ngeke ukwazi ukuphakela iphakheji kumhlanganisi. Hhayi-ke lokhu akusiyo imfihlo kulabo abalwazi lolu limi. Lawa ngamaphakheji:
- Ukuxhumana kwenethiwekhi (iseva, iklayenti, iphrothokholi)
- Izakhiwo zedatha egciniwe nedluliswayo (block, transaction)
- Isizindalwazi (blockchain)
- Ukuvumelana
- Umshini we-virtual ostakiwe (xvm)
- I-Axiliary (crypto, izinhlobo) yilokho okwamanje.
Lena inguqulo yezemfundo, ayinakho ukusebenzisana phakathi kwezinqubo kanye nezingxenye ezimbalwa zokuhlola, kodwa isakhiwo sihambisana naleyo ukuthuthukiswa okwenziwa kuyo. Uma unokuthile ongakuphakamisa kumazwana, ngizojabula ukukucabangela ekuthuthukisweni okuqhubekayo. Futhi manje ngencazelo yeseva kanye protocol.
Ake sibheke iseva kuqala.
I-subroutine yeseva isebenza njengeseva yedatha esebenza phezulu kwephrothokholi ye-TCP isebenzisa izakhiwo zedatha ezivela kuphakheji yephrothokholi.
Inqubo isebenzisa amaphakheji alandelayo: Iseva, protocol, izinhlobo. Ephaketheni ngokwalo tcp_server.go iqukethe ukwakheka kwedatha Khonza.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
Ingamukela amapharamitha alandelayo:
- Imbobo yenethiwekhi lapho idatha izoshintshwa khona
- Ifayela lokumisa iseva ngefomethi ye-JSON
- Hlaba umkhosi ngokusebenza kumodi yokususa iphutha (i-blockchain yangasese)
Inqubekelaphambili:
- Ifunda ukucushwa kufayela le-JSON
- Ifulegi lemodi yokulungisa iphutha liyahlolwa: uma lisethiwe, isihleli sokuvumelanisa inethiwekhi asiqaliswa futhi i-blockchain ayilayishwa.
- Ukuqalisa ukwakheka kwedatha yokumisa nokuqalisa iseva
Iseva
- Yethula ukwethulwa kweseva ye-TCP nokusebenzisana kwenethiwekhi ngokuhambisana nephrothokholi.
- Inesakhiwo sedatha Sesevisi esihlanganisa inombolo yembobo, usayizi webhafa kanye nesikhombi esakhiweni izinhlobo.Izilungiselelo
- Indlela ye-Run iqala ukusebenzisana kwenethiwekhi (ukulalela uxhumo olungenayo endaweni ethile, lapho uxhumano olusha lwamukelwe, ukucutshungulwa kwalo kudluliselwa endleleni yokubamba yangasese kuchungechunge olusha)
- Π phatha idatha esuka ekuxhumekeni ifundwa ibe isigcinalwazi, iguqulelwe ekubeni ifanekiselo yeyunithi yezinhlamvu futhi idluliselwe kuyo protocol.Inketho
- protocol.Inketho izimbuyiselo umphumela noma kubangela iphutha. umphumela bese idluliselwa ku iphrothokholi.Tolikaelibuyayo intrpr - into yohlobo HumushaData, noma ibangele iphutha ekucubunguleni umphumela wokukhetha
- Khona-ke iswishi ikhishwa I-intrpr.Commands[0] ehlola okukodwa kwalokhu: umphumela, i-inv, iphutha futhi kukhona isigaba ezenzakalelayo
- Esigabeni umphumela ukushintsha kutholwa ngenani I-intrpr.Commands[1] ehlola amanani ubude be-buffer ΠΈ Version (kwisimo ngasinye umsebenzi ohambisanayo ubizwa ngokuthi)
Imisebenzi GetVersion ΠΈ BufferUbude zikufayela srvlib.go iphakheji yeseva
GetVersion(conn net.Conn, version string)
imane iphrinte kukhonsoli futhi ithumele inguqulo edluliselwe kupharamitha kuklayenti:
conn.Write([]byte("result:" + version))
.
Umsebenzi
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
ilayisha ibhulokhi, umsebenzi, noma enye idatha ethile ngendlela elandelayo:
- Iphrinta kukhonsoli uhlobo lwedatha ecaciswe kuphrothokholi edinga ukwamukelwa:
fmt.Println("DataType:", intrpr.Commands[2])
- Ufunda inani I-intrpr.Body kuya kokuguquguquka kwezinombolo buf_len
- Idala ibhafa newbuf usayizi oshiwo:
make([]byte, buf_len)
- Ithumela impendulo ok:
conn.Write([]byte("result:ok"))
- Igcwalisa ngokuphelele isigcinalwazi kusukela ekusakazeni okufundiwe:
io.ReadFull(conn, newbuf)
.
- Iphrinta okuqukethwe kwebhafa kukhonsoli
fmt.Println(string(newbuf))
kanye nenani lamabhayithi afundiwe
fmt.Println("Bytes length:", n)
- Ithumela impendulo ok:
conn.Write([]byte("result:ok"))
Izindlela ezisuka kuphakheji yeseva zilungiselelwe ukucubungula idatha eyamukelwe kusetshenziswa imisebenzi evela kuphakheji protocol.
uHlelo Lokudlulisa
Iphrothokholi isebenza njengendlela emelela idatha ekuhwebeni kwenethiwekhi.
Inketho(iyunithi yezinhlamvu) (intambo, iphutha) yenza ukucubungula okuyinhloko kwedatha etholwe iseva, ithola ukumelwa kweyunithi yezinhlamvu yedatha njengokufakiwe futhi ibuyisela iyunithi yezinhlamvu elungiselelwe Umtoliki:
- Iyunithi yezinhlamvu yokufaka ihlukaniswa ibe ikhanda nomzimba kusetshenziswa I-ReqParseN2(str)
- ikhanda lihlukaniswa libe izakhi bese lifakwa kucezu lwemiyalo kusetshenziswa i-ReqParseHead(ikhanda)
- Π shintsha(imiyalo[0]) khetha umyalo owamukelwe (cmd, ukhiye, ikheli noma isigaba sicushiwe ezenzakalelayo)
- Imiyalo emi-2 ihlolwe ku-cmd switch(commands[1]) - ubude ΠΈ inguquko.
- ubude ihlola uhlobo lwedatha imiyalo[2] futhi uyigcine phakathi i-datatype
- Ihlola lokho umzimba iqukethe inani leyunithi yezinhlamvu
len(body) < 1
- Ibuyisela uchungechunge lwempendulo:
"result:bufferlength:" + datatype + "/" + body
- inguquko ibuyisela intambo
return "result:version/auto"
Umtoliki
Iqukethe ukwakheka kwe-InterpreteData futhi yenza ukucutshungulwa kwesibili kwedatha ebuyiswa kuyo Choice izintambo nokwakheka kwezinto HumushaData.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
Umsebenzi
Interprete(str string) (*InterpreteData, error)
yamukela intambo umphumela futhi idale futhi ibuyisele ireferensi entweni HumushaData.
Inqubekelaphambili:
- Ngokufanayo Choice ikhanda nomzimba kukhishwa kusetshenziswa I-ReqParseN2(str)
- ikhanda lihlukaniswe libe izakhi kusetshenziswa I-ReqParseHead(ikhanda)
- Into iyaqalwa HumushaData bese kubuyiselwa inkomba kuyo.
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
Le nto isetshenziswa ku iseva.go iphakethe main.
Client
Iphakheji yeklayenti iqukethe imisebenzi TCPConnect ΠΈ TCPResponseData.
Umsebenzi
TCPConnect(s *types.Settings, data []byte, payload []byte)
isebenza kanje:
- Uxhumo lwenziwa ekuxhumekeni okucaciswe entweni yezilungiselelo ezidlulisiwe
net.Dial("tcp", s.Host + ":" + s.Port)
- Idatha edluliselwe kupharamitha yedatha idluliswa:
conn.Write(data)
- Impendulo ifundiwe
resp, n, _ := TCPResponseData(conn, s.BufSize)
futhi iphrintwe kukhonsoli
fmt.Println(string(resp[:n]))
- Uma kudluliselwa ukukhokhela bese eyidlulisela phambili
conn.Write(payload)
futhi ifunda impendulo yeseva, iyiphrinte kukhonsoli
Umsebenzi
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
idala isigcinalwazi sosayizi oshiwo, ifunda impendulo yeseva lapho bese ibuyisela lesi sigcinalwazi kanye nenani lamabhayithi afundiwe, kanye nento yephutha.
I-subroutine yeklayenti
Isebenzela ukuthumela imiyalo kumaseva e-node, kanye nokuthola izibalo ezimfushane nokuhlola.
Ingamukela amapharamitha alandelayo: ifayela lokumisa ngefomethi ye-JSON, idatha ezothunyelwa kuseva njengeyunithi yezinhlamvu, indlela eya efayeleni ezothunyelwa ekulayishweni okukhokhelwayo, ifulegi lokulingisa lenodi, uhlobo lwedatha edluliswa njengenani lenombolo.
- Ithola ukucushwa
st := types.ParseConfig(*config)
- Uma ifulegi le-emu liphasisiwe, liyaqala umsheli
- Uma ifulegi lika-f elibonisa indlela eya kufayela linikeziwe, sizobe sesilayisha idatha yalo kulo fdb futhi okuqukethwe kuthunyelwa kuseva
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- Uma ifayela lingacacisiwe, khona-ke idatha evela kufulegi ithunyelwa kalula -d:
client.TCPConnect(st, []byte(*data), nil)
Konke lokhu ukumelelwa okwenziwe lula okubonisa ukwakheka kwephrothokholi. Ngesikhathi sokuthuthukiswa, ukusebenza okudingekile kwengezwe esakhiweni sayo.
Engxenyeni yesibili ngizokhuluma ngezakhiwo zedatha zamabhulokhi kanye nokuthengiselana, ku-3 mayelana neseva yeWebSocket yokuxhuma kusuka kuJavaScript, ku-4 ngizobheka umhleli wokuvumelanisa, bese kuba umshini wokupakisha ocubungula i-bytecode kusuka kokungenayo kanye nokuphumayo, i-cryptography kanye amachibi okukhiphayo.
Source: www.habr.com