Uphuhliso lweBlockchain kushishino olusebenzisa iGo. Icandelo loku-1

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.

Uphuhliso lweBlockchain kushishino olusebenzisa iGo. Icandelo loku-1

Eli linqaku lokuqala kungcelele lwamanqaku. Apha ndichaza umncedisi kunye neprotocol. Ngapha koko, umfundi unokude abhale ezakhe iinguqulelo zezi zinto ze-blockchain.

Nali ke icandelo lesibini - malunga ne-blockchain kunye nezakhiwo zedatha yokuthengiselana, kunye nepakethe eyenza ukusebenzisana kunye nedatha.

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.

Nali ikhonkco kwi-github

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

Yongeza izimvo