Horumarinta Blockchain ee warshadaha isticmaalaya Go. Qaybta 1

Muddo afar bilood ah hadda waxaan ka shaqeynayay mashruuc la yiraahdo "Horumarinta ilaalinta xogta iyo qalabka maareynta ee dawladda iyo warshadaha ee ku salaysan blockchain."
Hadda waxaan jeclaan lahaa inaan kuu sheego sida aan u bilaabay mashruucan, oo hadda waxaan si faahfaahsan u sharxi doonaa code-ka barnaamijka.

Horumarinta Blockchain ee warshadaha isticmaalaya Go. Qaybta 1

Tani waa maqaalkii ugu horreeyay ee maqaallo taxane ah. Halkan waxaan ku sharaxay server-ka iyo borotokoolka. Dhab ahaantii, akhristuhu wuxuu xitaa qori karaa noocyo u gaar ah oo ah walxahan blockchain.

Waana kan qeybtii labaad - ku saabsan blockchain iyo qaababka xogta macaamil ganacsi, iyo sidoo kale ku saabsan xirmada fulinaysa isdhexgalka xogta.

Sannadkii hore, at Digital Breakthrough hackathon, waxay la yimaadeen fikrad ah in la sameeyo nidaam waxtar u leh warshadaha iyo dhaqaalaha dhijitaalka ah iyadoo la isticmaalayo tignoolajiyada ledgerka qaybsan; deeq ayaa sidoo kale la soo saaray horumarinta Mu'asasada Innovation Assistance Foundation (Waa in aan qoro gaar ah maqaal ku saabsan deeqda, ee kuwa hadda bilaabaya inay sameeyaan bilawga ), iyo hadda si ay u kala horreeyaan.

Horumarintu waxay ku dhacdaa luqadda Go, xogta kaydka ee blocks-yada lagu kaydiyaana waa LevelDB.
Qaybaha ugu muhiimsan waa hab-maamuuska, server-ka (kaas oo maamula TCP iyo WebSocket - kan ugu horreeya ee isku xirka blockchain, kan labaad ee isku xirka macaamiisha, u dirida macaamil ganacsi iyo amarro JavaScript ah, tusaale ahaan.

Sidaan soo sheegnay, blockchain-kan ayaa ugu horayn looga baahan yahay in si otomaatig ah loo sameeyo oo loo ilaaliyo isweydaarsiga alaab-qeybiyeyaasha iyo macaamiisha, ama labadaba hal qof. Dadkani kuma degdegaan inay isku kalsoonaadaan. Laakiin hawshu maaha oo kaliya in la abuuro "bookbook" oo leh xisaabiye ku dhex jira, laakiin nidaam toosiya inta badan hawlaha caadiga ah ee soo baxa marka la shaqeynayo wareegga nolosha alaabta. Bytecode-ka mas'uul ka ah arrintan, sida caadada u ah blockchain, waxaa lagu kaydiyaa wax-soo-saarka iyo wax-soo-saarka wax kala iibsiga (wax kala iibsiga laftiisa waxaa lagu kaydiyaa blocks, blocks ee LevelDB ayaa horay loogu dhejiyay qaabka GOB). Marka hore, aan ka hadalno borotokoolka iyo server-ka (aka node).

Hab-maamuusku ma aha mid adag, dhammaan ujeeddadiisu waa in loo beddelo habka loo raro xogta qaarkood, sida caadiga ah block ama macaamil ganacsi, iyada oo laga jawaabayo khad amar ah oo gaar ah, sidoo kale waxaa loo baahan yahay in la beddelo alaabada, si ay noodu u ogaato cidda ay tahay. wuxuu ku xiran yahay iyo sida ay u leeyihiin ganacsi ay sameeyaan (nodes-ka ku xiran fadhiga is-dhexgalka ayaa sidoo kale loo yaqaan "deris" sababtoo ah IP-gooda waa la yaqaan oo xogta gobolka waxaa lagu kaydiyaa xusuusta).

Folders (tusaale ahaan sida Linux ugu yeerto iyaga) fahamka barnaamijyada Go waxaa loo yaqaannaa xirmo, markaa bilawga fayl kasta oo leh Go code-ka buuggan waxay ku qoraan xirmo folder_name_where_this_file. Haddii kale, ma awoodi doontid inaad ku quudiso baakadda isku-duwaha. Hagaag, tani sir uma aha kuwa luqaddan yaqaan. Kuwani waa xirmooyinka:

  • Xiriirka shabakada (server, macmiil, borotokool)
  • Qaab dhismeedka xogta la kaydiyo iyo la gudbiyo ( xannibaad, wax kala iibsiga)
  • Database (blockchain)
  • Is-afgarad
  • Mashiinka farsamada gacanta (xvm)
  • Kaaliyaha (crypto, noocyada) waa intaas oo dhan hadda.

Waa kan isku xirka github

Kani waa nooc waxbarasho, waxa ka maqan isdhexgalka hab-socodka iyo dhawr qaybood oo tijaabo ah, laakiin qaab-dhismeedku waxa uu u dhigma midka horumarka lagu fulinayo. Haddii aad hayso wax aad ku soo jeediso faallooyinka, waxaan ku farxi doonaa inaan tixgeliyo horumarinta dheeraadka ah. Oo hadda sharaxaad ka mid ah server-ka iyo nidaamka.

Marka hore aan eegno server-ka.

Subroutine-ka server-ku wuxuu u shaqeeyaa sidii xog xogeed kaas oo ku shaqeeya korka borotokoolka TCP isaga oo isticmaalaya qaababka xogta ee xirmada borotokoolka.

Nidaamku wuxuu adeegsadaa baakadaha soo socda: server, nidaamka, noocyada. Baakadda lafteeda tcp_server.go ka kooban qaab-dhismeedka xogta Ku darso.

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

Waxay aqbali kartaa xuduudaha soo socda:

  • Deked shabakadeed oo xogta la isku weydaarsan doono
  • Faylka qaabeynta serverka ee qaabka JSON
  • Calan ku socda habka debug (blockchain gaarka ah)

Horumarka:

  • Wuxuu akhriyaa habaynta faylka JSON
  • Calanka qaabka debug-ka waa la hubiyaa: haddii la dejiyay, jadwalka isku xidhka shabakada lama billaabin oo blockchain lama rarin
  • Bilaabida qaab dhismeedka xogta qaabeynta iyo bilaabida serverka

Server

  • Waxay fulisaa bilawga server-ka TCP iyo isdhexgalka shabakada si waafaqsan nidaamka.
  • Waxay leedahay qaab-dhismeedka xogta Adeegga oo ka kooban lambarka dekedda, cabbirka kaydinta iyo tilmaame qaabdhismeedka noocyada.Settings
  • Habka Run wuxuu bilaabaa isdhexgalka shabakada (dhegeysiga xiriirada soo galaya ee deked la siiyay, marka xiriir cusub la helo, farsameyntiisa waxaa loo wareejiyaa habka gacanta ee gaarka ah ee dun cusub)
  • Π’ xamili xogta xiriirka waxaa loo akhriyaa kayd, loo beddelaa matalidda xargaha oo loo gudbiyaa borotokoolka.Doorashada
  • borotokoolka.Doorashada soo noqda natiijada ama khalad keena. natiijada ka dibna loo wareejiyo baratakoolka.Turjumikaas oo soo noqda interprp - shayga nooca Fasiraadda Xogta, ama keena khalad habaynta natiijada doorashada
  • Kadibna furaha waa la fuliyay intrpr.Commands[0] kaas oo hubinaya mid ka mid ah: natiijo, inv, khalad waxaana jira qayb Default
  • Qaybta natiijada beddelashada waxaa lagu helaa qiime ahaan intrpr.Commands[1] kaas oo hubinaya qiyamka dhererka dhererka ΠΈ version (xaalad kasta shaqada u dhiganta ayaa loo yaqaan)

Functions GetVersion ΠΈ Dhererka Buffer ku jiraan faylka srvlib.go xirmo server

GetVersion(conn net.Conn, version string)

waxay si fudud ugu daabacdaa konsole waxayna u dirtaa nooca lagu gudbiyay cabirka macmiilka:

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

.
function

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

ku shubaa block, macaamil ganacsi, ama xog kale oo gaar ah sida soo socota:

  • Wuxuu ku daabacaa console-ka nooca xogta lagu sheegay borotokoolka ee u baahan in la aqbalo:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Wuxuu akhriyaa qiimaha intrpr.Jidhka doorsoome tirooyin ah buf_len
  • Wuxuu abuuraa kayd cusub cabbir cayiman:
    make([]byte, buf_len)
  • Wuxuu soo diray jawaab sax ah:
    conn.Write([]byte("result:ok"))
  • Wuxuu si buuxda u buuxinayaa kaydka qulqulka akhrinta:
    io.ReadFull(conn, newbuf)

    .

  • Ku daabaca waxa ku jira kaydiyaha konsole
    fmt.Println(string(newbuf))

    iyo tirada bytes akhriyay

    fmt.Println("Bytes length:", n)
  • Wuxuu soo diray jawaab sax ah:
    conn.Write([]byte("result:ok"))

Hababka xirmada server-ka ayaa loo habeeyey si loo habeeyo xogta la helay iyada oo la adeegsanayo hawlaha xirmada nidaamka.

Protocol

Hab-maamuusku wuxuu u adeegaa sidii macne ka dhigan xogta is-weydaarsiga shabakada.

Doorashada (xadhiga str) (xadhig, khalad) Wuxuu qabtaa habaynta aasaasiga ah ee xogta uu helay seerfarku, wuxuu helayaa muujinta xarkaha xogta sida gelinta oo uu soo celiyo xadhig loo diyaariyey Turjubaan:

  • Xadhiga wax gelinta waxa loo kala qaybiyaa madaxa iyo jidhka iyadoo la isticmaalayo ReqParseN2(str)
  • madaxa ayaa loo kala qaybiyaa xubno waxaana lagu dhejiyaa jeex amar ah iyadoo la adeegsanayo ReqParseHead (madaxa)
  • Π’ beddel (amarada[0]) dooro amarka la helay (cmd, furaha, cinwaanka ama qaybta ayaa kicinaysa Default)
  • 2 amar ayaa lagu hubiyaa cmd beddelo (amarada[1]) - dhererka ΠΈ jahawareer.
  • dhererka wuxuu hubiyaa nooca xogta amarrada[2] oo ku kaydsada nooca
  • Hubi taas jirka ka kooban yahay xarig xarig ah
    len(body) < 1
  • Soo celiyaa xadhiga jawaabta:
    "result:bufferlength:" + datatype + "/" + body
  • jahawareer soo celiyaa xadhig
    return "result:version/auto"

Turjubaan

Waxay ka kooban tahay qaab dhismeedka Xogta Tarjumaadda oo waxay qabataa habaynta labaad ee xogta laga soo celiyay Xulashada xadhkaha iyo samaynta shayga Fasiraadda Xogta.

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

function

Interprete(str string) (*InterpreteData, error)

aqbal xadhig natiijada oo abuuraa oo soo celiyaa tixraac shayga Fasiraadda Xogta.

Horumarka:

  • Sidoo kale Xulashada madaxa iyo jidhka ayaa la soo saaraa iyadoo la isticmaalayo ReqParseN2(str)
  • madaxa ayaa loo kala qaybiyaa walxo la isticmaalayo ReqParseHead (madaxa)
  • Shayga waa la bilaabay Fasiraadda Xogta oo tilmaan loo soo celiyo.

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

Shaygan waxa loo isticmaalaa gudaha server.go xirmo ugu weyn.

Client

Xirmada macmiilku waxay ka kooban tahay hawlaha TCPConnect ΠΈ TCPRResponseData.

function

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

u shaqeeya sida tan:

  • Xidhiidh ayaa lagu sameeyaa xidhiidhka lagu cayimay shayga habaynta ee la gudbiyay
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Xogta lagu gudbiyay xadka xogta waa la kala qaadaa:
    conn.Write(data)
  • Jawaabta waa la akhriyaa
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    oo lagu daabacay console-ka

    fmt.Println(string(resp[:n]))
  • Haddii la wareejiyo bixinta ka dibna u gudbiyaa
    conn.Write(payload)

    oo sidoo kale akhriya jawaabta server-ka, kuna daabacaadda console-ka

function

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

abuuraa kaydka cabbirka la cayimay, waxa uu akhriyaa jawaabta server-ka halkaas oo uu soo celiyo kaydkan iyo tirada bytes ee la akhriyay, iyo sidoo kale shay khalad ah.

Subroutine macmiilka

Waxay u adeegtaa inay u dirto amarrada server-yada noode, iyo sidoo kale helitaanka tirokoobyo kooban iyo imtixaan.

Wuxuu aqbali karaa cabbirrada soo socda: faylka qaabeynta ee qaabka JSON, xogta loo diri doono serfarka sidi xadhig ahaan, dariiqa faylka loo diri karo culayska, calanka jadwaleeyaha ku dayashada, nooca xogta loo wareejiyay qiime tiro ahaan.

  • Helitaanka qaabeynta
    st := types.ParseConfig(*config)
  • Haddii calanka emu la dhaafo, wuu bilaabmaa sheduleer
  • Haddii calanka f ee tilmaamaya dariiqa faylka la keeno, ka dib waxaan ku shubaa xogtiisa fdb waxa ku jirana waxa loo diraa server-ka
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Haddii faylka aan la cayimin, markaa xogta calanka ayaa si fudud loo diraa -d:
    client.TCPConnect(st, []byte(*data), nil)

Waxaas oo dhami waa matalaad la fududeeyay oo muujinaysa qaabka hab-maamuuska. Inta lagu jiro horumarinta, shaqeynta lagama maarmaanka ah ayaa lagu daraa qaab dhismeedkeeda.

Qaybta labaad waxaan ka hadli doonaa qaabdhismeedka xogta ee blocks iyo macaamilka, 3 oo ku saabsan server-ka WebSocket ee isku xirka JavaScript, gudaha 4 waxaan eegi doonaa jadwalka isku xirka, ka dibna mashiinka qashinka ah oo ka shaqeeya bytecode ka soo-gelinta iyo soo-saarka, cryptography iyo barkadaha wax soo saarka.

Source: www.habr.com

Add a comment