Pangwangunan Blockchain pikeun industri nganggo Go. Bagian 1

Pikeun opat bulan ayeuna kuring parantos damel dina proyék anu disebut "Pamekaran panyalindungan data sareng alat manajemén dina séktor pamaréntahan sareng industri dumasar kana blockchain."
Ayeuna Abdi hoyong ngabejaan Anjeun tentang kumaha kuring ngamimitian proyék ieu, sarta ayeuna kuring bakal ngajelaskeun kode program di jéntré.

Pangwangunan Blockchain pikeun industri nganggo Go. Bagian 1

Ieu artikel munggaran dina runtuyan artikel. Di dieu kuring ngajelaskeun server sareng protokol. Kanyataanna, nu maca malah bisa nulis versi sorangan tina elemen blockchain ieu.

Sareng ieu mangrupikeun bagian kadua — ngeunaan blockchain sareng struktur data transaksi, ogé ngeunaan pakét anu ngalaksanakeun interaksi sareng pangkalan data.

Taun ka tukang, dina hackathon Digital Breakthrough, aranjeunna mendakan ideu pikeun ngadamel sistem anu mangpaat pikeun industri sareng ékonomi digital nganggo téknologi ledger anu disebarkeun; hibah ogé dikaluarkeun pikeun pangwangunan ku Dana Bantuan Inovasi (kuring kedah nyerat anu misah. artikel ngeunaan hibah, pikeun maranéhanana anu ngan dimimitian startups ), sarta ayeuna dina urutan.

Pangwangunan lumangsung dina basa Go, sareng pangkalan data dimana blok disimpen nyaéta LevelDB.
Bagian utama nyaéta protokol, server (anu ngajalankeun TCP sareng WebSocket - anu munggaran pikeun nyingkronkeun blockchain, anu kadua pikeun nyambungkeun klien, ngirim transaksi sareng paréntah tina JavaScript, contona.

Sakumaha didadarkeun di, blockchain ieu diperlukeun utamana pikeun ngajadikeun otomatis tur ngajaga bursa produk antara suppliers jeung konsumén, atawa duanana dina hiji jalma. Jalma-jalma ieu henteu buru-buru silih percanten. Tapi tugasna henteu ngan ukur nyiptakeun "buku cek" kalayan kalkulator anu diwangun, tapi sistem anu ngajadikeun otomatis kalolobaan tugas rutin anu timbul nalika damel sareng siklus kahirupan produk. Bytecode anu tanggung jawab masalah ieu, sakumaha anu biasa sareng blockchain, disimpen dina input sareng kaluaran transaksi (transaksi sorangan disimpen dina blok, blok di LevelDB tos disandikeun dina format GOB). Mimiti, hayu urang ngobrol ngeunaan protokol sareng server (alias node).

Protokolna henteu rumit, sadayana titikna nyaéta ngalih ka modeu loading sababaraha data, biasana blok atanapi transaksi, pikeun ngaréspon kana garis paréntah khusus, sareng éta ogé diperyogikeun pikeun tukeur inventaris, supados titik terang saha éta. disambungkeun ka na kumaha maranéhna boga usaha pikeun ngalakukeun (titik disambungkeun pikeun sési sinkronisasi disebut oge "tatangga" sabab IP maranéhanana dipikawanoh tur data kaayaan maranéhanana disimpen dina mémori).

Polder (diréktori sakumaha Linux Ubuntu nelepon aranjeunna) dina pamahaman Go programer disebut pakét, jadi dina awal unggal file kalawan kode Go ti diréktori ieu aranjeunna nulis pakét folder_name_where_this_file ieu lokasina. Upami teu kitu, anjeun moal tiasa eupan bungkusan ka kompiler. Nya, ieu sanés rusiah pikeun anu terang basa ieu. Ieu bungkusan:

  • Komunikasi jaringan (server, klien, protokol)
  • Struktur data anu disimpen sareng dikirimkeun (blok, transaksi)
  • Pangkalan data (blockchain)
  • Konsensus
  • Mesin virtual tumpuk (xvm)
  • Auxiliary (crypto, jenis) éta sadayana pikeun ayeuna.

Ieu tautan ka github

Ieu mangrupikeun vérsi atikan, teu aya interaksi antar-prosés sareng sababaraha komponén ékspérimén, tapi strukturna cocog sareng anu nuju dilaksanakeun pangwangunan. Upami anjeun gaduh naon waé anu disarankeun dina koméntar, kuring bakal resep nyandak éta dina pangwangunan salajengna. Tur ayeuna keur penjelasan ngeunaan server na protokol.

Hayu urang tingali heula server.

The subrutin server tindakan salaku server data anu dijalankeun dina luhureun protokol TCP ngagunakeun struktur data tina pakét protokol.

Rutin ngagunakeun pakét di handap ieu: server, protokol, rupa. Dina bungkusan sorangan tcp_server.go ngandung struktur data ngaladenan.

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

Éta tiasa nampi parameter di handap ieu:

  • Port jaringan dimana data bakal ditukeurkeun
  • File konfigurasi server dina format JSON
  • Bandéra pikeun ngajalankeun dina modeu debug (blockchain swasta)

kamajuan:

  • Maca konfigurasi tina file JSON
  • Bandéra mode debug dipariksa: upami disetel, penjadwal sinkronisasi jaringan henteu diluncurkeun sareng blokchain henteu dimuat
  • Initializing struktur data konfigurasi tur mimitian server

server

  • Ngalaksanakeun peluncuran server TCP sareng interaksi jaringan saluyu sareng protokol.
  • Mibanda struktur data Ngawula diwangun ku jumlah port, ukuran panyangga sarta pointer kana struktur jenis.Setélan
  • Metodeu Run ngamimitian interaksi jaringan (ngadangukeun sambungan anu asup dina port anu dipasihkeun, nalika sambungan énggal ditampi, pamrosésanna ditransfer kana metode cecekelan pribadi dina benang énggal)
  • В gagang data ti sambungan nu dibaca kana panyangga a, dirobah jadi ngagambarkeun string sarta lulus ka protokol.Pilihan
  • protokol.Pilihan mulih hasil atawa ngabalukarkeun kasalahan. hasil lajeng dipindahkeun ka protokol.Nafsirkeunnu mulih intrpr - objék tina tipe InterpreteData, atawa ngabalukarkeun kasalahan dina ngolah hasil pilihan
  • Lajeng saklar dieksekusi intrpr.Paréntah[0] nu mariksa salah sahiji: hasil, inv, kasalahan tur aya bagian standar
  • Dina bagian hasil switch kapanggih ku nilai intrpr.Paréntah[1] nu mariksa nilai panjangna panyangga и Vérsi (dina unggal hal, fungsi anu saluyu disebut)

fungsi GetVersion и Panjang panyangga aya dina file srvlib.go pakét server

GetVersion(conn net.Conn, version string)

Éta ngan saukur nyitak kana konsol sareng ngirimkeun versi anu disalurkeun dina parameter ka klien:

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

.
fungsi

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

ngamuat blok, transaksi, atawa data husus sejenna saperti kieu:

  • Nyitak kana konsol jinis data anu ditangtukeun dina protokol anu kedah ditampi:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Maca nilai intrpr.Awak kana variabel numerik buf_len
  • Nyiptakeun panyangga newbuf ukuran ditangtukeun:
    make([]byte, buf_len)
  • Ngirim réspon ok:
    conn.Write([]byte("result:ok"))
  • Lengkep ngeusian panyangga tina aliran baca:
    io.ReadFull(conn, newbuf)

    .

  • Prints eusi panyangga ka konsol nu
    fmt.Println(string(newbuf))

    jeung jumlah bait dibaca

    fmt.Println("Bytes length:", n)
  • Ngirim réspon ok:
    conn.Write([]byte("result:ok"))

Métode tina pakét server dikonpigurasi pikeun ngolah data anu ditampi nganggo fungsi tina pakét protokol.

Protocol

A protokol boga fungsi minangka sarana nu ngagambarkeun data dina bursa jaringan.

Pilihan (str string) (string, kasalahan) ngalakukeun pamrosésan primér data anu ditampi ku server, nampi répréséntasi string data salaku input sareng mulangkeun string anu disiapkeun pikeun Panarjamah:

  • string input dibagi kana sirah jeung awak ngagunakeun ReqParseN2(str)
  • sirah dibagi kana elemen sareng disimpen kana potongan paréntah nganggo ReqParseHead (sirah)
  • В switch(paréntah[0]) pilih paréntah anu ditampi (cmd, konci, alamat atawa bagian nu dipicu standar)
  • 2 paréntah dipariksa di cmd switch (paréntah [1]) - panjang и getversion.
  • panjang pariksa tipe data dina paréntah [2] tur nyimpen eta di tipe data
  • Cék éta awak ngandung nilai string
    len(body) < 1
  • Ngabalikeun string respon:
    "result:bufferlength:" + datatype + "/" + body
  • getversion mulih string a
    return "result:version/auto"

Panarjamah

Ngandung struktur InterpreteData sareng ngalaksanakeun pamrosésan sekundér tina data anu dipulangkeun pilihan string jeung formasi objék InterpreteData.

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

fungsi

Interprete(str string) (*InterpreteData, error)

narima string a hasil sarta nyieun tur mulih rujukan ka obyék InterpreteData.

kamajuan:

  • Nya kitu pilihan sirah jeung awak sasari maké ReqParseN2(str)
  • sirah dibagi kana elemen ngagunakeun ReqParseHead(sirah)
  • Obyék ieu initialized InterpreteData sareng pointer ka dinya dipulangkeun:

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

objék ieu dipaké dina server.go pakét utama.

langganan

Paket klien ngandung fungsi TCPConnect и TCPResponseData.

fungsi

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

dianggo sapertos kieu:

  • A sambungan dijieun ka sambungan dieusian dina obyék setélan kaliwat
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Data anu dikirimkeun dina parameter data dikirimkeun:
    conn.Write(data)
  • Jawaban dibacakeun
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    sarta dicitak dina konsol nu

    fmt.Println(string(resp[:n]))
  • Lamun dialihkeun payload teras ngaliwat
    conn.Write(payload)

    sarta ogé maca respon server, nyitak ka konsol nu

fungsi

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

nyiptakeun panyangga tina ukuran nu ditangtukeun, maca respon server aya na mulih panyangga ieu sareng jumlah bait dibaca, kitu ogé hiji objek kasalahan.

subrutin klien

Fungsi pikeun ngirim paréntah ka server node, kitu ogé ménta statistik ringkes jeung nguji.

Tiasa nampi parameter di handap ieu: file konfigurasi dina format JSON, data pikeun dikirim ka server sakumaha string a, jalur ka file pikeun dikirim ka payload, simpul scheduler emulation bandéra, tipe data ditransfer salaku nilai numerik.

  • Meunangkeun konfigurasi
    st := types.ParseConfig(*config)
  • Lamun bendera emu diliwatan, éta dimimitian tukang ngadu
  • Upami bendera f anu nunjukkeun jalur ka file disayogikeun, maka kami ngamuat datana fdb jeung eusi dikirim ka server
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Lamun file teu dieusian, lajeng data ti bandéra ngan dikirim -d:
    client.TCPConnect(st, []byte(*data), nil)

Sadaya ieu mangrupikeun perwakilan saderhana anu nunjukkeun struktur protokol. Salila pangwangunan, fungsionalitas anu diperyogikeun ditambah kana strukturna.

Dina bagian kadua kuring bakal ngobrol ngeunaan struktur data pikeun blok sareng transaksi, dina 3 ngeunaan server WebSocket pikeun nyambungkeun tina JavaScript, dina 4 kuring bakal ningali jadwal sinkronisasi, teras mesin tumpukan anu ngolah bytecode tina input sareng output, kriptografi sareng pools pikeun outputs.

sumber: www.habr.com

Tambahkeun komentar