Hoʻomohala Blockchain no ka ʻoihana e hoʻohana ana iā Go. Mahele 1

No nā mahina ʻehā i kēia manawa ua hana wau i kahi papahana i kapa ʻia ʻo "Ka hoʻomohala ʻana i ka pale ʻikepili a me nā mea hana hoʻokele ma nā ʻāpana aupuni a me nā ʻoihana e pili ana i ka blockchain."
I kēia manawa makemake wau e haʻi iā ʻoe e pili ana i kaʻu hoʻomaka ʻana i kēia papahana, a i kēia manawa e wehewehe au i ka code program i nā kikoʻī.

Hoʻomohala Blockchain no ka ʻoihana e hoʻohana ana iā Go. Mahele 1

ʻO kēia ka ʻatikala mua ma ke ʻano o nā ʻatikala. Eia wau e wehewehe nei i ke kikowaena a me ka protocol. ʻOiaʻiʻo, hiki i ka mea heluhelu ke kākau i kāna mau mana ponoʻī o kēia mau mea blockchain.

A eia ka ʻāpana ʻelua - e pili ana i ka blockchain a me nā hoʻolālā ʻikepili kālepa, a me ka pūʻolo e hoʻokō ana i ka pilina me ka waihona.

I ka makahiki i hala, ma ka Digital Breakthrough hackathon, ua loaʻa iā lākou kahi manaʻo e hana i kahi ʻōnaehana pono no ka ʻoihana a me ka ʻoihana kikohoʻe e hoʻohana ana i ka ʻenehana ledger i hāʻawi ʻia; ua hāʻawi pū ʻia kahi haʻawina no ka hoʻomohala ʻana e ka Innovation Assistance Fund (pono wau e kākau i kahi ʻokoʻa. ʻatikala e pili ana i ka hāʻawi kālā, no ka poʻe e hoʻomaka nei e hana i nā hoʻomaka ), a i kēia manawa ma ke ʻano.

Hana ʻia ka hoʻomohala ʻana ma ka ʻōlelo Go, a ʻo ka ʻikepili kahi i mālama ʻia ai nā poloka ʻo LevelDB.
ʻO nā ʻāpana nui ka protocol, ke kikowaena (e holo ana i ka TCP a me WebSocket - ka mea mua no ka hoʻonohonoho ʻana i ka blockchain, ʻo ka lua no ka hoʻopili ʻana i nā mea kūʻai aku, hoʻouna i nā kālepa a me nā kauoha mai JavaScript, no ka laʻana.

E like me ka mea i ʻōlelo ʻia, pono nui kēia blockchain e hoʻokaʻawale a pale i ka hoʻololi ʻana o nā huahana ma waena o nā mea hoʻolako a me nā mea kūʻai aku, a i ʻole nā ​​​​mea ʻelua i hoʻokahi kanaka. ʻAʻole wikiwiki kēia poʻe e hilinaʻi kekahi i kekahi. Akā ʻo ka hana ʻaʻole wale ka hana ʻana i kahi "checkbook" me kahi calculator i kūkulu ʻia, akā he ʻōnaehana e hoʻomaʻamaʻa i ka hapa nui o nā hana maʻamau e kū mai ana i ka wā e hana ai me ka pōʻai ola huahana. ʻO ka bytecode ke kuleana no kēia mea, e like me ka mea maʻamau me nā blockchains, mālama ʻia i loko o nā mea hoʻokomo a me nā hoʻopuka o nā kālepa (ua mālama ʻia nā hana i loko o nā poloka, nā poloka i LevelDB i hoʻopaʻa ʻia ma ke ʻano GOB). ʻO ka mea mua, e kamaʻilio e pili ana i ka protocol a me ke kikowaena (aka node).

ʻAʻole paʻakikī ka protocol, ʻo kona manaʻo holoʻokoʻa e hoʻololi i ke ʻano o ka hoʻouka ʻana i kekahi mau ʻikepili, maʻamau he poloka a i ʻole kālepa, i pane i kahi laina kauoha kūikawā, a pono nō hoʻi ia no ka hoʻololi ʻana i nā waihona, i ʻike ai ka node ʻo wai ia. pili ʻia a pehea kā lākou ʻoihana e hana ai (ua kapa ʻia nā nodes i hoʻohui ʻia no ka hui hoʻonohonoho ʻana i ka "hoa noho" no ka mea ua ʻike ʻia ko lākou IP a mālama ʻia kā lākou ʻikepili mokuʻāina i ka hoʻomanaʻo).

ʻO nā waihona (nā papa kuhikuhi e like me ke kapa ʻana o Linux iā lākou) i ka hoʻomaopopo ʻana i nā polokalamu polokalamu Go i kapa ʻia he pūʻolo, no laila i ka hoʻomaka ʻana o kēlā me kēia faila me Go code mai kēia papa kuhikuhi e kākau lākou i ka pōʻai folder_name_where_this_file. A i ʻole, ʻaʻole hiki iā ʻoe ke hānai i ka pūʻolo i ka mea hoʻopili. ʻAe, ʻaʻole ia he mea huna no ka poʻe ʻike i kēia ʻōlelo. ʻO kēia nā pūʻolo:

  • Ke kamaʻilio pūnaewele (server, client, protocol)
  • Nā ʻano o ka ʻikepili i mālama ʻia a hoʻouna ʻia (block, transaction)
  • ʻIkepili (blockchain)
  • ʻO ka ʻae ʻana
  • Mīkini virtual i hoʻopaʻa ʻia (xvm)
  • Auxiliary (crypto, type) ʻo ia wale nō i kēia manawa.

Eia ka loulou i ka github

He mana hoʻonaʻauao kēia, ʻaʻohe o ka launa ʻana i waena o ke kaʻina hana a me kekahi mau mea hoʻokolohua, akā pili ke ʻano me ka mea e hoʻomohala ʻia ai. Inā loaʻa iā ʻoe kekahi mea e manaʻo ai ma nā ʻōlelo, e hauʻoli wau e noʻonoʻo i ka hoʻomohala hou ʻana. A i kēia manawa no ka wehewehe ʻana i ke kikowaena a Hana ma'amau.

E nānā mua kākou i ke kikowaena.

Hana ʻia ka subroutine kikowaena ma ke ʻano he kikowaena data e holo ana ma luna o ka protocol TCP me ka hoʻohana ʻana i nā hale ʻikepili mai ka pūʻulu protocol.

Hoʻohana ka hana maʻamau i kēia mau pūʻolo: kikowaena, Hana ma'amau, ano. I loko o ka pūʻolo ponoʻī tcp_server.go loaʻa i ka hoʻolālā ʻikepili E lawelawe.

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

Hiki iā ia ke ʻae i kēia mau ʻāpana:

  • ʻO ke awa pūnaewele kahi e hoʻololiʻia ai nāʻikepili
  • Kōnae hoʻonohonoho kikowaena ma ke ʻano JSON
  • Haʻe no ka holo ʻana ma ke ʻano debug (blockchain pilikino)

Holomua:

  • Heluhelu i ka hoʻonohonoho ʻana mai ka faila JSON
  • Nānā ʻia ka hae mode debug: inā hoʻonohonoho ʻia, ʻaʻole i hoʻokuʻu ʻia ka mea hoʻonohonoho hoʻonohonoho pūnaewele a ʻaʻole i hoʻouka ʻia ka blockchain.
  • Hoʻomaka i ka hoʻonohonoho ʻikepili hoʻonohonoho a hoʻomaka i ke kikowaena

Kuʻia

  • Lawe i ka hoʻomaka ʻana o ka server TCP a me ka launa pūnaewele e like me ka protocol.
  • Loaʻa iā ia kahi ʻōnaehana ʻikepili Serve me kahi helu awa, ka nui buffer a me kahi kuhikuhi i ka hale ʻano. Nā hoʻonohonoho
  • Hoʻomaka ke ala Run i ka launa pūnaewele (e hoʻolohe ana i nā pilina e komo mai ana ma kahi awa i hāʻawi ʻia, i ka wā i loaʻa ai kahi pilina hou, hoʻololi ʻia kāna hana ʻana i ke ʻano hana pilikino ma kahi pae hou)
  • В lawelawe heluhelu ʻia ka ʻikepili mai ka pilina i loko o kahi buffer, hoʻololi ʻia i kahi hōʻike string a hāʻawi ʻia i protocol.Koho
  • protocol.Koho hoʻi result a i ʻole ke kumu o ka hewa. result a laila hoʻoili ʻia i protocol.Wehewehee hoi ana intrpr - mea o ke ano InterpreteData, a i ʻole ke kuhi hewa i ka hana ʻana i ka hopena koho
  • A laila hoʻokō ʻia ka hoʻololi intrpr.Kauoha[0] nāna e nānā i kekahi o: hopena, inv, hewa a aia kekahi mahele ka paʻamau
  • Ma ka pauku result ʻike ʻia ka hoʻololi e ka waiwai intrpr.Kauoha[1] nāna e nānā i nā waiwai pale lōʻihi и mana (i kēlā me kēia hihia ua kapa ʻia ka hana pili)

Nā hana GetVersion и Ka lōʻihi aia ma ka waihona srvlib.go pūʻolo kikowaena

GetVersion(conn net.Conn, version string)

paʻi wale ia i ka console a hoʻouna i ka mana i hāʻawi ʻia i ka ʻāpana i ka mea kūʻai:

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

.
kuleana pili i

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

hoʻouka i kahi poloka, kālepa, a i ʻole nā ​​​​ʻikepili kikoʻī e like me kēia:

  • Paʻi ʻia i ka console ke ʻano o ka ʻikepili i kuhikuhi ʻia i ka protocol e pono e ʻae ʻia:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Heluhelu i ka waiwai intrpr.Kino i ka hoololi helu buf_len
  • Hana i kahi pale newbuf nui i kuhikuhi ʻia:
    make([]byte, buf_len)
  • Hoʻouna i kahi pane maikaʻi:
    conn.Write([]byte("result:ok"))
  • Hoʻopiha piha i ka pale mai ke kahawai heluhelu:
    io.ReadFull(conn, newbuf)

    .

  • Paʻi i nā mea o ka buffer i ka console
    fmt.Println(string(newbuf))

    a me ka helu o na byte i heluheluia

    fmt.Println("Bytes length:", n)
  • Hoʻouna i kahi pane maikaʻi:
    conn.Write([]byte("result:ok"))

Hoʻonohonoho ʻia nā ʻano hana mai ka pūʻolo kikowaena e hana i ka ʻikepili i loaʻa me ka hoʻohana ʻana i nā hana mai ka pūʻolo Hana ma'amau.

Hōʻoia

Hana ʻia kahi protocol ma ke ʻano he mea e hōʻike ana i ka ʻikepili i ka hoʻololi pūnaewele.

Koho(str string) (string, error) hana mua i ka ʻikepili i loaʻa e ke kikowaena, loaʻa i kahi hōʻike string o ka ʻikepili ma ke ʻano he hoʻokomo a hoʻihoʻi i kahi kaula i hoʻomākaukau ʻia no Unuhi'ōlelo:

  • Hoʻokaʻawale ʻia ke kaula hoʻokomo i ke poʻo a me ke kino me ka hoʻohana ʻana ReqParseN2(str)
  • Ua hoʻokaʻawale ʻia ke poʻo i mau mea a waiho ʻia i kahi ʻāpana kauoha me ka hoʻohana ʻana iā ReqParseHead (poʻo)
  • В hoʻololi(mau kauoha[0]) koho i ke kauoha i loaʻa (cmd, kī, helu wahi a i ʻole ua hoʻomaka ka ʻāpana ka paʻamau)
  • Nānā ʻia nā kauoha 2 ma cmd hoʻololi (mau kauoha [1]) - lōʻihi и hoʻololi.
  • loa nānā i ke ʻano ʻikepili i loko kauoha[2] a hoʻopaʻa i loko ʻano ʻikepili
  • Nānā i kēlā kino loaʻa i kahi waiwai kaula
    len(body) < 1
  • Hoʻihoʻi i ke kaula pane:
    "result:bufferlength:" + datatype + "/" + body
  • hoʻololi hoʻihoʻi i kahi kaula
    return "result:version/auto"

Unuhi'ōlelo

Loaʻa i ka hoʻolālā InterpreteData a hana i ka hana lua o ka ʻikepili i hoʻihoʻi ʻia mai wae nā kaula a me nā mea hana InterpreteData.

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

kuleana pili i

Interprete(str string) (*InterpreteData, error)

ʻae i kahi kaula result a hana a hoʻihoʻi i kahi kuhikuhi i ka mea InterpreteData.

Holomua:

  • Pēlā nō wae lawe ʻia ke poʻo a me ke kino me ka hoʻohana ʻana ReqParseN2(str)
  • Ua maheleia ke poo i mau mea me ka hoohana ana ReqParseHead(poo)
  • Hoʻomaka ka mea InterpreteData a ua hoʻihoʻi ʻia kahi kuhikuhi iā ia.

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

Hoʻohana ʻia kēia mea ma server.go pūʻolo nui.

Client

Loaʻa i ka pūʻolo mea kūʻai aku nā hana TCConnect и TCPResponseData.

kuleana pili i

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

hana penei:

  • Hana ʻia kahi pilina i ka pilina i kuhikuhi ʻia ma ka mea hoʻonohonoho i hala
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Hoʻouna ʻia ka ʻikepili i hāʻawi ʻia i ka ʻikepili helu:
    conn.Write(data)
  • Heluhelu ia ka pane
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    a pai ʻia ma ka console

    fmt.Println(string(resp[:n]))
  • Inā hoʻoili ʻia payload a laila hāʻawi aku
    conn.Write(payload)

    a heluhelu pū i ka pane kikowaena, paʻi ʻia i ka console

kuleana pili i

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

hana i kahi pale o ka nui i kuhikuhi ʻia, heluhelu i ka pane kikowaena ma laila a hoʻihoʻi i kēia buffer a me ka helu o nā bytes i heluhelu ʻia, a me kahi mea hewa.

ʻO nā mea kūʻai aku

Lawelawe e hoʻouna i nā kauoha i nā kikowaena node, a me ka loaʻa ʻana o nā ʻikepili pōkole a me ka hoʻāʻo.

Hiki iā ʻoe ke ʻae i kēia mau ʻāpana: faila hoʻonohonoho ma JSON format, ʻikepili e hoʻouna ʻia i ke kikowaena ma ke ʻano he kaula, ke ala i ka faila e hoʻouna ʻia i ka uku, ka hae emulation node scheduler, ʻano o ka ʻikepili i hoʻoili ʻia ma ke ʻano he helu helu.

  • Loaʻa i ka hoʻonohonoho
    st := types.ParseConfig(*config)
  • Inā hala ka hae emu, hoʻomaka ia mea hoʻopaʻapaʻa
  • Inā hāʻawi ʻia ka hae f e hōʻike ana i ke ala i ka faila, a laila hoʻouka mākou i kāna ʻikepili i loko fdb a hoʻouna ʻia ka ʻike i ke kikowaena
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Inā ʻaʻole i kuhikuhi ʻia ka faila, a laila hoʻouna wale ʻia ka ʻikepili mai ka hae -d:
    client.TCPConnect(st, []byte(*data), nil)

He hōʻike maʻalahi kēia e hōʻike ana i ke ʻano o ka protocol. I ka wā o ka hoʻomohala ʻana, hoʻohui ʻia ka hana pono i kona ʻano.

Ma ka ʻaoʻao ʻelua e kamaʻilio wau e pili ana i nā hoʻonohonoho ʻikepili no nā poloka a me nā hana, ma 3 e pili ana i ka server WebSocket no ka hoʻopili ʻana mai JavaScript, ma 4 e nānā wau i ka mea hoʻonohonoho hoʻonohonoho hoʻonohonoho, a laila kahi mīkini hoʻopaʻa e hana i ka bytecode mai nā hoʻokomo a me nā huahana, cryptography a nā loko no nā mea hoʻopuka.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka