Pag-uswag sa Blockchain alang sa industriya gamit ang Go. Bahin 1

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.

Pag-uswag sa Blockchain alang sa industriya gamit ang Go. Bahin 1

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.

Ug ania ang ikaduhang bahin β€” bahin sa blockchain ug mga istruktura sa datos sa transaksyon, ingon man bahin sa pakete nga nagpatuman sa interaksiyon sa database.

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.

Ania ang link sa github

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

Idugang sa usa ka comment