Kwiinyanga ezine ngoku ndisebenza kwiprojekthi ebizwa ngokuthi "Uphuhliso lokhuseleko lwedatha kunye nezixhobo zokulawula kumacandelo karhulumente kunye namashishini asekelwe kwi-blockchain."
Ngoku ndingathanda ukukuxelela malunga nendlela endiyiqale ngayo le projekthi, kwaye ngoku ndiza kuchaza ikhowudi yeprogram ngokubanzi.
Eli linqaku lokuqala kungcelele lwamanqaku. Apha ndichaza umncedisi kunye neprotocol. Ngapha koko, umfundi unokude abhale ezakhe iinguqulelo zezi zinto ze-blockchain.
Kunyaka ophelileyo, kwi-Digital Breakthrough hackathon, beza nombono wokwenza inkqubo eluncedo kushishino kunye noqoqosho lwedijithali usebenzisa itekhnoloji yeleja esasaziweyo; isibonelelo sakhutshelwa uphuhliso yiNgxowa-mali yoNcedo lweNtsha (kufuneka ndibhale eyahlukileyo inqaku malunga nesibonelelo, kwabo baqala ukuqala ), kwaye ngoku ngokulandelelana.
Uphuhliso lwenzeka ngolwimi lweGo, kwaye i-database apho iibhloko zigcinwa khona yi-LevelDB.
Amacandelo aphambili yiprotocol, iseva (eqhuba i-TCP kunye neWebSocket - eyokuqala yokuvumelanisa i-blockchain, okwesibini ukudibanisa abathengi, ukuthumela ukuthengiselana kunye nemiyalelo evela kwiJavaScript, umzekelo.
Njengoko bekutshiwo, le blockchain iyadingeka ngokuyintloko ukwenza ngokuzenzekelayo kunye nokukhusela ukutshintshiselana kweemveliso phakathi kwababoneleli kunye nabathengi, okanye bobabini kumntu omnye. Aba bantu abangxamele ukuthembana. Kodwa umsebenzi awukona nje ukudala "i-checkbook" ene-calculator eyakhelwe-ngaphakathi, kodwa inkqubo eyenza ngokuzenzekelayo ininzi yemisebenzi yesiqhelo evelayo xa usebenza kunye nomjikelezo wobomi bemveliso. I-bytecode ejongene nalo mbandela, njengoko kuqhelekile kunye ne-blockchains, igcinwe kwigalelo kunye neziphumo zokuthengiselana (intengiselwano ngokwayo igcinwe kwiibhloko, iibhloko kwi-LevelDB zifakwe ngaphambili kwifomathi yeGOB). Okokuqala, makhe sithethe ngeprotocol kunye nomncedisi (aka node).
Iprothokholi ayintsonkothanga, inqaku layo lonke kukutshintshela kwindlela yokulayisha idatha ethile, ngokuqhelekileyo ibhloko okanye ukuthengiselana, ekuphenduleni umgca womyalelo okhethekileyo, kwaye iyafuneka kwakhona ekutshintshiseni i-inventory, ukuze i-node iyazi ukuba ngubani. iqhagamshelwe kunye nendlela abaneshishini lokwenza (i-nodes eziqhagamshelwe kwiseshoni yongqamaniso zikwabizwa ngokuba "ngummelwane" kuba i-IP yabo iyaziwa kwaye idatha yelizwe igcinwe kwimemori).
Iifolda (abalawuli njengoko iLinux ibabiza) ekuqondeni kweGo abadwelisi benkqubo babizwa ngokuba ziiphakheji, ngoko ke ekuqaleni kwefayile nganye enekhowudi yeGo ukusuka kolu lawulo babhala ipakethe ifolda_name_where_this_file ibekwe. Ngaphandle koko, awuyi kukwazi ukondla iphakheji kumqokeleli. Kaloku, oku akuyomfihlo kwabo balwaziyo olu lwimi. Nazi iipakethe:
- Unxibelelwano lwenethiwekhi (umncedisi, umxhasi, umthetho olandelwayo)
- Izakhiwo zedatha egciniweyo kunye nokuhanjiswa (ibhloko, intengiselwano)
- Isiseko sedatha (blockchain)
- Imvumelwano
- Umatshini wenyani obekiweyo (xvm)
- I-Axiliary (crypto, iindidi) yiyo yonke into ngoku.
Olu luguqulelo lwemfundo, alunantsebenziswano phakathi kwenkqubo kunye namacandelo amaninzi okulinga, kodwa isakhiwo sihambelana naleyo uphuhliso lwenziwa kuyo. Ukuba unayo nayiphi na into yokucebisa kumazwana, ndiya kuvuya ukuyiqwalasela ekuphuhliseni ngakumbi. Kwaye ngoku ingcaciso yomncedisi kunye protocol.
Makhe sijonge kwiseva kuqala.
I-subroutine yomncedisi isebenza njengomncedisi wedatha osebenza phezulu kweprotocol ye-TCP usebenzisa izakhiwo zedatha ukusuka kwiphakheji yeprothokholi.
Inkqubo isebenzisa ezi phakheji zilandelayo: Mncedisi, protocol, iintlobo. Kwiphakheji ngokwayo tcp_server.go iqulethe ubume bedatha Khonze.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
Inokwamkela ezi parameters zilandelayo:
- Uthungelwano lwezibuko apho idatha iya kutshintshwa
- Ifayile yoqwalaselo yeseva kwifomati ye-JSON
- Iflegi yokubaleka kwimowudi yolungiso (i-blockchain yabucala)
Inkqubela:
- Ifunda uqwalaselo kwifayile ye-JSON
- Iflegi yemo yedebug ikhangelwe: ukuba isetiwe, umcwangcisi wongqamaniso womnatha akasungulwa kwaye ibhloko ayilayishwanga.
- Ukuqalisa ubume bedatha yoqwalaselo kunye nokuqalisa iseva
Umncedisi
- Iqhuba ukuqaliswa kweseva ye-TCP kunye nokusebenzisana kwenethiwekhi ngokuhambelana neprotocol.
- Inomsebenzi wedata woKhonza oquka inani lezibuko, ubungakanani bebuffer kunye nesalathisi kulwakhiwo iintlobo.Iisetingi
- Indlela Yokubaleka iqala unxibelelwano lomnatha (umamela udibaniso olungenayo kwizibuko elinikiweyo, xa uxhulumaniso olutsha lufunyenwe, ukuqhubekekiswa kwalo kudluliselwa kwindlela yokubamba yabucala kumsonto omtsha)
- Π phatha idatha esuka kuqhagamshelwano ifundwa kwi buffer, iguqulelwe kumboniso womtya kwaye igqithiselwe kuyo protocol.Ukhetho
- protocol.Ukhetho iimbuyekezo siphumo okanye ibangele impazamo. siphumo emva koko idluliselwe kwi iprotocol.Tolikaebuyayo intrpr - into yohlobo TolikaData, okanye ibangele imposiso ekuqhubeni isiphumo sokhetho
- Emva koko iswitshi isenziwa intrpr.Commands[0] ejonga enye ye: isiphumo, inv, impazamo kwaye kukho icandelo Engagqibekanga
- Kwicandelo siphumo iswitshi ifunyanwa ngexabiso intrpr.Commands[1] ejonga amaxabiso ubude buffer ΠΈ Inguqulelo (kwimeko nganye umsebenzi ohambelanayo ubizwa)
Imisebenzi GetVersion ΠΈ BufferUbude zikwifayile srvlib.go iphakheji yeseva
GetVersion(conn net.Conn, version string)
ishicilela ngokulula kwiconsole kwaye ithumele uguqulelo olugqithisiweyo kwiparameter kumxhasi:
conn.Write([]byte("result:" + version))
.
Umsebenzi
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
ilayisha ibhlokhi, intengiselwano, okanye enye idata ethile ngolu hlobo lulandelayo:
- Shicilela ikhonsoli uhlobo lwedatha ekhankanyiweyo kwiprothokholi ekufuneka yamkelwe:
fmt.Println("DataType:", intrpr.Commands[2])
- Ufunda ixabiso intrpr.Body ukuya kuguquguquko lwamanani buf_len
- Yenza isithinteli entshabuf ubungakanani obuchaziweyo:
make([]byte, buf_len)
- Thumela impendulo elungile:
conn.Write([]byte("result:ok"))
- Igcwalisa ngokupheleleyo isithinteli ukusuka kumsinga ofundiweyo:
io.ReadFull(conn, newbuf)
.
- Shicilela imixholo yesithinteli kwi-console
fmt.Println(string(newbuf))
kunye nenani leebhayithi ezifundwayo
fmt.Println("Bytes length:", n)
- Thumela impendulo elungile:
conn.Write([]byte("result:ok"))
Iindlela ezisuka kwiphakheji yomncedisi ziqwalaselwe ukucubungula idatha efunyenweyo kusetyenziswa imisebenzi evela kwiphakheji protocol.
Protocol
Iprotocol isebenza njengendlela emele idatha kutshintshiselwano lwenethiwekhi.
Ukhetho(umtya westr) (umtya, impazamo) yenza ulungiso oluphambili lwedatha efunyenwe ngumncedisi, ifumana umboniso womtya wedatha njengegalelo kwaye ibuyisela umtya olungiselelwe Itoliki:
- Umtya wegalelo wahlulwe ube yintloko kunye nomzimba usebenzisa ReqParseN2(str)
- intloko yahlulahlulwe yaziziqalelo kwaye ibekwe kwisilayi semiyalelo usebenzisa iReqParseHead(intloko)
- Π tshintsha(imiyalelo[0]) khetha umyalelo ofunyenweyo (cmd, isitshixo, idilesi okanye icandelo liyaqhutywa Engagqibekanga)
- Imiyalelo emi-2 ikhangelwe kwi-cmd tshintsha(imiyalelo[1]) - ubude ΠΈ ukuguqulwa.
- ubude ijonga uhlobo lwedatha ngaphakathi imiyalelo[2] kwaye uyigcine ngaphakathi uhlobo lwedatha
- Ijonga loo nto umzimba iqulathe ixabiso lomtya
len(body) < 1
- Ibuyisela umtya wempendulo:
"result:bufferlength:" + datatype + "/" + body
- ukuguqulwa ibuyisela umtya
return "result:version/auto"
Itoliki
Iqulethe ulwakhiwo lwe-InterpreteData kwaye yenze inkqubo yesibini yedatha ebuyiswe ukusuka ukhetho imitya kunye nokwakheka kwezinto TolikaData.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
Umsebenzi
Interprete(str string) (*InterpreteData, error)
wamkela umtya siphumo kwaye idale kwaye ibuyise ireferensi yento TolikaData.
Inkqubela:
- Ngokunjalo ukhetho intloko nomzimba zitsalwa kusetyenziswa ReqParseN2(str)
- intloko yahlulahlulwe yaziziqalelo kusetyenziswa ReqParseHead(intloko)
- Into iyaqaliswa TolikaData kwaye isalathisi kuyo sibuyiswe.
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
Le nto isetyenziswa kwi iseva.go iphakheji engundoqo.
umxhasi
Iphakheji yomxhasi iqulethe imisebenzi TCPConnect ΠΈ TCPResponseData.
Umsebenzi
TCPConnect(s *types.Settings, data []byte, payload []byte)
isebenza ngolu hlobo:
- Uqhagamshelo lwenziwa kuqhagamshelo oluchazwe kwinto egqithisiweyo yesethingi
net.Dial("tcp", s.Host + ":" + s.Port)
- Idatha egqithisiweyo kwiparameter yedatha iyahanjiswa:
conn.Write(data)
- Impendulo ifundiwe
resp, n, _ := TCPResponseData(conn, s.BufSize)
kwaye iprintwe kwi-console
fmt.Println(string(resp[:n]))
- Ukuba idluliselwe payload emva koko igqithise
conn.Write(payload)
kwaye ifunde impendulo yomncedisi, uyiprinte kwi console
Umsebenzi
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
yenza isithinteli sobungakanani obukhankanyiweyo, ifunda impendulo yomncedisi apho kwaye ibuyisela le buffer kunye nenani leebhayithi ezifundiweyo, kunye nento yempazamo.
Inkqubo engaphantsi yomthengi
Ukhonza ukuthumela imiyalelo kwiiseva ze-node, kunye nokufumana izibalo ezimfutshane kunye novavanyo.
Inokwamkela ezi parameters zilandelayo: ifayile yoqwalaselo kwifomathi ye-JSON, idatha eza kuthunyelwa kumncedisi njengoluhlu lwamagama, indlela eya kwifayile eya kuthunyelwa kumthwalo ohlawulayo, iflegi yokulinganisa umcwangcisi we-node, uhlobo lwedatha ekhutshelwe njengexabiso lamanani.
- Ukufumana ubumbeko
st := types.ParseConfig(*config)
- Ukuba iflegi ye-emu idlulisiwe, iqala sheduler
- Ukuba iflegi ebonisa indlela eya kwifayile inikezelwe, ngoko silayisha idatha yayo fdb kwaye umxholo uthunyelwa kumncedisi
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- Ukuba ifayile ayichazwanga, ke idatha evela kwiflegi ithunyelwa ngokulula -d:
client.TCPConnect(st, []byte(*data), nil)
Konke oku kubonakaliswa lula okubonisa ubume beprotocol. Ngexesha lophuhliso, umsebenzi oyimfuneko wongezwa kwisakhiwo sayo.
Kwicandelo lesibini ndiya kuthetha malunga nezakhiwo zedatha yeebhloko kunye nokuthengiselana, kwi-3 malunga ne-WebSocket iseva yokuxhuma kwiJavaScript, kwi-4 ndiya kujonga umcwangcisi wolungelelwaniso, emva koko umatshini wokupakisha osebenza nge-bytecode kwigalelo kunye neziphumo, i-cryptography amadama ukwenzela iziphumo.
umthombo: www.habr.com