Atina'e Blockchain mo alamanuia fa'aaoga Go. Vaega 1

Mo le fa masina i le taimi nei sa ou galue i se poloketi ua taʻua o le "Atiae o le puipuiga o faʻamatalaga ma meafaigaluega tau pulega i totonu o le malo ma vaega tau alamanuia e faʻavae i luga o poloka poloka."
O lenei ou te fia taʻu atu ia te oe le auala na ou amataina ai lenei poloketi, ma o lenei o le a ou faʻamatalaina auiliili le code program.

Atina'e Blockchain mo alamanuia fa'aaoga Go. Vaega 1

O le tala muamua lea i se faasologa o tala. O iinei ou te faamatalaina ai le server ma le protocol. O le mea moni, e mafai e le tagata faitau ona tusia ana lava faʻamatalaga o nei elemene poloka poloka.

Ma o le vaega lona lua lenei - e uiga i poloka poloka ma faʻamaumauga o fefaʻatauaiga, faʻapea foʻi ma le afifi o loʻo faʻatinoina fegalegaleaiga ma faʻamaumauga.

I le tausaga na teʻa nei, i le Digital Breakthrough hackathon, na latou maua ai se manatu e faia se faiga aoga mo alamanuia ma le tamaoaiga numera e faʻaaoga ai tekonolosi faʻasalalau tufatufa; na tuʻuina atu foi se fesoasoani mo le atinaʻeina e le Innovation Assistance Fund (E tatau ona ou tusia se isi vaega. tusiga e uiga i le foaʻi, mo i latou o loʻo amata amataina), ma o lea ua faʻatonuina.

O le atina'e e faia i le gagana Go, ma o le database o lo'o teuina ai poloka o le LevelDB.
O vaega autu o le protocol, le server (lea e faʻatautaia TCP ma WebSocket - muamua mo le faʻamaopoopoina o le poloka poloka, lona lua mo le faʻafesoʻotaʻi tagata faʻatau, auina atu fefaʻatauaiga ma poloaiga mai le JavaScript, mo se faʻataʻitaʻiga.

E pei ona taʻua, o lenei poloka poloka e manaʻomia muamua e faʻatautaia ma puipuia le fefaʻatauaʻiga o oloa i le va o tagata faʻatau ma tagata faʻatau, poʻo uma i le tagata e toʻatasi. O nei tagata e le faanatinati e talitonu le tasi i le isi. Ae o le galuega e le gata o le fatuina o se "tusi siaki" ma se calculator ua fausia, ae o se faiga e faʻaaogaina ai le tele o galuega masani e tulaʻi mai pe a galue ma le taamilosaga o le olaga o oloa. O le bytecode e nafa ma lenei mataupu, e pei ona masani ai poloka poloka, o loʻo teuina i totonu o faʻaoga ma gaioiga o fefaʻatauaiga (o fefaʻatauaiga lava ia o loʻo teuina i totonu o poloka, o poloka ile LevelDB o loʻo faʻapipiʻiina i le GOB format). Muamua, tatou talanoa e uiga i le protocol ma le server (aka node).

O le protocole e le faigata, o lona uiga atoa o le fesuiaʻi lea i le faiga o le utaina o nisi faʻamatalaga, e masani lava o se poloka poʻo se fefaʻatauaiga, i le tali atu i se laina faʻapitoa, ma e manaʻomia foi mo le fesuiaiga o suʻesuʻega, ina ia iloa e le node poʻo ai. e fesoʻotaʻi ma pe faʻafefea ona fai a latou pisinisi (o nodes e fesoʻotaʻi mo le sauniga faʻatasi e taʻua foi o le "tuaoi" aua o loʻo iloa a latou IP ma o loʻo teuina a latou faʻamaumauga i le mafaufau).

O faila (directories e pei ona taʻua e Linux) i le malamalama o Go programmers e taʻua o afifi, o lea i le amataga o faila taʻitasi ma le Go code mai lenei lisi latou te tusia ai le pusa folder_name_where_this_file o loʻo i ai. A leai, o le a le mafai ona e fafagaina le afifi i le tagata faʻapipiʻi. Ia, e le o se mea lilo lea mo i latou e iloa lenei gagana. O afifi nei:

  • Feso'ota'iga feso'ota'iga (server, client, protocol)
  • Fa'atulagaina o fa'amaumauga teuina ma fa'asalalauina (poloka, fefa'atauaiga)
  • Fa'amaumauga (polokaina)
  • Autasi
  • Masini fa'aputuga (xvm)
  • Auxiliary (crypto, type) o le mea lena mo le taimi nei.

Ole feso'ota'iga lea ile github

Ole fa'aa'oa'oga lea, e leai ni feso'ota'iga va'ava'ai ma le tele o vaega fa'ata'ita'i, ae o le fausaga e fetaui ma le mea o lo'o fa'atinoina ai le atina'e. Afai ei ai sau mea e fautua mai i faʻamatalaga, o le a ou fiafia e faʻatatau i le atinaʻe atili. Ma o lenei mo se faʻamatalaga o le server ma maliega.

Se'i o tatou va'ai muamua ile server.

O le subroutine server e galue o se faʻamaumauga faʻamaumauga o loʻo tamoʻe i luga o le TCP protocol e faʻaaoga ai faʻamaumauga mai le pusa faʻamaumauga.

O le masani e faʻaaogaina afifi nei: faigaluega, maliega, ituaiga. I totonu o le afifi lava ia tcp_server.go o lo'o iai fa'amaumauga fa'amaumauga tautua.

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

E mafai ona talia vaega nei:

  • Tau feso'ota'iga lea o le a fesuia'i ai fa'amatalaga
  • Fa'atonu faila faila ile JSON format
  • Fu'a mo le tamo'e i le faiga debug (fa'ato'a poloka poloka)

Alualu i luma:

  • Faitau le seti mai le faila JSON
  • Ua siaki le fu'a o le debug mode: afai e seti, e le faʻalauiloaina le faʻatulagaina o fesoʻotaʻiga fesoʻotaʻiga ma e le utaina le poloka poloka.
  • Amataina le faʻatulagaina o faʻamaumauga faʻamaumauga ma amataina le server

Tagata faigaluega

  • Faʻatinoina le faʻalauiloaina o le TCP server ma fesoʻotaʻiga fesoʻotaʻiga e tusa ai ma le protocol.
  • O lo'o i ai se fa'asologa o fa'amaumauga o le Serve e aofia ai se numera o le taulaga, se lapo'a pa'u ma se fa'asino ile fausaga ituaiga.Settings
  • O le Run method e amata ai fesoʻotaʻiga fesoʻotaʻiga (faʻalogo mo fesoʻotaʻiga o loʻo oʻo mai i luga o se taulaga tuʻufaʻatasia, pe a maua se fesoʻotaʻiga fou, o lona gaioiga e faʻafeiloaʻi atu i le auala tumaoti i se filo fou)
  • В lima fa'amatalaga mai le feso'ota'iga e faitau i totonu o se pa'u, liliu i se manoa fa'atusa ma pasi atu i protocol.Filifiliga
  • protocol.Filifiliga toe fo'i mai iʻuga pe mafua ai se mea sese. iʻuga ona siitia atu lea i protocol.Fa'amatalalea e toe foi mai intrpr - mea o le ituaiga InterpreteData, pe mafua ai se mea sese i le faagasologa o le filifiliga filifiliga
  • Ona fai lea o le ki intrpr.Poloaiga[0] lea e siaki ai se tasi o: i'uga, inv, sese ma o loʻo i ai se vaega Leai se totogi
  • I le vaega iʻuga e maua le ki i le tau intrpr.Poloaiga[1] lea e siaki ai tau uumi umi и faʻamatalaga (i tulaga taʻitasi e taʻua le galuega tutusa)

Galuega tauave GetVersion и Pa'u Umi o loʻo i totonu o le faila srvlib.go pusa server

GetVersion(conn net.Conn, version string)

e na'o le lolomi i le fa'amafanafanaga ma tu'u atu le kopi na pasia i le parakalafa i le kalani:

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

.
galuega tauave

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

utaina se poloka, fefaʻatauaiga, poʻo isi faʻamatalaga patino e pei ona taua i lalo:

  • Lolomi i le fa'amafanafanaga le ituaiga o fa'amaumauga o lo'o fa'amaoti mai i le protocol e mana'omia ona talia:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Faitau le tau intrpr.Tino i se fesuiaiga numera buf_len
  • Fausia se pa'u newbuf lapopoa fa'apitoa:
    make([]byte, buf_len)
  • Auina atu se tali lelei:
    conn.Write([]byte("result:ok"))
  • Faatumu atoa le pa'u mai le vaitafe faitau:
    io.ReadFull(conn, newbuf)

    .

  • Lolomi mea o lo'o i totonu o le pa puipui i le fa'amafanafanaga
    fmt.Println(string(newbuf))

    ma le numera o paita faitau

    fmt.Println("Bytes length:", n)
  • Auina atu se tali lelei:
    conn.Write([]byte("result:ok"))

Metotia mai le pusa server ua faʻatulagaina e faʻagasolo ai faʻamatalaga maua mai e faʻaaoga ai galuega mai le afifi maliega.

Maliega

O se protocol e avea o se auala e faʻaalia ai faʻamatalaga i fesoʻotaʻiga fesoʻotaʻiga.

Filifiliga(str manoa) ( manoa, sese) faia le faagasologa muamua o faʻamatalaga na maua e le 'auʻaunaga, maua se manoa faʻatusa o faʻamaumauga e fai ma faʻaoga ma toe faʻafoʻi mai se manoa ua saunia mo Faʻamatala upu:

  • O le manoa fa'aoga e vaevae i le ulu ma le tino e fa'aaoga ai ReqParseN2(str)
  • ua vaevaeina le ulu i elemene ma tuʻu i totonu o se fasi faʻatonuga e faʻaaoga ai ReqParseHead(ulu)
  • В sui(poloaiga[0]) filifili le poloaiga maua (cmd, ki, tuatusi po'o le vaega ua fa'aosoina Leai se totogi)
  • 2 poloaiga e siaki ile cmd sui(poloaiga [1]) — umi и getversion.
  • Uumi siaki le ituaiga faʻamatalaga i totonu poloaiga[2] ma teu ai i totonu ituaiga faʻamatalaga
  • Siaki lena tino o lo'o i ai se tau manoa
    len(body) < 1
  • Toe faafoi le manoa tali:
    "result:bufferlength:" + datatype + "/" + body
  • getversion toe faafoi mai se manoa
    return "result:version/auto"

Faʻamatala upu

O lo'o iai le fa'atulagaina o le InterpreteData ma fa'atino lona lua fa'agaioiga o fa'amaumauga na toe fa'afo'i mai filifiliga manoa ma mea faitino InterpreteData.

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

galuega tauave

Interprete(str string) (*InterpreteData, error)

talia se manoa iʻuga ma faia ma toe faafoi se faasinomaga i le mea InterpreteData.

Alualu i luma:

  • E faapena foi filifiliga o le ulu ma le tino e fa'aaogaina ReqParseN2(str)
  • ulu ua vaevaeina i elemene e faʻaaoga ai ReqParseHead(ulu)
  • Ua amatalia le mea InterpreteData ma ua toe fo'i mai le fa'asino i ai.

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

O lenei meafaitino e faʻaaogaina i server.go afifi autu.

tagata faʻatau

O lo'o iai i totonu o le afifi o tagata o tausia galuega TCPConnect и TCPResponseData.

galuega tauave

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

galue e pei o lenei:

  • E faia se feso'ota'iga i le feso'ota'iga o lo'o fa'amaoti mai i le mea fa'atulagaina ua pasia
    net.Dial("tcp", s.Host + ":" + s.Port)
  • O faʻamatalaga na pasia i le faʻamaufaʻailoga faʻamaumauga e tuʻuina atu:
    conn.Write(data)
  • Ua faitau le tali
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ma lolomi i luga o le console

    fmt.Println(string(resp[:n]))
  • Afai ua siitia Totogi totogi ona pasi atu lea
    conn.Write(payload)

    ma faitau foi le tali a le server, lolomi i le console

galuega tauave

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

faia se pa'u o le lapopo'a fa'apitoa, faitau le tali a le 'au'aunaga iina ma toe fa'afo'i le pa'u ma le numera o bytes faitau, fa'apea fo'i ma se mea sese.

La'au masani a tagata fa'atau

Auauna e auina atu poloaiga i node servers, faʻapea foʻi ma le mauaina o faʻamaumauga puʻupuʻu ma suʻega.

E mafai ona talia fa'asologa o lo'o i lalo: faila faila i le JSON format, fa'amaumauga e lafo i le server e pei o se manoa, ala i le faila e lafo i le uta, node scheduler emulation fu'a, ituaiga o fa'amatalaga fa'aliliuina o se tau numera.

  • Mauaina o le faatulagaga
    st := types.ParseConfig(*config)
  • Afai e pasia le fu'a emu, e amata tagata fa'atau
  • Afai o le f fuʻa e faʻaalia ai le ala i le faila e tuʻuina atu, ona matou utaina lea o ana faʻamatalaga i totonu fdb ma o le anotusi e auina atu i le server
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Afai e le o faʻamaonia le faila, ona tuʻuina atu lea o faʻamatalaga mai le fuʻa -d:
    client.TCPConnect(st, []byte(*data), nil)

O nei mea uma o se faʻataʻitaʻiga faigofie e faʻaalia ai le fausaga o le protocol. I le taimi o le atinaʻe, e faʻaopoopoina galuega talafeagai i lona fausaga.

I le vaega lona lua o le a ou talanoa e uiga i faʻamaumauga o faʻamaumauga mo poloka ma fefaʻatauaiga, i le 3 e uiga i le WebSocket server mo le faʻafesoʻotaʻi mai le JavaScript, i le 4 o le a ou vaʻavaʻai i le synchronization scheduler, ona faʻapipiʻi ai lea o se masini faʻapipiʻi e faʻagasolo le bytecode mai mea e faʻaoga ma gaioiga, cryptography ma vaitaele mo galuega faatino.

puna: www.habr.com

Faaopoopo i ai se faamatalaga