Sulod na sa upat ka bulan karon, nagtrabaho ko sa usa ka proyekto nga akong gitawag og "Development of Blockchain-Based Data Protection and Management Tools in Government and Industrial Spheres."
Karon gusto nakong isulti kanimo kung giunsa nako pagsugod kini nga proyekto, ug akong ihulagway karon ang program code sa detalyado.

Kini ang unang artikulo sa usa ka serye. Dinhi akong gihulagway ang server ug ang protocol. Sa tinuud, ang magbabasa gidapit pa gani sa pagsulat sa ilang kaugalingong mga bersyon niining mga elemento sa blockchain.
— mahitungod sa mga istruktura sa datos ug mga transaksyon sa blockchain, ingon man mahitungod sa interaksyon sa pakete nga nagpatuman sa database.
Sa miaging tuig, sa Digital Breakthrough hackathon, among gipasiugda ang ideya sa paghimo og mapuslanong sistema gamit ang distributed ledger technology para sa industriya ug digital economy. Ang Foundation for Assistance to Small Innovative Enterprises (FASIE) naghatag usab og grant para sa kalamboan (kinahanglan kong magsulat og lahi nga artikulo bahin sa grant para sa mga bag-o pa lang nagsugod). Karon, atong hisgotan ang mga butang matag lakang.
Ang pag-develop gihimo sa Go nga pinulongan, ug ang database diin gitipigan ang mga bloke mao ang LevelDB.
Ang mga nag-unang bahin mao ang protocol, ang server (nga nagpadagan sa TCP ug WebSocket - ang una para sa pag-synchronize sa blockchain, ang ikaduha para sa pagkonektar sa mga kliyente, pagpadala sa mga transaksyon ug mga sugo gikan sa JavaScript, pananglitan.
Sama sa nahisgotan, kini nga blockchain gikinahanglan una aron awtomatiko ug maseguro ang mga pagbayloay og produkto tali sa mga supplier ug kustomer, o pareho. Kini nga mga kompanya nagpanuko sa pagsalig sa usag usa. Apan ang tumong dili lang ang paghimo og checkbook nga adunay built-in nga calculator, apan usa ka sistema nga awtomatiko ang kadaghanan sa mga rutina nga buluhaton nga motumaw atol sa siklo sa kinabuhi sa produkto. Ang bytecode nga responsable niini, sama sa naandan sa mga blockchain, gitipigan sa mga input ug output sa mga transaksyon (ang mga transaksyon mismo gitipigan sa mga bloke, nga sa LevelDB gi-encode daan sa GOB format). Una, atong hisgutan ang protocol ug ang server (nailhan usab nga node).
Ang protocol mogana nga simple ra. Ang tibuok katuyoan niini mao ang pagbalhin ngadto sa download mode para sa pipila ka data, kasagaran usa ka block o transaksyon, agig tubag sa usa ka espesyal nga command string. Kinahanglan usab kini para sa pagbayloay og imbentaryo, aron ang node mahibalo kung kinsa ang konektado niini ug kung unsa ang ilang gibuhat (ang mga node nga konektado para sa usa ka synchronization session gitawag usab nga "mga silingan" tungod kay ang ilang mga IP address nahibal-an ug ang ilang state data gitipigan sa memorya).
Mga Folder (mga direktoryo sumala sa ilang tawag) Linux) gitawag og mga pakete sa pinulongan nga Go, busa sa sinugdanan sa matag file nga adunay Go code niini nga direktoryo, ilang isulat ang pakete nga [folder_name_where_this_file_is]. Kung dili, dili nila ma-feed ang pakete ngadto sa compiler. Aw, dili kana sekreto sa mga nahibalo sa pinulongan. Ania kini nga mga pakete:
- Interaksyon sa network (server, client, protocol)
- Mga istruktura sa gitipigan ug gipadala nga datos (block, transaksyon)
- Database (blockchain)
- Konsensus
- Gipundok nga virtual nga makina (xvm)
- Auxiliary (crypto, types) mao ra na sa pagkakaron.
Kini usa ka bersyon sa pagbansay; kulang kini sa komunikasyon sa interprocess ug daghang mga sangkap sa eksperimento, apan ang istruktura parehas sa kasamtangang gipalambo. Kung naa kay mga sugyot sa mga komento, malipayon ko nga tagdon kini alang sa dugang nga pag-uswag. Karon, pipila ka mga pagklaro bahin sa server ug mga pakete. Protocol.
Atong tan-awon una ang server.
Ang server subroutine molihok isip usa ka data server nga nagpadagan sa TCP protocol gamit ang mga istruktura sa datos gikan sa protocol package.
Ang subroutine naggamit sa mosunod nga mga pakete: server, Protocol, matangSa pakete mismo tcp_server.go adunay istruktura sa datos Pag-alagad.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}Mahimo kini nga mosunod sa mosunod nga mga parameter:
- Ang network port diin mahitabo ang pagbayloay og datos
- File sa pag-configure sa server sa JSON format
- I-flag para sa pagdagan sa debug mode (pribadong blockchain)
Pag-uswag:
- Ang konpigurasyon gibasa gikan sa usa ka JSON file.
- Ang debug mode flag gisusi: kung kini naka-set, ang network synchronization scheduler wala pa masugdan ug ang blockchain wala ma-download.
- Pag-initialize sa istruktura sa datos sa configuration ug pagsugod sa server
server
- Naghimo sa pagsugod sa TCP server ug interaksyon sa network subay sa protocol.
- Kini adunay sulod nga Serve data structure nga gilangkoban sa port number, buffer size, ug pointer sa structure. mga tipo.Mga Setting
- Ang Run method magsugod sa komunikasyon sa network (pagpamati sa mga mosulod nga koneksyon sa usa ka gitakdang port; kung madawat ang usa ka bag-ong koneksyon, ang pagproseso niini ibalhin sa pribadong pamaagi sa handle sa usa ka bag-ong thread)
- В Pagdumala Ang datos gikan sa koneksyon gibasa ngadto sa usa ka buffer, gi-convert ngadto sa usa ka string representation, ug gipasa ngadto sa protocol.Pagpili
- protocol.Pagpili ningbalik resulta o hinungdan sa usa ka sayop. resulta unya gibalhin ngadto sa protocol.Ipasabot, nga mobalik intrpr — butang sa tipo Paghubad sa Data, o hinungdan sa sayop sa pagproseso sa resulta sa pagpili
- Unya ang switch gipatuman sa intrpr.Mga Sugo[0] diin usa sa mga musunod ang gisusi: resulta, inv, sayop ug adunay usa ka seksyon Default
- Sa seksyon resulta ang switch makit-an pinaagi sa bili intrpr.Mga Sugo[1] nga nagsusi sa mga kantidad gitas-on sa buffer и nga bersyon (sa matag kaso ang katugbang nga gimbuhaton gitawag)
Mga katuyoan Kuhaa ang Bersyon и BufferLength naa sa file srvlib.go pakete sa server.
GetVersion(conn net.Conn, version string)i-print lang sa console ug ipadala ang bersyon nga gipasa sa parameter ngadto sa kliyente:
conn.Write([]byte("result:" + version)).
function
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)mo-download sa usa ka block, transaksyon o uban pang gitakdang datos sama sa mosunod:
- I-print sa console ang klase sa datos nga gitino sa protocol nga kinahanglan dawaton:
fmt.Println("DataType:", intrpr.Commands[2]) - Gibasa ang bili intrpr.Lawas ngadto sa usa ka numerical variable buf_len
- Naghimo og buffer bag-ong buf gitakdang gidak-on:
make([]byte, buf_len) - Nagpadala ug ok nga tubag:
conn.Write([]byte("result:ok")) - Gipuno ang buffer sa hingpit gikan sa read stream:
io.ReadFull(conn, newbuf).
- Ipagawas ang mga 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 pakete sa server gi-configure aron maproseso ang nadawat nga datos gamit ang mga gimbuhaton gikan sa pakete. Protocol.
Protocol
Ang usa ka protocol nagsilbing usa ka paagi diin ang datos girepresentahan sa usa ka network exchange.
Pagpili(str string) (string, sayop) naghimo sa pangunang pagproseso sa datos nga nadawat sa server, nakadawat og representasyon sa string sa datos isip input ug nagbalik og string nga giandam para niini. Interprete:
- Ang input string gibahin sa ulo ug lawas gamit ang ReqParseN2(str)
- Ang head gibahin ngadto sa mga elemento ug gibutang sa commands slice gamit ang ReqParseHead(head)
- В switch(mga sugo[0]) among gipili ang nadawat nga sugo (cmd, yawe, adres o ang seksyon gi-trigger Default)
- Sa cmd, 2 ka sugo ang gisusi switch(mga sugo[1]) — gitas-on и getversion.
- gitas-on nagsusi sa tipo sa datos sa mga sugo[2] ug i-save kini sa datatype
- Mga pagsusi nga lawas adunay sulod nga kantidad sa string
len(body) < 1 - Ibalik ang tubag nga string:
"result:bufferlength:" + datatype + "/" + body - getversion nagbalik og usa ka string
return "result:version/auto"
Interprete
Naglangkob sa istruktura sa InterpreteData ug naghimo sa ikaduhang pagproseso sa gibalik nga datos. Pagpili mga kuwerdas ug pagporma sa butang Paghubad sa Data.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}function
Interprete(str string) (*InterpreteData, error)mokuha og usa ka hilo resulta ug nagmugna og mobalik og reperensya sa butang Paghubad sa Data.
Pag-uswag:
- Susama usab Pagpili Ang ulo ug lawas gikuha gamit ang ReqParseN2(str)
- ang ulo gibahin ngadto sa mga elemento gamit ang ReqParseHead(ulo)
- Ang butang gi-initialize Paghubad sa Data ug usa ka pointer ang gibalik niini:
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nilKini nga butang gigamit sa server.go pangunang pakete.
Kliyente
Ang pakete sa kliyente adunay mga gimbuhaton TCPConnect и TCPResponseData.
function
TCPConnect(s *types.Settings, data []byte, payload []byte)molihok sama sa mosunod:
- Usa ka koneksyon ang natukod sa koneksyon nga gitino sa gipasa nga settings object.
net.Dial("tcp", s.Host + ":" + s.Port) - Ang datos nga gipasa sa parameter sa datos gibalhin:
conn.Write(data) - Ang tubag gibasa
resp, n, _ := TCPResponseData(conn, s.BufSize)ug giimprinta sa console
fmt.Println(string(resp[:n])) - Kon ibalhin payload unya ipasa kini
conn.Write(payload)ug gibasa usab ang tubag sa server, nga giimprinta kini sa console
function
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)Naghimo kini og buffer sa gitakdang gidak-on, nagbasa sa tubag sa server niini, ug nagbalik niini nga buffer ug sa gidaghanon sa mga byte nga nabasa, ingon man usa ka error object.
Subroutine sa kliyente
Nagsilbi kini sa pagpadala sa mga sugo ngadto sa mga node server, ingon man sa pagkuha og mubo nga estadistika ug pagsulay.
Makadawat sa mosunod nga mga parameter: configuration file sa JSON format, data nga ibalhin sa server isip string, path sa file nga ibalhin sa payload, node scheduler emulation flag, klase sa data nga ibalhin isip numeric value.
- Pagkuha sa configuration
st := types.ParseConfig(*config) - Kon ang bandila sa emu ipasa, magsugod na kini tig-eskedyul
- Kon ang f flag gihatag uban sa path sa file, atong i-load ang data niini ngadto sa fdb ug ang sulod ipadala sa server
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb) - Kon ang file wala gitino, nan ang datos gikan sa bandila ipadala lang. -d:
client.TCPConnect(st, []byte(*data), nil)
Kini usa ka gipasimple nga representasyon sa istruktura sa protocol. Atol sa pag-develop, ang gikinahanglan nga functionality gidugang sa istruktura niini.
Sa Bahin 2, akong hisgotan ang mga istruktura sa datos para sa mga bloke ug mga transaksyon, sa Bahin 3, akong hisgotan ang usa ka WebSocket server para sa pagkonektar gikan sa JavaScript, sa Bahin 4, akong hisgotan ang synchronization scheduler, dayon ang usa ka stack engine nga nagproseso sa bytecode gikan sa mga input ug output, cryptography, ug mga pool para sa mga output.
Source: www.habr.com
