Blockchain kuvandudza indasitiri uchishandisa Go. Chikamu 1

Kwemwedzi mina ikozvino ndanga ndichishanda purojekiti inonzi "Kuvandudzwa kwekuchengetedzwa kwedata uye manejimendi ekushandisa muhurumende nemaindasitiri zvikamu zvinoenderana ne blockchain."
Iye zvino ndinoda kukuudza nezvekuti ndakatanga sei chirongwa ichi, uye zvino ndichatsanangura purogiramu yepurogiramu zvakadzama.

Blockchain kuvandudza indasitiri uchishandisa Go. Chikamu 1

Ichi ndicho chinyorwa chekutanga munhevedzano yezvinyorwa. Pano ini ndinotsanangura sevha uye protocol. Muchokwadi, muverengi anogona kutonyora ake ega mavhezheni eizvi blockchain zvinhu.

Uye hechino chikamu chechipiri - nezve blockchain uye transaction data zvimiro, pamwe nezvepakeji inoshandisa kudyidzana nedatabase.

Gore rapfuura, paDigital Breakthrough hackathon, vakauya nezano rekugadzira hurongwa hunobatsira hweindasitiri uye hupfumi hwedhijitari vachishandisa tekinoroji yedhijitari; rubatsiro rwakapihwawo kusimudzira neInnovation Assistance Fund (ndinofanira kunyora yakaparadzana. chinyorwa pamusoro pechipo, kune avo vari kutanga kutanga ), uye zvino zvakarongeka.

Budiriro inoitika mumutauro weGo, uye dhatabhesi inochengeterwa zvidhinha iLevelDB.
Zvikamu zvikuru iprotocol, sevha (iyo inomhanya TCP uye WebSocket - yekutanga yekubatanidza blockchain, yechipiri yekubatanidza vatengi, kutumira matransaction uye mirairo kubva kuJavaScript, semuenzaniso.

Sezvakataurwa, iyi blockchain inodiwa kunyanya kuita otomatiki uye kudzivirira kuchinjanisa kwezvigadzirwa pakati pevatengesi nevatengi, kana vese vari mumunhu mumwe. Vanhu ava havana kukurumidza kuvimbana. Asi basa racho harisi chete kugadzira "checkbook" ine yakavakirwa-mukati karukureta, asi hurongwa hunoita otomatiki mazhinji emabasa enguva dzose anomuka kana uchishanda nehupenyu hwechigadzirwa. Iyo bytecode inokonzeresa nyaya iyi, sechinyakare neblockchains, inochengetwa mune zvinopinda uye zvinobuda zvekutengeserana (mabatirwo acho pachawo anochengetwa mumabhuraki, mabhuroki ari muLevelDB akafanoiswa muGOB fomati). Kutanga, ngatitaure nezve protocol uye sevha (aka node).

Iyo protocol haina kuomesesa, iyo pfungwa yese ndeyekuchinja kune nzira yekurodha imwe data, kazhinji bhuroka kana kutengeserana, mukupindura kune yakakosha mutsara wekuraira, uye inodiwawo pakuchinjana heta, kuitira kuti node izive kuti ndiani. yakabatana uye nemabatiro avanoita bhizinesi (manodhi akabatanidzwa pachikamu chekubatanidza anonziwo "muvakidzani" nekuti IP yavo inozivikanwa uye data ravo redunhu rinochengetwa mundangariro).

Mafolda (madhairekitori seanovadaidza neLinux) mukunzwisisa kweGo programmers anonzi mapakeji, saka pakutanga kwefaira rega rega neGo kodhi kubva mudhairekitori rino vanonyora package folder_name_where_this_file iripo. Zvikasadaro, haugone kudyisa iyo package kune compiler. Zvakanaka, ichi hachisi chakavanzika kune avo vanoziva mutauro uyu. Aya ndiwo mapakeji:

  • Network kutaurirana (sevha, mutengi, protocol)
  • Zvimiro zve data rakachengetwa uye rakafambiswa (block, transaction)
  • Database (blockchain)
  • Kubvumirana
  • Yakarongedzerwa virtual muchina (xvm)
  • Mubatsiri (crypto, marudzi) ndizvo zvese izvozvi.

Heino chinongedzo kune github

Iyi ivhezheni yedzidzo, inoshaya kupindirana kwepakati-maitiro uye akati wandei ekuyedza zvikamu, asi chimiro chinoenderana neicho chiri kufambiswa. Kana iwe uine chero chekukurudzira mune zvakataurwa, ini ndichafara kuzvifunga mukuwedzera kusimudzira. Uye zvino kune tsananguro ye server uye Protocol.

Ngatitarise server kutanga.

Iyo server subroutine inoshanda sevhavha yedata inomhanya pamusoro peTCP protocol ichishandisa data zvimiro kubva paprotocol package.

Iyo routine inoshandisa mapakeji anotevera: Server, Protocol, mhando. Mupakeji pachayo tcp_server.go ine data structure Shumira.

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

Inogona kugamuchira zvinotevera parameters:

  • Network port kuburikidza iyo data ichachinjana
  • Sevha yekumisikidza faira muJSON fomati
  • Mureza wekumhanya mudebug mode (yakavanzika blockchain)

Kufambira mberi:

  • Inoverenga gadziriso kubva kuJSON faira
  • Iyo debug mode mureza inotariswa: kana ikaiswa, network yekubatanidza scheduler haina kutangwa uye blockchain haina kurodha.
  • Kutanga iyo yekumisikidza data chimiro uye kutanga sevha

Server

  • Inoita kuvhurwa kweTCP server uye network yekudyidzana zvinoenderana neprotocol.
  • Iyo ine Serve data chimiro chinosanganisira nhamba yechiteshi, saizi yebhafa uye chinongedzo kune chimiro mhando.Settings
  • Iyo Run nzira inotanga kupindirana kwetiweki (kuteerera kune inouya yekubatanidza pane yakapihwa chiteshi, kana kubatana kutsva kwagamuchirwa, kugadzirisa kwayo kunoendeswa kune yakavanzika nzira yekubata mune tambo itsva)
  • Π’ handle data kubva pakubatanidza inoverengwa kuita buffer, inoshandurwa kuita tambo inomiririra uye inopfuudzwa protocol.Sarudzo
  • protocol.Sarudzo anodzoka result kana kukonzera kukanganisa. result zvobva zvaendeswa ku protocol.Dudziraiyo inodzoka intrpr - chinhu chemhando InterpreteData, kana kukonzera kukanganisa mukugadzirisa sarudzo
  • Ipapo switch inoitwa intrpr.Commands[0] iyo inotarisa imwe ye: mhedzisiro, inv, kukanganisa uye pane chikamu Default
  • Muchikamu result chinja inowanikwa nekukosha intrpr.Commands[1] iyo inotarisa maitiro bufferlength ΠΈ mhando (mune imwe neimwe basa rinoenderana rinonzi)

Mabasa GetVersion ΠΈ BufferLength dziri mufaira srvlib.go server package

GetVersion(conn net.Conn, version string)

inongodhinda kune koni uye inotumira iyo vhezheni yakapfuura muparameter kune mutengi:

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

.
shanda

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

inotakura block, transaction, kana imwe data chaiyo sezvinotevera:

  • Inodhinda kuconsole mhando yedata yakatsanangurwa muprotocol inoda kugamuchirwa:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Inoverenga kukosha intrpr.Body kuchinjika yenhamba buf_len
  • Inogadzira buffer newbuf saizi yakatarwa:
    make([]byte, buf_len)
  • Inotumira mhinduro ok:
    conn.Write([]byte("result:ok"))
  • Inozadza zvizere buffer kubva parukova rwekuverenga:
    io.ReadFull(conn, newbuf)

    .

  • Inodhinda zviri mukati mebuffer kune iyo console
    fmt.Println(string(newbuf))

    uye nhamba yemabhayiti akaverengwa

    fmt.Println("Bytes length:", n)
  • Inotumira mhinduro ok:
    conn.Write([]byte("result:ok"))

Nzira kubva pasevha pasuru inogadzirirwa kugadzirisa yakagamuchirwa data uchishandisa mabasa kubva pasuru Protocol.

Protocol

A protocol inoshanda senzira inomiririra data mukutsinhana kwenetiweki.

Sarudzo(str tambo) (tambo, kukanganisa) inoita yekutanga kugadzirisa data yakagamuchirwa neseva, inogamuchira tambo inomiririra data sekuisa uye inodzosera tambo yakagadzirirwa. Muturikiri:

  • Tambo yekupinza inopatsanurwa kuita musoro nemuviri uchishandisa ReqParseN2(str)
  • musoro unopatsanurwa kuita zvinhu uye woiswa muchikamu chemirairo uchishandisa ReqParseHead (musoro)
  • Π’ chinja(mirairo[0]) sarudza murairo wakagamuchirwa (cmd, kiyi, kero kana kuti chikamu chinotangwa Default)
  • 2 mirairo inotariswa mu cmd chinja(mirairo[1]) - kureba ΠΈ getversion.
  • Kureba inotarisa rudzi rwe data mukati mirairo[2] uye anoichengeta mukati data type
  • Inotarisa izvozvo muviri ine kukosha kwetambo
    len(body) < 1
  • Inodzosa mutsara wemhinduro:
    "result:bufferlength:" + datatype + "/" + body
  • getversion inodzorera tambo
    return "result:version/auto"

Muturikiri

Iine InterpreteData chimiro uye inoita chechipiri kugadzirisa data yakadzorerwa kubva Choice tambo uye kuumbwa kwechinhu InterpreteData.

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

shanda

Interprete(str string) (*InterpreteData, error)

anogamuchira tambo result uye inogadzira uye inodzosera chirevo chechinhu InterpreteData.

Kufambira mberi:

  • Saizvozvowo Choice musoro nemuviri zvinotorwa pachishandiswa ReqParseN2(str)
  • musoro unopatsanurwa kuita zvinhu uchishandisa ReqParseHead(musoro)
  • Chinhu chinotangwa InterpreteData uye chinongedzo kwachiri chinodzoserwa.

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

Chinhu ichi chinoshandiswa mu server.go package main.

munhu anoda kubetserwa

Iyo client package ine mabasa TCPConnect ΠΈ TCPresponseData.

shanda

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

inoshanda seizvi:

  • Kubatana kunoitwa kune chinongedzo chakatsanangurwa mune yakapfuura marongero chinhu
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Iyo data yakapfuudzwa mu data parameter inofambiswa:
    conn.Write(data)
  • Mhinduro inoverengwa
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    uye yakadhindwa pane console

    fmt.Println(string(resp[:n]))
  • Kana akatamisirwa payload wobva wazvipfuudza
    conn.Write(payload)

    uye zvakare inoverenga sevha mhinduro, ichiidhinda kune iyo console

shanda

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

inogadzira buffer yehukuru hwakatarwa, inoverenga sevha mhinduro ipapo uye inodzosera iyi buffer uye nhamba yemabhaiti akaverengwa, pamwe nechinhu chinokanganisa.

Client subroutine

Inoshanda kutumira mirairo kune node maseva, pamwe nekuwana pfupi nhamba uye kuyedzwa.

Inogona kugamuchira maparamendi anotevera: faira yekumisikidza muJSON fomati, data inotumirwa kuseva setambo, nzira inoenda kune faira kutumirwa kunobhadhara, node scheduler emulation mureza, mhando yedata inotamiswa senhamba kukosha.

  • Kuwana configuration
    st := types.ParseConfig(*config)
  • Kana iyo emu mureza ikapfuudzwa, inotanga sheduler
  • Kana iyo f mureza inoratidza nzira yefaira ichipihwa, isu tinoisa data yayo mukati fdb uye zvirimo zvinotumirwa kuseva
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Kana iyo faira isina kutaurwa, ipapo data kubva kumureza inongotumirwa -d:
    client.TCPConnect(st, []byte(*data), nil)

Zvese izvi zvinomiririra zviri nyore zvinoratidza chimiro cheprotocol. Munguva yekuvandudza, basa rinodiwa rinowedzerwa kune chimiro chayo.

Muchikamu chechipiri ini ndichataura nezve data zvimiro zvezvivharo uye kutengeserana, mu3 nezveWebSocket server yekubatanidza kubva kuJavaScript, muna 4 ini ndichatarisa iyo synchronization scheduler, ipapo muchina westack unogadzira bytecode kubva kune zvinopinda uye zvinobuda, cryptography uye. madziva ekubuda.

Source: www.habr.com

Voeg