Ntlafatso ea blockchain bakeng sa indasteri e sebelisang Go. Karolo ea 1

Ka likhoeli tse 'nè joale ke ntse ke sebetsa morerong o bitsoang "Ntšetso-pele ea lisebelisoa tsa ts'ireletso ea data le lisebelisoa tsa tsamaiso likarolong tsa mmuso le tsa indasteri tse thehiloeng ho blockchain."
Hona joale ke rata ho u bolella kamoo ke qalileng morero ona kateng, 'me joale ke tla hlalosa khoutu ea lenaneo ka botlalo.

Ntlafatso ea blockchain bakeng sa indasteri e sebelisang Go. Karolo ea 1

Sena ke sehlooho sa pele letotong la lihlooho. Mona ke hlalosa seva le protocol. Ha e le hantle, 'mali a ka ba a ngola liphetolelo tsa hae tsa likarolo tsena tsa blockchain.

Mme karolo ya bobedi ke ena - mabapi le blockchain le mekhoa ea data ea transaction, hammoho le sephutheloana se sebelisang tšebelisano le database.

Selemong se fetileng, ho Digital Breakthrough hackathon, ba ile ba tla ka mohopolo oa ho etsa sistimi e sebetsang bakeng sa indasteri le moruo oa dijithale ba sebelisa theknoloji ea ledger e phatlalalitsoeng; thuso e boetse e fanoe bakeng sa nts'etsopele ke Letlole la Thuso la Innovation (ke lokela ho ngola ka thoko. sehlooho se buang ka thuso, bakeng sa ba qalang ho qala ), 'me hona joale ka tatellano.

Nts'etsopele e etsahala ka puo ea Go, mme database eo li-blocks li bolokiloeng ho eona ke LevelDB.
Likarolo tse ka sehloohong ke protocol, seva (e tsamaisang TCP le WebSocket - ea pele bakeng sa ho lumellana le blockchain, ea bobeli bakeng sa ho hokahanya bareki, ho romela litšebelisano le litaelo tse tsoang JavaScript, mohlala.

Joalokaha ho boletsoe, blockchain ena e hlokahala haholo-holo ho iketsetsa le ho sireletsa phapanyetsano ea lihlahisoa pakeng tsa barekisi le bareki, kapa ka bobeli ho motho a le mong. Batho bana ha ba potlakele ho tšepana. Empa mosebetsi ha se feela ho theha "checkbook" e nang le sebali se hahelletsoeng, empa ke sistimi e iketsetsang boholo ba mesebetsi e tloaelehileng e hlahang ha o sebetsa le potoloho ea bophelo ba sehlahisoa. Bytecode e ikarabellang bakeng sa taba ena, joalo ka tloaelo ka li-blockchains, e bolokoa ho tse kenang le tse hlahisoang ke litšebelisano (litšebelisano ka botsona li bolokiloe ka li-blocks, li-blocks ho LevelDB li kentsoe pele ka mokhoa oa GOB). Ntlha ea pele, a re u bolelle ka protocol le seva (aka node).

Protocol ha e rarahane, ntlha ea eona eohle ke ho fetohela mokhoeng oa ho kenya data e itseng, hangata block kapa transaction, ho arabela mola o khethehileng oa taelo, hape e hlokahala bakeng sa ho fapanyetsana lethathamo, e le hore node e tsebe hore na ke mang. e hokahane le hore na ba na le khoebo ea ho e etsa joang (li-node tse hokahaneng bakeng sa kopano ea khokahano li boetse li bitsoa "moahelani" hobane IP ea bona e tsejoa mme data ea bona ea boemo e bolokoa mohopolong).

Li-folders (li-directory joalokaha Linux li li bitsa) kutloisisong ea Go programmers li bitsoa liphutheloana, kahoo qalong ea faele ka 'ngoe e nang le Go code ho tloha bukeng ena ba ngola sephutheloana folda_name_where_this_file e teng. Ho seng joalo, u ke ke ua khona ho fepa sephutheloana ho moqapi. Hantle, sena ha se sephiri ho ba tsebang puo ena. Tsena ke liphutheloana:

  • Puisano ea marang-rang (seva, moreki, protocol)
  • Mehaho ea data e bolokiloeng le e fetisitsoeng (block, transaction)
  • Database (blockchain)
  • Tumellano
  • Mochini o patiloeng o pakiloeng (xvm)
  • Thuso (crypto, mefuta) ke tsohle bakeng sa hona joale.

Mona ke sehokelo sa github

Ena ke mofuta oa thuto, ha e na tšebelisano-'moho le likarolo tse 'maloa tsa liteko, empa sebopeho se lumellana le seo nts'etsopele e ntseng e etsoa ho sona. Haeba u na le ntho leha e le efe eo u ka e khothalletsang ho maikutlo, ke tla thabela ho e ela hloko tsoelo-pele e tsoelang pele. 'Me joale bakeng sa tlhaloso ea seva le protocol.

Ha re shebeng seva pele.

Subroutine ea seva e sebetsa e le seva sa data se tsamaeang ka holim'a protocol ea TCP e sebelisang lisebelisoa tsa data ho tsoa ho sephutheloana sa protocol.

Sesebelisoa se sebelisa liphutheloana tse latelang: seva, protocol, mefuta. Ka har'a sephutheloana ka boeona tcp_server.go e na le sebopeho sa data sebeletsa.

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

E ka amohela liparamente tse latelang:

  • Kou ea marang-rang eo data e tla fapanyetsanoa ka eona
  • Faele ea litlhophiso tsa seva ka sebopeho sa JSON
  • Tlaleha bakeng sa ho sebetsa ka mokhoa oa ho lokisa bothata (blockchain ea poraefete)

Tsoelo-pele:

  • E bala tlhophiso ho tsoa faeleng ea JSON
  • Folakha ea mokhoa oa debug e hlahlojoa: haeba e behiloe, kemiso ea khokahano ea marang-rang ha e qalisoe mme blockchain ha e laeloe.
  • Ho qala sebopeho sa data ea tlhophiso le ho qala seva

Seva

  • E etsa tlhahiso ea seva sa TCP le tšebelisano ea marang-rang ho latela protocol.
  • E na le sebopeho sa data sa Serve se nang le nomoro ea boema-kepe, boholo ba buffer le pointer ea sebopeho mefuta.Litlhophiso
  • Mokhoa oa Run o qala tšebelisano ea marang-rang (ho mamela likhokahano tse kenang boema-kepeng bo fanoeng, ha khokahano e ncha e amoheloa, ts'ebetso ea eona e fetisetsoa ho mokhoa oa ho sebetsana le poraefete khoeleng e ncha)
  • В sebetsana data e tsoang ho khokahanyo e baloa ho buffer, e fetoleloa ho boemeli ba likhoele ebe e fetisetsoa ho protocol.Kgetho
  • protocol.Kgetho kgutlisetso sephetho kapa e bakang phoso. sephetho ebe e fetisetsoa ho protocol.Tolokoe kgutlang intrpr - ntho ea mofuta InterpreteData, kapa e baka phoso ho sebetsa sephetho sa khetho
  • Ebe switjha e etsoa intrpr.Commands[0] e hlahlobang e 'ngoe ea: sephetho, inv, phoso mme ho na le karolo ya kamehla
  • Karolong sephetho switjha e fumanoa ka boleng intrpr.Commands[1] e hlahlobang litekanyetso bufferlength и tlhahiso (boemong bo bong le bo bong mosebetsi o tsamaellanang o bitsoa)

Mesebetsi GetVersion и BufferLength li ka har'a faele srvlib.go sephutheloana sa seva

GetVersion(conn net.Conn, version string)

e hatisa feela ho console ebe e romela mofuta o fetisoang ka paramente ho moreki:

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

.
Mosebetsi

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

e jara block, transaction, kapa data e 'ngoe e ikhethileng ka tsela e latelang:

  • E hatisa ho console mofuta oa data e boletsoeng ho protocol e lokelang ho amoheloa:
    fmt.Println("DataType:", intrpr.Commands[2])
  • E bala boleng 'Mele oa intrpr ho feto-fetoha ha lipalo buf_len
  • E etsa buffer newbuf boholo bo boletsoeng:
    make([]byte, buf_len)
  • E romella karabo e nepahetseng:
    conn.Write([]byte("result:ok"))
  • E tlatsa ka botlalo buffer ho tsoa ho molapo o baloang:
    io.ReadFull(conn, newbuf)

    .

  • E hatisa litaba tsa buffer ho console
    fmt.Println(string(newbuf))

    le palo ea li-byte tse baloang

    fmt.Println("Bytes length:", n)
  • E romella karabo e nepahetseng:
    conn.Write([]byte("result:ok"))

Mekhoa e tsoang ho sephutheloana sa seva e lokiselitsoe ho sebetsana le data e amohetsoeng ho sebelisoa mesebetsi e tsoang ho sephutheloana protocol.

melaoana

Protocol e sebetsa e le mokhoa o emelang data ho phapanyetsano ea marang-rang.

Khetho(khoele ea str) (khoele, phoso) e etsa ts'ebetso ea mantlha ea data e amohetsoeng ke seva, e amohela thapo e emelang data joalo ka ho kenya, ebe e khutlisa khoele e lokiselitsoeng. Mofetoleli:

  • Khoele e kenang e arotsoe ka hlooho le 'mele ho sebelisoa ReqParseN2(str)
  • hlooho e arotsoe ka likarolo ebe e beoa selae sa litaelo ho sebelisa ReqParseHead(hlooho)
  • В switjha(litaelo[0]) khetha taelo e amoheloang (cmd, senotlolo, aterese kapa karolo e qala ya kamehla)
  • Litaelo tse 2 li hlahlojoa ho cmd switjha(litaelo[1]) - bolelele и phetoho.
  • bolelele e hlahloba mofuta oa data litaelo[2] le ho e boloka ka hare mofuta oa database
  • E hlahloba seo mele oa e na le boleng ba khoele
    len(body) < 1
  • E khutlisetsa tatellano ea karabo:
    "result:bufferlength:" + datatype + "/" + body
  • phetoho e kgutlisa kgwele
    return "result:version/auto"

Mofetoleli

E na le sebopeho sa InterpreteData 'me e sebetsana le data e khutlisitsoeng ho tsoa ho eona qeto e thehiloeng tsebong likhoele le sebopeho sa ntho InterpreteData.

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

Mosebetsi

Interprete(str string) (*InterpreteData, error)

e amohela kgwele sephetho le ho bopa le ho kgutlisetsa sesupo sa ntho InterpreteData.

Tsoelo-pele:

  • Ka mokhoa o ts'oanang qeto e thehiloeng tsebong hlooho le mmele di ntšoa ka ho sebedisa ReqParseN2(str)
  • hlooho e arotsoe ka likarolo tse sebelisang ReqParseHead(hlooho)
  • Ntho e qalisoa InterpreteData mme lesupa la yona le kgutliswa.

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

Ntho ena e sebelisoa ho server.go sephutheloana se seholo.

sedirelwa

Sephutheloana sa bareki se na le mesebetsi TCPConnect и TCPResponseData.

Mosebetsi

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

e sebetsa tjena:

  • Khokahano e etsoa khokahanong e boletsoeng nthong ea li-setting tse fetisitsoeng
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Lintlha tse fetisitsoeng ho parameter ea data li fetisoa:
    conn.Write(data)
  • Karabo ea baloa
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    mme e hatisitsoe ho console

    fmt.Println(string(resp[:n]))
  • Haeba e fetisetsoa Ho lefella moputso ebe oa e fetisa
    conn.Write(payload)

    hape o bala karabo ea seva, o e hatisa ho console

Mosebetsi

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

e theha buffer ea boholo bo boletsoeng, e bala karabo ea seva moo ebe e khutlisa buffer ena le palo ea li-byte tse baloang, hammoho le ntho e phoso.

Tsamaiso ea moreki

E sebeletsa ho romella litaelo ho li-server tsa node, hammoho le ho fumana lipalo-palo tse khutšoane le liteko.

E ka amohela litekanyo tse latelang: faele ea tlhophiso ka mokhoa oa JSON, data e lokelang ho romelloa ho seva e le khoele, tsela e eang faeleng e lokelang ho romelloa ho lefa, node scheduler emulation flag, mofuta oa data e fetisitsoeng e le boleng ba linomoro.

  • Ho fumana tlhophiso
    st := types.ParseConfig(*config)
  • Haeba folakha ea emu e fetisitsoe, e qala sheduler
  • Haeba folakha ea f e bonts'ang tsela ea faele e fanoa, joale re kenya data ea eona ho eona fdb mme dikahare di romelwa ho seva
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Haeba faele e sa hlalosoa, joale data e tsoang ho folakha e romelloa feela -d:
    client.TCPConnect(st, []byte(*data), nil)

Sena sohle ke setšoantšo se nolofalitsoeng se bonts'ang sebopeho sa protocol. Nakong ea nts'etsopele, ts'ebetso e hlokahalang e eketsoa mohahong oa eona.

Karolong ea bobeli ke tla bua ka meralo ea data bakeng sa li-blocks le transactions, ho 3 mabapi le seva sa WebSocket bakeng sa ho hokela ho tsoa ho JavaScript, ho 4 ke tla sheba kemiso ea khokahano, ebe mochini oa stack o sebetsanang le bytecode ho tsoa ho li-inputs le liphetho, cryptography le. matamo bakeng sa lihlahisoa.

Source: www.habr.com

Eketsa ka tlhaloso