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ʻī.
ʻ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.
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.
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