Mmepe Blockchain maka ụlọ ọrụ na-eji Go. Akụkụ 1

Ruo ọnwa anọ ugbu a, anọ m na-arụ ọrụ na-arụ ọrụ a na-akpọ "Mmepụta nke nchekwa data na ngwaọrụ nchịkwa na gọọmentị na ụlọ ọrụ mmepụta ihe dabere na blockchain."
Ugbu a, m ga-achọ ịgwa gị banyere otú m si malite ọrụ a, ma ugbu a, m ga-akọwa koodu mmemme n'ụzọ zuru ezu.

Mmepe Blockchain maka ụlọ ọrụ na-eji Go. Akụkụ 1

Nke a bụ isiokwu mbụ n'ime usoro isiokwu. N'ebe a, m na-akọwa ihe nkesa na protocol. N'ezie, onye na-agụ nwere ike ọbụna dee nsụgharị nke ya nke ihe ndị a blockchain.

Ma ebe a bụ akụkụ nke abụọ - gbasara blockchain na usoro data azụmahịa, yana gbasara ngwugwu nke na-emekọrịta mmekọrịta na nchekwa data.

N'afọ gara aga, na Digital Breakthrough hackathon, ha weputara echiche iji mepụta usoro bara uru maka ụlọ ọrụ na akụ na ụba dijitalụ site na iji teknụzụ akwụkwọ ozi na-ekesa; E nyekwara onyinye maka mmepe site na Innovation Assistance Fund (M kwesịrị ide ihe dị iche iche). isiokwu banyere onyinye, maka ndị na-amalite na-eme mmalite ), na ugbu a iji.

Mmepe na-ewere ọnọdụ n'asụsụ Go, ebe nchekwa data nke echekwara ngọngọ bụ LevelDB.
Akụkụ bụ isi bụ protocol, ihe nkesa (nke na-agba TCP na WebSocket - nke mbụ maka ịmekọrịta blockchain, nke abụọ maka ijikọ ndị ahịa, izipu azụmahịa na iwu sitere na JavaScript, dịka ọmụmaatụ.

Dị ka ekwuru, a chọrọ blockchain a bụ isi iji megharịa ma chekwaa mgbanwe ngwaahịa n'etiti ndị na-ebubata na ndị ahịa, ma ọ bụ abụọ n'ime otu onye. Ndị a anaghị eme ngwa ngwa ịtụkwasị ibe ha obi. Ma ọrụ ahụ abụghị naanị ịmepụta "akwụkwọ nlele" nke nwere ihe mgbako arụnyere, ma usoro nke na-eme ka ọtụtụ n'ime ọrụ ndị a na-eme kwa ụbọchị na-ebili mgbe ị na-arụ ọrụ ndụ ndụ ngwaahịa. A na-echekwa bytecode nke na-ahụ maka okwu a, dị ka a na-emekarị na blockchain, na ntinye na ntinye nke azụmahịa (a na-echekwa azụmahịa n'onwe ya na ngọngọ, ihe mgbochi na LevelDB na-edobere na usoro GOB). Mbụ, ka anyị kwuo banyere protocol na ihe nkesa (aka node).

Protocol adịghị mgbagwoju anya, isi ihe ya niile bụ ịgbanwee gaa n'ụdị nbudata ụfọdụ data, na-abụkarị ngọngọ ma ọ bụ azụmahịa, na nzaghachi maka ahịrị iwu pụrụ iche, ọ dịkwa mkpa maka mgbanwe ngwaahịa, ka ọnụ ya wee mara onye ọ bụ. ejikọrọ na otú ha si enwe azụmahịa na-eme (ọnụọgụ ejikọrọ maka nnọkọ mmekọrịta a na-akpọkwa "ndị agbata obi" n'ihi na a maara IP ha na nchekwa data steeti ha na ebe nchekwa).

Mpempe akwụkwọ (akwụkwọ ndekọ aha dị ka Linux na-akpọ ha) na nghọta nke Go programmers na-akpọ ngwugwu, ya mere na mmalite nke faịlụ ọ bụla nwere Go koodu site na ndekọ a, ha na-ede ngwugwu folder_name_where_this_file dị. Ma ọ bụghị ya, ị gaghị enwe ike ịnye ngwugwu ahụ na nchịkọta. Ọfọn, nke a abụghị ihe nzuzo nye ndị maara asụsụ a. Ndị a bụ ngwugwu:

  • Nkwukọrịta netwọkụ (ihe nkesa, onye ahịa, protocol)
  • Ọdịdị nke echekwara na bufee data (mgbochi, azụmahịa)
  • Ebe nchekwa data (blockchain)
  • Nkwekọrịta
  • Igwe mebere nke etinyere (xvm)
  • Enyemaka (crypto, ụdị) nke ahụ bụ ihe niile ugbu a.

Nke a bụ njikọ github

Nke a bụ ụdị mmụta, ọ nweghị mmekọrịta mmekọrịta na ọtụtụ ihe nnwale, mana usoro ahụ kwekọrọ na nke a na-eme mmepe. Ọ bụrụ na ị nwere ihe ọ bụla ị ga-atụ aro na nkwupụta, m ga-enwe obi ụtọ iburu ya n'uche na mmepe ọzọ. Ma ugbu a maka nkọwa nke ihe nkesa na protocol.

Ka anyị buru ụzọ leba anya na nkesa.

Subroutine nkesa na-arụ ọrụ dị ka ihe nkesa data na-agba ọsọ n'elu protocol TCP site na iji usoro data sitere na ngwugwu protocol.

Usoro a na-eji ngwugwu ndị a: server, protocol, ụdị. Na ngwugwu n'onwe ya tcp_server.go nwere usoro data Na-eje ozi.

type Serve struct {
	Port string
	BufSize int
	ST *types.Settings
}

Ọ nwere ike nabata paramita ndị a:

  • Ọdụ ụgbọ mmiri netwọk nke a ga-esi na ya gbanwere data
  • Faịlụ nhazi nkesa n'ụdị JSON
  • Ọkọlọtọ maka ịgba ọsọ na ọnọdụ debug (blockchain nkeonwe)

Ọganihu:

  • Na-agụ nhazi site na faịlụ JSON
  • A na-enyocha ọkọlọtọ ọnọdụ debug: ọ bụrụ na edobere ya, ewepụtaghị nhazi oge mmekọrịta netwọkụ yana ebughịkwa blockchain.
  • Ịmalite nhazi data nhazi na ịmalite ihe nkesa

Server

  • Na-eme mmalite nke ihe nkesa TCP na mmekọrịta netwọk dịka usoro ahụ siri dị.
  • Ọ nwere nhazi data Seve nke nwere nọmba ọdụ ụgbọ mmiri, nha ihe nchekwa yana ntụnye aka na nhazi ahụ ụdị.Ntọala
  • Usoro Run na-amalite mmekọrịta netwọkụ (na-ege ntị maka njikọ mbata na ọdụ ụgbọ mmiri enyere, mgbe enwetara njikọ ọhụrụ, a na-ebugharị nhazi ya na usoro aka nkeonwe na eri ọhụrụ)
  • В aka A na-agụ data sitere na njikọ ahụ ka ọ bụrụ ihe nchekwa, tụgharịa gaa na nnọchite eriri wee nyefee ya protocol.Nhọrọ
  • protocol.Nhọrọ na-alaghachi akpata ma ọ bụ na-akpata njehie. akpata wee nyefee ya protocol.Tụgharianke na-alọghachi intrpr - ihe nke ụdị Ntụgharị asụsụ, ma ọ bụ bute mperi na nhazi nsonaazụ nhọrọ
  • Mgbe ahụ, a na-eme mgbanwe ahụ intrpr. Iwu[0] nke na-enyocha otu n'ime: nsonaazụ, inv, mperi ma enwere ngalaba ndabara
  • Na ngalaba akpata a na-achọta mgba ọkụ site na uru intrpr. Iwu[1] nke na-enyocha ụkpụrụ ogologo oge и version (n'ọnọdụ ọ bụla a na-akpọ ọrụ kwekọrọ)

Ọrụ GetVersion и Ogologo ogologo nọ na faịlụ srvlib.go ihe nkesa ngwugwu

GetVersion(conn net.Conn, version string)

ọ na-ebipụta naanị na console wee zigara onye ahịa ụdị agafere na paramita:

conn.Write([]byte("result:" + version))

.
ọrụ

BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)

na-ebu ngọngọ, azụmahịa ma ọ bụ data ndị ọzọ akọwapụtara dị ka ndị a:

  • Na-ebipụta ụdị data akọwapụtara na protocol nke kwesịrị ịnakwere na njikwa:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Na-agụ uru intrpr. Isi na mgbanwe ọnụọgụgụ buf_len
  • Na-emepụta ihe nchekwa ọhụrụbuf nha kpọmkwem:
    make([]byte, buf_len)
  • Na-eziga nzaghachi dị mma:
    conn.Write([]byte("result:ok"))
  • Mejupụta ihe nchekwa ahụ kpamkpam site na iyi agụ:
    io.ReadFull(conn, newbuf)

    .

  • Na-ebipụta ọdịnaya nke ihe nchekwa na njikwa
    fmt.Println(string(newbuf))

    na ọnụọgụ bytes gụrụ

    fmt.Println("Bytes length:", n)
  • Na-eziga nzaghachi dị mma:
    conn.Write([]byte("result:ok"))

A na-ahazi usoro sitere na ngwugwu ihe nkesa iji hazie data enwetara site na iji ọrụ sitere na ngwugwu protocol.

Protocol

A protocol na-eje ozi dị ka ụzọ na-anọchi anya data na netwọk mgbanwe.

Nhọrọ (eriri str) (eriri, njehie) na-arụ ọrụ nhazi data nke sava natara, na-enweta ihe nnochite anya data dị ka ntinye wee weghachi eriri akwadoro maka ya. Nsụgharị:

  • A na-ekewa eriri ntinye n'ime isi na ahụ na-eji ReqParseN2 (str)
  • A na-ekewa isi n'ime ihe ma tinye ya n'ime mpempe iwu site na iji ReqParseHead (isi)
  • В ịgbanwee (iwu[0]) họrọ iwu enwetara (cmd, igodo, adreesị ma ọ bụ akụkụ ahụ na-akpalite ndabara)
  • A na-enyocha iwu 2 na cmd ngbanwe (iwu[1]) - ogologo и mgbagha.
  • ogologo na-enyocha ụdị data na iwu[2] ma chekwaa ya ụdị data
  • Lelee nke ahụ aru nwere uru eriri
    len(body) < 1
  • Weghachite eriri nzaghachi:
    "result:bufferlength:" + datatype + "/" + body
  • mgbagha weghachi eriri
    return "result:version/auto"

Nsụgharị

Nwere nhazi InterpreteData ma na-arụ nhazi nke abụọ nke data esitere na ya Choice eriri na nhazi ihe Ntụgharị asụsụ.

type InterpreteData struct {
	Head string
	Commands []string
	Body string
	IsErr bool
	ErrCode int 
	ErrMessage string
}

ọrụ

Interprete(str string) (*InterpreteData, error)

na-anabata eriri akpata ma mepụta ma weghachi ntụaka maka ihe ahụ Ntụgharị asụsụ.

Ọganihu:

  • N'otu aka ahụ Choice isi na aru ka eji ReqParseN2 (str)
  • isi na-ekewa n'ime ọcha iji ReqParseHead (isi)
  • Ebidola ihe a Ntụgharị asụsụ ewe weghachi ya ihe ntutu aka:

res := &InterpreteData{
	Head: head,
	Commands: commands,
	Body: body,
}
return res, nil

A na-eji ihe a eme ihe sava.go ngwugwu isi.

Client

Ngwungwu ndị ahịa nwere ọrụ TCPJikọọ и Data nzaghachi TCPR.

ọrụ

TCPConnect(s *types.Settings, data []byte, payload []byte)

na-arụ ọrụ dị ka nke a:

  • A na-eme njikọ na njikọ akọwapụtara na ihe ntọala agafere
    net.Dial("tcp", s.Host + ":" + s.Port)
  • A na-ebufe data agafere na oke data:
    conn.Write(data)
  • A na-agụ azịza ya
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ma bipụta ya na console

    fmt.Println(string(resp[:n]))
  • Ọ bụrụ na ebufe ya kwụọ ụgwọ wee nyefee ya
    conn.Write(payload)

    ma na-agụkwa nzaghachi nkesa, na-ebipụta ya na njikwa

ọrụ

 TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)

na-emepụta ihe nchekwa nke nha a kapịrị ọnụ, gụọ nzaghachi nkesa ebe ahụ wee weghachi ihe nchekwa a na ọnụọgụ bytes gụrụ, yana ihe njehie.

Ndị ahịa subroutine

Na-eje ozi izipu iwu na sava node, yana nweta ọnụ ọgụgụ dị nkenke na nnwale.

Nwere ike ịnakwere paramita ndị a: faịlụ nhazi n'ụdị JSON, data a ga-eziga na ihe nkesa dị ka eriri, ụzọ faịlụ a ga-eziga ka ọ kwụọ ụgwọ, ọkọlọtọ node emulation ọkọlọtọ, ụdị data bufere dị ka ọnụọgụ ọnụọgụ.

  • Inweta nhazi
    st := types.ParseConfig(*config)
  • Ọ bụrụ na agafere ọkọlọtọ emu, ọ na-amalite sheduler
  • Ọ bụrụ na a na-enye ọkọlọtọ f nke na-egosi ụzọ faịlụ ahụ, mgbe ahụ anyị na-ebuba data ya n'ime fdb na ọdịnaya na-ezigara na ihe nkesa
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Ọ bụrụ na akọwapụtaghị faịlụ ahụ, a na-ezigara data sitere na ọkọlọtọ naanị -d:
    client.TCPConnect(st, []byte(*data), nil)

Ihe a niile bụ ihe nnọchianya dị mfe na-egosi nhazi nke protocol. N'oge mmepe, a na-agbakwunye ọrụ dị mkpa na nhazi ya.

N'akụkụ nke abụọ, m ga-ekwu maka usoro data maka ngọngọ na azụmahịa, na 3 banyere ihe nkesa WebSocket maka ijikọ site na Javascript, na 4 m ga-eleba anya na nhazi oge mmekọrịta, mgbe ahụ, igwe nchịkọta nke na-arụ ọrụ bytecode site na ntinye na ntinye, cryptography na ọdọ mmiri maka mmepụta.

isi: www.habr.com

Tinye a comment