Idagbasoke Blockchain fun ile-iṣẹ lilo Go. Apa 1

Fun oṣu mẹrin ni bayi Mo ti n ṣiṣẹ lori iṣẹ akanṣe kan ti a pe ni “Idagbasoke aabo data ati awọn irinṣẹ iṣakoso ni ijọba ati awọn apa ile-iṣẹ ti o da lori blockchain.”
Bayi Emi yoo fẹ lati so fun o nipa bi mo ti bere ise agbese yi, ati bayi Emi yoo se apejuwe awọn koodu eto ni apejuwe awọn.

Idagbasoke Blockchain fun ile-iṣẹ lilo Go. Apa 1

Eleyi jẹ akọkọ article ni onka awọn nkan. Nibi Mo ṣe apejuwe olupin ati ilana. Ni otitọ, oluka le paapaa kọ awọn ẹya tirẹ ti awọn eroja blockchain wọnyi.

Ati ki o nibi ni apa keji - nipa blockchain ati awọn ẹya data idunadura, ati nipa package ti o ṣe ibaraenisepo pẹlu data data.

Ni ọdun to kọja, ni Digital Breakthrough hackathon, wọn wa pẹlu imọran lati ṣe eto ti o wulo fun ile-iṣẹ ati eto-aje oni-nọmba nipa lilo imọ-ẹrọ iwe afọwọkọ pinpin; ẹbun kan tun funni fun idagbasoke nipasẹ Innovation Assistance Foundation (Mo yẹ ki o kọ lọtọ) article nipa fifunni, fun awọn ti o kan bẹrẹ lati ṣe awọn ibẹrẹ ), ati bayi ni ibere.

Idagbasoke waye ni ede Go, ati ibi ipamọ data ninu eyiti awọn bulọọki ti wa ni ipamọ jẹ LevelDB.
Awọn ẹya akọkọ jẹ ilana, olupin (eyiti o nṣiṣẹ TCP ati WebSocket - akọkọ fun mimuuṣiṣẹpọ blockchain, keji fun sisopọ awọn alabara, fifiranṣẹ awọn iṣowo ati awọn aṣẹ lati JavaScript, fun apẹẹrẹ.

Gẹgẹbi a ti mẹnuba, blockchain yii nilo ni akọkọ lati ṣe adaṣe ati daabobo paṣipaarọ awọn ọja laarin awọn olupese ati awọn alabara, tabi mejeeji ni eniyan kan. Awọn eniyan wọnyi ko yara lati gbẹkẹle ara wọn. Ṣugbọn iṣẹ-ṣiṣe kii ṣe lati ṣẹda “iwe ayẹwo” nikan pẹlu ẹrọ iṣiro ti a ṣe sinu, ṣugbọn eto ti o ṣe adaṣe pupọ julọ awọn iṣẹ ṣiṣe deede ti o dide nigbati o n ṣiṣẹ pẹlu igbesi aye ọja. Awọn bytecode ti o ni ẹtọ fun ọrọ yii, gẹgẹbi aṣa pẹlu awọn blockchains, ti wa ni ipamọ ninu awọn titẹ sii ati awọn ọnajade ti awọn iṣowo (awọn iṣowo tikararẹ ti wa ni ipamọ ni awọn bulọọki, awọn ohun amorindun ni LevelDB ti wa ni ipamọ ni ọna kika GOB). Ni akọkọ, jẹ ki a sọrọ nipa ilana ati olupin (aka node).

Ilana naa ko ni idiju, gbogbo aaye rẹ ni lati yipada si ipo ti ikojọpọ data diẹ, nigbagbogbo bulọki tabi idunadura, ni idahun si laini aṣẹ pataki kan, ati pe o tun nilo fun paṣipaarọ ọja-ọja, ki ipade naa mọ ẹni ti o jẹ. ti sopọ si ati bii wọn ṣe ni iṣowo lati ṣe (awọn apa ti a ti sopọ fun igba imuṣiṣẹpọ ni a tun pe ni “aladugbo” nitori a mọ IP wọn ati pe a ti fipamọ data ipinlẹ wọn sinu iranti).

Awọn folda (awọn ilana bi Linux ti n pe wọn) ni oye ti awọn olutọpa Go ni a pe ni awọn idii, nitorinaa ni ibẹrẹ faili kọọkan pẹlu koodu Go lati inu itọsọna yii wọn kọ package folda_name_where_this_file wa. Bibẹẹkọ, iwọ kii yoo ni anfani lati ifunni package si alakojọ. O dara, eyi kii ṣe aṣiri fun awọn ti o mọ ede yii. Iwọnyi ni awọn akopọ:

  • Ibaraẹnisọrọ nẹtiwọki (olupin, alabara, ilana)
  • Awọn ẹya ti data ti o fipamọ ati gbigbe (dina, idunadura)
  • Ibi ipamọ data (blockchain)
  • Ifọkanbalẹ
  • Ẹrọ foju to tolera (xvm)
  • Iranlọwọ (crypto, awọn oriṣi) iyẹn jẹ gbogbo fun bayi.

Eyi ni ọna asopọ si github

Eyi jẹ ẹya eto-ẹkọ, ko ni ibaraenisepo ilana-ilana ati ọpọlọpọ awọn paati esiperimenta, ṣugbọn eto naa ni ibamu pẹlu eyiti idagbasoke ti n ṣe. Ti o ba ni ohunkohun lati daba ninu awọn asọye, Emi yoo dun lati gba sinu akọọlẹ ni idagbasoke siwaju. Ati nisisiyi fun alaye ti olupin ati Ilana.

Jẹ ká wo ni olupin akọkọ.

Subroutine olupin n ṣiṣẹ bi olupin data ti o nṣiṣẹ lori oke ti Ilana TCP nipa lilo awọn ẹya data lati package ilana.

Ilana naa nlo awọn idii wọnyi: server, Ilana, orisi. Ninu package funrararẹ tcp_server.go ni data be Sin.

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

O le gba awọn paramita wọnyi:

  • Ibudo nẹtiwọki nipasẹ eyiti data yoo paarọ
  • Faili iṣeto olupin ni ọna kika JSON
  • Asia fun ṣiṣiṣẹ ni ipo yokokoro (blockchain aladani)

Ilọsiwaju:

  • Ka iṣeto ni lati faili JSON
  • Ti ṣayẹwo asia ipo yokokoro: ti o ba ti ṣeto, iṣeto amuṣiṣẹpọ netiwọki naa ko ṣe ifilọlẹ ati pe blockchain ko ṣe kojọpọ.
  • Bibẹrẹ iṣeto data iṣeto ni ati bẹrẹ olupin naa

Server

  • Ṣe ifilọlẹ ifilọlẹ olupin TCP ati ibaraenisepo nẹtiwọọki ni ibamu pẹlu ilana naa.
  • O ni eto iṣẹ data ti o ni nọmba ibudo kan, iwọn ifipamọ ati itọka si eto naa orisi.Eto
  • Ọna Ṣiṣe bẹrẹ ibaraenisepo nẹtiwọọki (gbigbọ fun awọn asopọ ti nwọle lori ibudo ti a fun, nigbati asopọ tuntun ba ti gba, a gbe sisẹ rẹ si ọna mimu ikọkọ ni okun tuntun)
  • В mu data lati awọn asopọ ti wa ni ka sinu a saarin, iyipada si a okun oniduro ati ki o kọja si Ilana.Choice
  • Ilana.Choice pada esi tabi fa aṣiṣe. esi lẹhinna gbe si Ilana.Itumọeyi ti o pada intrpr - ohun ti iru ItumọData, tabi fa aṣiṣe ni sisẹ esi yiyan
  • Lẹhinna yipada naa ti ṣiṣẹ intrpr.Awọn aṣẹ[0] eyi ti o ṣayẹwo ọkan ninu: esi, inv, aṣiṣe ati pe apakan wa aiyipada
  • Ni apakan esi yipada ti wa ni ri nipa iye intrpr.Awọn aṣẹ[1] eyi ti sọwedowo awọn iye ibufa gigun и version (ninu ọran kọọkan iṣẹ ti o baamu ni a pe)

Awọn iṣẹ GetVersion и BufferGigun wa ninu faili naa srvlib.go package olupin

GetVersion(conn net.Conn, version string)

o kan tẹjade si console ati firanṣẹ ẹya ti o kọja ni paramita si alabara:

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

.
Išẹ

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

kojọpọ bulọki kan, idunadura, tabi data kan pato miiran bi atẹle:

  • Ṣe atẹjade si console iru data ti a sọ pato ninu ilana ti o nilo lati gba:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Ka iye intrpr.Ara si oniyipada nomba buf_len
  • Ṣẹda ifipamọ kan titunbuf iwọn pato:
    make([]byte, buf_len)
  • Fi idahun to dara ranṣẹ:
    conn.Write([]byte("result:ok"))
  • Ni kikun kun ifipamọ lati ṣiṣan kika:
    io.ReadFull(conn, newbuf)

    .

  • Ṣe atẹjade awọn akoonu ti ifipamọ si console
    fmt.Println(string(newbuf))

    ati awọn nọmba ti awọn baiti ka

    fmt.Println("Bytes length:", n)
  • Fi idahun to dara ranṣẹ:
    conn.Write([]byte("result:ok"))

Awọn ọna lati inu package olupin ti wa ni tunto lati ṣe ilana data ti o gba ni lilo awọn iṣẹ lati inu package Ilana.

Ilana

Ilana kan n ṣiṣẹ bi ọna ti o ṣe aṣoju data ni paṣipaarọ nẹtiwọki.

Yiyan (okun str) (okun, aṣiṣe) ṣe iṣẹ ṣiṣe akọkọ ti data ti olupin gba, gba aṣoju okun ti data bi titẹ sii ati da okun ti o pese sile fun Onitumọ:

  • Okun titẹ sii ti pin si ori ati ara ni lilo ReqParseN2(str)
  • Ori ti pin si awọn eroja ati gbe sinu bibẹ awọn aṣẹ nipa lilo ReqParseHead (ori)
  • В yipada (awọn aṣẹ[0]) yan aṣẹ ti o gba (cmd, bọtini, adirẹsi tabi awọn apakan ti wa ni jeki aiyipada)
  • Awọn ofin 2 ti ṣayẹwo ni cmd yipada (awọn pipaṣẹ [1]) - ipari и ikorira.
  • ipari ṣayẹwo iru data ninu awọn aṣẹ[2] o si fipamọ sinu iru data
  • Ṣayẹwo pe body ni iye okun
    len(body) < 1
  • Pada okun idahun pada:
    "result:bufferlength:" + datatype + "/" + body
  • ikorira pada okun
    return "result:version/auto"

Onitumọ

Ni awọn ẹya InterpreteData ati ṣiṣe sisẹ keji ti data ti o pada lati wun awọn gbolohun ọrọ ati ohun Ibiyi ItumọData.

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

Išẹ

Interprete(str string) (*InterpreteData, error)

gba okun esi ati ki o ṣẹda ati ki o da a tọka si awọn ohun ItumọData.

Ilọsiwaju:

  • Bakanna wun ori ati ara ti wa ni fa jade nipa lilo ReqParseN2(str)
  • ori ti pin si awọn eroja nipa lilo ReqParseHead (ori)
  • Ohun naa ti wa ni ipilẹṣẹ ItumọData a si da itọka si i pada:

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

Nkan yii ni a lo ninu olupin.go package akọkọ.

Ni ose

Package onibara ni awọn iṣẹ naa TCPSopọ и TCPResponseData.

Išẹ

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

ṣiṣẹ bi eleyi:

  • Asopọ kan ti wa ni ṣe si awọn asopọ pato ninu awọn ti o ti kọja ohun eto
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Awọn data ti o kọja ninu paramita data ti wa ni gbigbe:
    conn.Write(data)
  • Idahun si ti wa ni ka
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ati ki o tejede lori console

    fmt.Println(string(resp[:n]))
  • Ti o ba gbe payload lẹhinna o kọja
    conn.Write(payload)

    ati tun ka esi olupin, titẹ sita si console

Išẹ

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

ṣẹda saarin ti awọn pàtó kan iwọn, ka awọn olupin esi nibẹ ati ki o pada yi saarin ati awọn nọmba ti awọn baiti ka, bi daradara bi ohun aṣiṣe.

Subroutine onibara

Ṣiṣẹ lati firanṣẹ awọn aṣẹ si awọn olupin ipade, bakannaa gba awọn iṣiro kukuru ati idanwo.

Le gba awọn paramita wọnyi: faili iṣeto ni ọna kika JSON, data lati firanṣẹ si olupin bi okun, ọna si faili lati firanṣẹ si fifuye isanwo, asia oluṣeto ipade, iru data ti o gbe bi iye nomba kan.

  • Ngba iṣeto ni
    st := types.ParseConfig(*config)
  • Ti asia emu ba ti kọja, o bẹrẹ sheduler
  • Ti asia f ti o nfihan ọna si faili ti wa ni ipese, lẹhinna a gbe data rẹ sinu fdb ati awọn akoonu ti wa ni rán si olupin
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Ti faili naa ko ba ni pato, lẹhinna data lati asia ni a firanṣẹ nirọrun -d:
    client.TCPConnect(st, []byte(*data), nil)

Gbogbo eyi jẹ aṣoju irọrun ti o nfihan igbekalẹ ti ilana naa. Lakoko idagbasoke, iṣẹ ṣiṣe pataki ni a ṣafikun si eto rẹ.

Ni apakan keji Emi yoo sọrọ nipa awọn ẹya data fun awọn bulọọki ati awọn iṣowo, ni 3 nipa olupin WebSocket fun sisopọ lati JavaScript, ni 4 Emi yoo wo oluṣeto amuṣiṣẹpọ, lẹhinna ẹrọ akopọ ti o ṣe ilana bytecode lati awọn igbewọle ati awọn abajade, cryptography ati adagun fun awọn esi.

orisun: www.habr.com

Fi ọrọìwòye kun