Ukuthuthukiswa kweBlockchain embonini esebenzisa i-Go. Ingxenye 1

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.

Ukuthuthukiswa kweBlockchain embonini esebenzisa i-Go. Ingxenye 1

Lesi isihloko sokuqala ochungechungeni lwezihloko. Lapha ngichaza iseva nephrothokholi. Eqinisweni, umfundi angakwazi ngisho nokubhala izinguqulo zakhe zalezi zici ze-blockchain.

Futhi nansi ingxenye yesibili - mayelana ne-blockchain nezakhiwo zedatha yokuthengiselana, kanye nephakheji esebenzisa ukusebenzisana nedathabhesi.

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.

Nasi isixhumanisi se-github

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

Engeza amazwana