Pêşkeftina Blockchain ji bo pîşesaziyê ku Go bikar tîne. Beş 1

Ev çar meh in ez li ser projeyek bi navê "Pêşxistina amûrên parastina daneyan û rêvebirinê di sektorên hukûmetê û pîşesaziyê de li ser bingeha blokchein" dixebitim.
Naha ez dixwazim ji we re vebêjim ka min çawa dest bi vê projeyê kir, û naha ez ê koda bernameyê bi hûrgulî vebêjim.

Pêşkeftina Blockchain ji bo pîşesaziyê ku Go bikar tîne. Beş 1

Di rêze gotaran de ev gotara yekem e. Li vir ez server û protokolê vedibêjim. Bi rastî, xwendevan dikare tewra guhertoyên xwe yên van hêmanên blokê binivîsîne.

Û li vir beşa duyemîn e - li ser strukturên daneya blokê û danûstendinê, û hem jî di derbarê pakêta ku bi databasê re danûstendinê pêk tîne.

Sala çûyî, di Hackathonê Serkeftina Dîjîtal de, wan ramanek çêkir ku ji bo pîşesazî û aboriya dîjîtal pergalek bikêr bi karanîna teknolojiya deftera belavkirî çêbikin; ji bo pêşkeftinê ji hêla Fona Alîkariya Nûvekirinê ve jî bexşeyek hat dayîn (divê ez veqetandek binivîsim gotara di derbarê bexşê de, ji bo kesên ku nû dest bi destpêkirinê dikin), û niha li rêzê.

Pêşveçûn bi zimanê Go pêk tê, û databasa ku blokan tê de têne hilanîn LevelDB ye.
Parçeyên sereke protokol in, server (ku TCP û WebSocket dimeşîne - ya yekem ji bo hevdengkirina zincîra blokê, ya duyemîn ji bo girêdana xerîdaran, şandina danûstendin û fermanan ji JavaScript, mînakî.

Wekî ku hate behs kirin, ev zincîra blokê di serî de ji bo otomatîk û parastina pevguhertina hilberan di navbera peydaker û xerîdar de, an hem jî di yek kesan de, hewce ye. Ev kes ji bo baweriya xwe bi hev re qet lez nakin. Lê peywir ne tenê çêkirina "pirtûka kontrolê" bi hesabkerek çêkirî ye, lê pergalek e ku piraniya karên rûtîn ên ku dema ku bi çerxa jiyana hilberê re dixebitin bixweber dike. Bytekoda ku ji vê mijarê re berpirsiyar e, wekî ku bi zincîra blokan re edet e, di têketin û derketinên danûstendinan de tê hilanîn (danûstandin bixwe di blokan de têne hilanîn, blokên di LevelDB-ê de di forma GOB-ê de pêş-kodkirî ne). Pêşîn, bila em li ser protokol û serverê (aka node) biaxivin.

Protokol ne tevlihev e, hemî xala wê ev e ku meriv di bersiva rêzek fermanek taybetî de, bi gelemperî bloka an danûstendinê veguhezîne moda barkirina hin daneyan, û ew jî ji bo veguheztina depoyê hewce ye, da ku nod bizanibe ew kî ye. pê ve girêdayî ye û karsaziya wan çawa ye ku bikin (girêkên ku ji bo danişîna hevdemkirinê ve girêdayî ne jî wekî "cîran" têne gotin ji ber ku IP-ya wan tê zanîn û daneyên dewleta wan di bîranînê de têne hilanîn).

Peldank (rêvebirên ku Linux ji wan re dibêje) di têgihîştina bernamenûsên Go de pakêt têne gotin, ji ber vê yekê di destpêka her pelê de bi koda Go ji vê pelrêçê re ew pakêtê peldanka_name_where_this_file tê de dinivîsin. Wekî din, hûn ê nikaribin pakêtê ji berhevkerê re bişînin. Belê, ev ji bo kesên vî zimanî dizanin ne veşartî ye. Ev pakêt ev in:

  • Têkiliya torê (server, xerîdar, protokol)
  • Strukturên daneyên hilanîn û şandin (blok, danûstandin)
  • Database (blockchain)
  • Lihevkirin
  • Makîneya virtual ya lihevkirî (xvm)
  • Alîkarî (crypto, celeb) ku ji bo niha ye.

Li vir girêdana github heye

Ev guhertoyek perwerdehiyê ye, pêwendiya nav-pêvajoyê û çend hêmanên ceribandinê tune ye, lê struktur bi ya ku pêşkeftin li ser tê meşandin re têkildar e. Ger tiştek we hebe ku hûn di şîroveyan de pêşniyar bikin, ez ê kêfxweş bibim ku wê di pêşkeftina pêşdetir de hesab bikim. Û niha ji bo ravekirina server û protokola.

Ka em pêşî li serverê binêrin.

Binrûtina serverê wekî serverek daneyê ku li ser protokola TCP-ê bi karanîna strukturên daneyê ji pakêta protokolê dimeşîne tevdigere.

Rûtîn pakêtên jêrîn bikar tîne: server, protokola, cureyên. Di pakêtê de bixwe tcp_server.go avahiya daneyê dihewîne Sûxrekirin.

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

Ew dikare pîvanên jêrîn qebûl bike:

  • Porta torê ya ku dê bi navgîniya daneyan veguhezîne
  • Pelê veavakirina serverê di formata JSON de
  • Ala ji bo xebitandina di moda debugê de (bloka taybet)

Pêşverûtî:

  • Veavakirinê ji pelê JSON dixwîne
  • Ala moda debugkirinê tê kontrol kirin: ger were danîn, nexşerêya hevdengkirina torê nayê destpêkirin û zincîra blokê nayê barkirin
  • Destpêkirina strukturên daneya vesazkirinê û destpêkirina serverê

Server

  • Li gorî protokolê destpêkirina servera TCP û danûstendina torê pêk tîne.
  • Ew xwedan avahiyek daneya Serveyê ye ku ji jimareyek portê, mezinahiyek tampon û nîşanek ji strukturê pêk tê cureyên.Settings
  • Rêbaza Run danûstendina torê dest pê dike (guhdarîkirina girêdanên gihîştî yên li ser portek diyarkirî, dema ku pêwendiyek nû tê wergirtin, pêvajoyek wê di mijarek nû de ji rêbaza desta taybet re tê veguheztin)
  • В destik Daneyên ji girêdanê di nav tamponek de têne xwendin, vediguhezînin nûnertiyek string û derbas dibin protokol.Hilbijartin
  • protokol.Hilbijartin vedigere netîce an jî dibe sedema xeletiyekê. netîce paşê veguhestin protokol.Şîrovekirinku vedigere intrpr - object of type InterpreteData, an jî di hilberandina encama hilbijartinê de dibe sedema xeletiyekê
  • Dûv re guheztin tê pêkanîn intrpr.Commands[0] ku yek ji wan kontrol dike: encam, inv, xeletî û beşek heye destçûnî
  • Di beşa netîce guhêrbar ji hêla nirxê ve tê dîtin intrpr.Commands[1] ku nirxan kontrol dike dirêjahiya tamponê и awa (di her rewşê de fonksiyona têkildar tê gotin)

Karkerên GetVersion и BufferLength di dosyayê de ne srvlib.go pakêta server

GetVersion(conn net.Conn, version string)

ew bi tenê li konsolê çap dike û guhertoya ku di parametreyê de derbas bûye ji xerîdar re dişîne:

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

.
function

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

blokek, danûstendinek, an daneyên taybetî yên din bi vî rengî bar dike:

  • Cureya daneya ku di protokola ku divê were pejirandin de hatî destnîşan kirin li konsolê çap dike:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Nirx dixwîne intrpr.Body ji bo guherbareke hejmarî buf_len
  • Tamponek çêdike newbuf mezinahiya diyarkirî:
    make([]byte, buf_len)
  • Bersivek baş dişîne:
    conn.Write([]byte("result:ok"))
  • Bi tevahî tamponê ji çema xwendinê tije dike:
    io.ReadFull(conn, newbuf)

    .

  • Naveroka tamponê li konsolê çap dike
    fmt.Println(string(newbuf))

    û hejmara bytes xwendin

    fmt.Println("Bytes length:", n)
  • Bersivek baş dişîne:
    conn.Write([]byte("result:ok"))

Rêbazên ji pakêta serverê têne mîheng kirin da ku daneyên wergirtî bi karanîna fonksiyonên ji pakêtê ve bişopînin protokola.

Protokola

Protokolek wekî navgînek ku daneyan di danûstendina torê de temsîl dike kar dike.

Hilbijartin (rêza rêzê) (xêz, xelet) pêvajoyek seretayî ya daneyên ku ji hêla serverê ve hatî wergirtin pêk tîne, wekî têketinê nûneriyek rêzikê ya daneyê distîne û rêzek ji bo amadekirî vedigerîne. Werger:

  • Rêza têketinê bi karanîna ser û laş tê dabeş kirin ReqParseN2(str)
  • serî li hêmanan tê dabeş kirin û bi karanîna ReqParseHead (serê) di perçeyek fermanan de tê danîn
  • В veguherandin(ferman[0]) emrê wergirtî hilbijêre (cmd, key, navnîşan an jî beş tê kişandin destçûnî)
  • 2 ferman di cmd de têne kontrol kirin guhêrbar (ferman [1]) - dirêjî и getversion.
  • dirêjî tîpa daneyê tê de kontrol dike ferman[2] û wê xilas dike tîpa daneyê
  • Vê kontrol dike beden nirxek string dihewîne
    len(body) < 1
  • Rêza bersivê vedigerîne:
    "result:bufferlength:" + datatype + "/" + body
  • getversion string vedigerîne
    return "result:version/auto"

Werger

Struktura InterpreteData vedihewîne û pêvajoyek duyemîn a daneya ku jê hatî vegerandin pêk tîne Helbijartî têl û pêkhatina objeyan InterpreteData.

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

function

Interprete(str string) (*InterpreteData, error)

rêzek qebûl dike netîce û referansek ji bo objektê diafirîne û vedigerîne InterpreteData.

Pêşverûtî:

  • Vî awayî Helbijartî serî û laş bi kar tên derxistin ReqParseN2(str)
  • serî li hêmanên bi kar tê parçe kirin ReqParseHead (serî)
  • Tişta destpêkê ye InterpreteData û nîşanek jê re tê vegerandin:

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

Ev tişt tê bikaranîn server.go pakêta sereke.

Kirrîxwaz

Pakêta xerîdar fonksiyonan dihewîne TCPConnect и TCPResponseData.

function

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

bi vî rengî dixebite:

  • Têkiliyek bi pêwendiya ku di mijara mîhengên derbasbûyî de hatî destnîşan kirin ve tête çêkirin
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Daneyên ku di parametreya daneyê de derbas dibin têne şandin:
    conn.Write(data)
  • Bersiv tê xwendin
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    û li ser konsolê çap kirin

    fmt.Println(string(resp[:n]))
  • Ger veguhestin payload paşê derbas dike
    conn.Write(payload)

    û bersiva serverê jî dixwîne, wê li konsolê çap dike

function

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

tamponek bi mezinahiya diyarkirî diafirîne, bersiva serverê li wir dixwîne û vê tamponê û hejmara baytên xwendinê vedigerîne, û hem jî tiştek xelet.

Subroutine Client

Ji bo şandina fermanan ji pêşkêşkerên nodê re, û hem jî wergirtina statîstîk û ceribandina kurt kar dike.

Dikare pîvanên jêrîn qebûl bike: pelê veavakirinê bi formata JSON, daneya ku ji serverê re wekî rêzek were şandin, rêça pelê ku ji bo barkirinê were şandin, ala emûlasyona nexşerêya nodê, celebê daneya ku wekî nirxek hejmarî hatî veguheztin.

  • Danîna veavakirinê
    st := types.ParseConfig(*config)
  • Ger ala emu derbas bibe, dest pê dike sheduler
  • Ger ala f ya ku rêça pelê nîşan dide were peyda kirin, wê hingê em daneyên wê tê de bar dikin fdb û naverok ji serverê re tê şandin
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Ger pel ne diyar be, wê hingê daneyên ji ala bi tenê têne şandin -d:
    client.TCPConnect(st, []byte(*data), nil)

Hemî ev nûneriyek hêsan e ku avahiya protokolê nîşan dide. Di dema pêşkeftinê de, fonksiyona pêwîst li avahiya wê tê zêdekirin.

Di beşa duyemîn de ez ê li ser strukturên daneyê yên ji bo blokan û danûstendinan bipeyivim, di 3 de li ser servera WebSocket ya ji bo girêdana ji JavaScriptê, di 4 de ez ê li nexşerêya hevdengkirinê binihêrim, dûv re makîneyek stêrk a ku bytekodê ji ketin û derketinê, krîptografî û hewzên ji bo encam.

Source: www.habr.com

Add a comment