Sulod sa upat ka bulan karon nagtrabaho ako sa usa ka proyekto nga gitawag nga "Pagpalambo sa pagpanalipod sa datos ug mga himan sa pagdumala sa mga sektor sa gobyerno ug industriya nga gibase sa blockchain."
Karon gusto nakong isulti kanimo kung giunsa nako pagsugod kini nga proyekto, ug karon akong ihulagway ang code sa programa sa detalye.
Kini ang unang artikulo sa serye sa mga artikulo. Dinhi akong gihulagway ang server ug protocol. Sa tinuud, ang magbabasa mahimo pa nga magsulat sa iyang kaugalingon nga mga bersyon sa kini nga mga elemento sa blockchain.
Kaniadtong miaging tuig, sa Digital Breakthrough hackathon, nakahunahuna sila nga maghimo usa ka mapuslanon nga sistema alang sa industriya ug ang digital nga ekonomiya gamit ang giapod-apod nga teknolohiya sa ledger; usa ka grant ang gi-isyu usab alang sa pag-uswag sa Innovation Assistance Fund (Kinahanglan ko magsulat usa ka lahi artikulo mahitungod sa grant, alang niadtong bag-o lang nagsugod sa mga startup ), ug karon naa na.
Ang pag-uswag mahitabo sa Go nga pinulongan, ug ang database diin ang mga bloke gitipigan mao ang LevelDB.
Ang mga nag-unang bahin mao ang protocol, ang server (nga nagpadagan sa TCP ug WebSocket - ang una alang sa pag-synchronize sa blockchain, ang ikaduha alang sa pagkonektar sa mga kliyente, pagpadala sa mga transaksyon ug mga mando gikan sa JavaScript, pananglitan.
Sama sa nahisgutan na, kini nga blockchain gikinahanglan una aron ma-automate ug mapanalipdan ang pagbinayloay sa mga produkto tali sa mga supplier ug kustomer, o pareho sa usa ka tawo. Kini nga mga tawo wala magdali sa pagsalig sa usag usa. Apan ang tahas dili lamang sa paghimo sa usa ka "checkbook" nga adunay usa ka built-in nga calculator, apan usa ka sistema nga nag-automate sa kadaghanan sa naandan nga mga buluhaton nga mitungha kung nagtrabaho kauban ang siklo sa kinabuhi sa produkto. Ang bytecode nga responsable niini nga butang, sama sa naandan sa mga blockchain, gitipigan sa mga input ug output sa mga transaksyon (ang mga transaksyon mismo gitipigan sa mga bloke, ang mga bloke sa LevelDB gi-pre-encode sa GOB format). Una, hisgotan nato ang protocol ug ang server (aka node).
Ang protocol dili komplikado, ang tibuuk nga punto niini mao ang pagbalhin sa mode sa pag-load sa pipila nga mga datos, kasagaran usa ka bloke o transaksyon, agig tubag sa usa ka espesyal nga linya sa mando, ug kinahanglan usab kini alang sa pagbayloay sa imbentaryo, aron mahibal-an sa node kung kinsa kini. konektado sa ug sa unsa nga paagi sila adunay negosyo nga buhaton (ang mga node nga konektado alang sa synchronization session gitawag usab nga "silingan" tungod kay ang ilang IP nahibal-an ug ang ilang datos sa estado gitipigan sa memorya).
Ang mga folder (mga direktoryo sama sa pagtawag kanila sa Linux) sa pagsabot sa mga programmer sa Go gitawag nga mga pakete, mao nga sa sinugdanan sa matag file nga adunay Go code gikan niini nga direktoryo sila magsulat sa package folder_name_where_this_file nahimutang. Kung dili, dili nimo mapakaon ang package sa compiler. Aw, dili kini sekreto alang niadtong nakahibalo niini nga pinulongan. Mao kini ang mga pakete:
- Komunikasyon sa network (server, kliyente, protocol)
- Mga istruktura sa gitipigan ug gipasa nga datos (block, transaksyon)
- Database (blockchain)
- Konsensus
- Naka-stack nga virtual nga makina (xvm)
- Auxiliary (crypto, mga tipo) kana lang sa pagkakaron.
Kini usa ka bersyon sa edukasyon, wala kini inter-proseso nga interaksyon ug daghang mga sangkap sa eksperimento, apan ang istruktura katumbas sa usa diin gihimo ang pag-uswag. Kung adunay ka isugyot sa mga komento, malipay ako nga tagdon kini sa dugang nga pag-uswag. Ug karon alang sa katin-awan sa server ug Protocol.
Atong tan-awon una ang server.
Ang subroutine sa server naglihok isip data server nga nagdagan sa ibabaw sa TCP protocol gamit ang mga istruktura sa datos gikan sa protocol package.
Ang rutina naggamit sa mosunod nga mga pakete: server, Protocol, matang. Sa package mismo tcp_server.go naglangkob sa istruktura sa datos Pag-alagad.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
Makadawat kini sa mosunod nga mga parameter:
- Network port diin ang data ibaylo
- Server configuration file sa JSON format
- Bandila alang sa pagdagan sa debug mode (pribado nga blockchain)
Pag-uswag:
- Gibasa ang configuration gikan sa JSON file
- Ang bandila sa debug mode gisusi: kung kini gitakda, ang network synchronization scheduler dili gilansad ug ang blockchain wala ma-load
- Pagsugod sa istruktura sa datos sa pagsumpo ug pagsugod sa server
server
- Nagdala sa paglansad sa TCP server ug interaksyon sa network subay sa protocol.
- Kini adunay usa ka istruktura sa datos sa Pag-alagad nga naglangkob sa usa ka numero sa pantalan, usa ka gidak-on sa buffer ug usa ka pointer sa istruktura mga tipo.Mga setting
- Ang pamaagi sa Run magsugod sa interaksyon sa network (pagpamati sa umaabot nga mga koneksyon sa usa ka gihatag nga pantalan, kung ang usa ka bag-ong koneksyon nadawat, ang pagproseso niini gibalhin sa pribadong pamaagi sa pagdumala sa usa ka bag-ong hilo)
- Π Pagdumala data gikan sa koneksyon gibasa ngadto sa usa ka buffer, nakabig ngadto sa usa ka string representasyon ug gipasa ngadto sa protocol.Pagpili
- protocol.Pagpili ningbalik resulta o hinungdan sa usa ka sayup. resulta unya gibalhin sa protocol.Paghubadnga mibalik intrpr - butang sa tipo InterpreteData, o nagpahinabog sayop sa pagproseso sa resulta sa pagpili
- Unya ang switch gipatuman intrpr.Mga Sugo[0] nga nagsusi sa usa sa: resulta, inv, sayop ug naay section Default
- Sa seksyon resulta switch makita pinaagi sa bili intrpr.Mga Sugo[1] nga nagsusi sa mga bili bufferlength ΠΈ nga bersyon (sa matag kaso ang katugbang nga function gitawag)
Mga katuyoan GetVersion ΠΈ BufferLength naa sa file srvlib.go pakete sa server
GetVersion(conn net.Conn, version string)
nag-imprinta lang kini sa console ug gipadala ang bersyon nga gipasa sa parameter sa kliyente:
conn.Write([]byte("result:" + version))
.
function
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
nagkarga og block, transaksyon, o uban pang piho nga datos sama sa mosunod:
- Giimprinta sa console ang tipo sa datos nga gitakda sa protocol nga kinahanglan dawaton:
fmt.Println("DataType:", intrpr.Commands[2])
- Gibasa ang bili intrpr.Lawas ngadto sa usa ka numeric variable buf_len
- Naghimo ug buffer newbuf espesipikong gidak-on:
make([]byte, buf_len)
- Nagpadala ug ok nga tubag:
conn.Write([]byte("result:ok"))
- Bug-os nga pun-on ang buffer gikan sa read stream:
io.ReadFull(conn, newbuf)
.
- Nag-imprinta sa sulod sa buffer ngadto sa console
fmt.Println(string(newbuf))
ug ang gidaghanon sa mga byte nga gibasa
fmt.Println("Bytes length:", n)
- Nagpadala ug ok nga tubag:
conn.Write([]byte("result:ok"))
Ang mga pamaagi gikan sa package sa server gi-configure aron maproseso ang nadawat nga datos gamit ang mga function gikan sa package Protocol.
Protocol
Ang usa ka protocol nagsilbi nga usa ka paagi nga nagrepresentar sa datos sa pagbinayloay sa network.
Pagpili(str string) (string, sayop) Nagbuhat sa panguna nga pagproseso sa datos nga nadawat sa server, nakadawat usa ka representasyon sa string sa datos ingon input ug nagbalik sa usa ka string nga giandam alang sa Maghuhubad:
- Ang input string gibahin sa ulo ug lawas gamit ReqParseN2(str)
- ang ulo gibahin ngadto sa mga elemento ug gibutang sa usa ka command slice gamit ang ReqParseHead(ulo)
- Π switch(mga sugo[0]) pilia ang nadawat nga sugo (cmd, yawe, adres o ang seksyon na-trigger Default)
- 2 nga mga sugo ang gisusi sa cmd switch(mga sugo[1]) β gitas-on ΠΈ getversion.
- gitas-on gisusi ang tipo sa datos sa mga sugo[2] ug gitipigan kini sa datatype
- Gisusi kana lawas adunay sulud nga kantidad sa string
len(body) < 1
- Ibalik ang tubag nga string:
"result:bufferlength:" + datatype + "/" + body
- getversion nibalik ug string
return "result:version/auto"
Maghuhubad
Naglangkob sa istruktura sa InterpreteData ug naghimo sa ikaduhang pagproseso sa datos nga gibalik gikan Pagpili mga kuwerdas ug pagporma sa butang InterpreteData.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
function
Interprete(str string) (*InterpreteData, error)
modawat ug pisi resulta ug nagmugna ug nagbalik sa usa ka pakisayran sa butang InterpreteData.
Pag-uswag:
- Susama usab Pagpili ulo ug lawas gikuha gamit ReqParseN2(str)
- ulo gibahin ngadto sa mga elemento sa paggamit ReqParseHead(ulo)
- Ang butang gisugdan InterpreteData ug ang usa ka tudlo niini gibalik:
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
Kini nga butang gigamit sa server.go punoan nga pakete.
Kliyente
Ang pakete sa kliyente naglangkob sa mga gimbuhaton TCPConnect ΠΈ TCPResponseData.
function
TCPConnect(s *types.Settings, data []byte, payload []byte)
nagtrabaho sama niini:
- Ang usa ka koneksyon gihimo sa koneksyon nga gitakda sa gipasa nga butang sa mga setting
net.Dial("tcp", s.Host + ":" + s.Port)
- Ang datos nga gipasa sa parameter sa datos gipasa:
conn.Write(data)
- Ang tubag gibasa
resp, n, _ := TCPResponseData(conn, s.BufSize)
ug giimprinta sa console
fmt.Println(string(resp[:n]))
- Kung gibalhin payload unya ipasa kini
conn.Write(payload)
ug gibasa usab ang tubag sa server, giimprinta kini sa console
function
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
nagmugna og buffer sa espesipikong gidak-on, nagbasa sa tubag sa server didto ug nagbalik niini nga buffer ug ang gidaghanon sa mga byte nga gibasa, ingon man usa ka butang nga sayup.
Subroutine sa kliyente
Nag-alagad sa pagpadala sa mga sugo ngadto sa mga server sa node, ingon man usab sa pagkuha sa mubo nga estadistika ug pagsulay.
Mahimong dawaton ang mosunod nga mga parameter: configuration file sa JSON format, data nga ipadala sa server isip string, path sa file nga ipadala sa payload, node scheduler emulation flag, tipo sa data nga gibalhin isip numeric value.
- Pagkuha sa configuration
st := types.ParseConfig(*config)
- Kung ang bandila sa emu ipasa, magsugod kini tigbaligya
- Kung ang f nga bandila nga nagpaila sa agianan sa file gihatag, nan among gikarga ang datos niini fdb ug ang sulod ipadala ngadto sa server
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- Kung ang file wala gitino, nan ang datos gikan sa bandila ipadala lang -d:
client.TCPConnect(st, []byte(*data), nil)
Kining tanan usa ka gipasimple nga representasyon nga nagpakita sa istruktura sa protocol. Atol sa pag-uswag, ang gikinahanglan nga pag-andar gidugang sa istruktura niini.
Sa ikaduha nga bahin maghisgot ako bahin sa mga istruktura sa datos alang sa mga bloke ug mga transaksyon, sa 3 bahin sa WebSocket server alang sa pagkonektar gikan sa JavaScript, sa 4 akong tan-awon ang scheduler sa pag-synchronize, dayon usa ka stack machine nga nagproseso sa bytecode gikan sa mga input ug output, cryptography ug pool alang sa mga output.
Source: www.habr.com