Leasachadh Blockchain airson gnìomhachas a’ cleachdadh Go. Pàirt 1

Airson ceithir mìosan a-nis tha mi air a bhith ag obair air pròiseact leis an t-ainm “Leasachadh innealan dìon dàta agus riaghlaidh ann an roinnean riaghaltais is gnìomhachais stèidhichte air blockchain.”
A-nis bu mhath leam innse dhut mu mar a thòisich mi air a 'phròiseact seo, agus a-nis bheir mi cunntas mionaideach air còd a' phrògraim.

Leasachadh Blockchain airson gnìomhachas a’ cleachdadh Go. Pàirt 1

Is e seo a’ chiad artaigil ann an sreath de artaigilean. An seo tha mi a 'toirt cunntas air an fhrithealaiche agus am protocol. Gu dearbh, faodaidh an leughadair eadhon na dreachan aige fhèin de na h-eileamaidean blockchain sin a sgrìobhadh.

Agus seo an dàrna pàirt - mu structaran dàta blockchain agus malairt, a bharrachd air a’ phacaid a bhios a’ cur an gnìomh eadar-obrachadh leis an stòr-dàta.

An-uiridh, aig an Digital Breakthrough hackathon, thàinig iad suas le beachd siostam feumail a dhèanamh airson gnìomhachas agus an eaconamaidh dhidseatach a’ cleachdadh teicneòlas leabhar-cunntais sgaoilte; chaidh tabhartas a thoirt seachad cuideachd airson leasachadh leis a’ Mhaoin Taic Ùr-ghnàthachaidh (bu chòir dhomh sgrìobhadh air leth. artaigil mun tabhartas, dhaibhsan a tha dìreach a’ tòiseachadh a’ dèanamh startups ), agus a-nis ann an òrdugh.

Bidh leasachadh a’ tachairt anns a’ chànan Go, agus is e LevelDB an stòr-dàta anns a bheil na blocaichean air an stòradh.
Is e na prìomh phàirtean am pròtacal, am frithealaiche (a bhios a ’ruith TCP agus WebSocket - a’ chiad fhear airson sioncronadh a dhèanamh air an blockchain, an dàrna fear airson luchd-dèiligidh a cheangal, gnothaichean a chuir agus òrdughan bho JavaScript, mar eisimpleir.

Mar a chaidh ainmeachadh, tha feum air an blockchain seo gu sònraichte gus iomlaid thoraidhean eadar solaraichean agus luchd-ceannach a dhèanamh fèin-ghluasadach agus a dhìon, no an dà chuid ann an aon neach. Chan eil na daoine sin ann an cabhag gus earbsa a chur ann an chèile. Ach chan e a-mhàin an obair “leabhar-sgrùdaidh” a chruthachadh le àireamhair togte, ach siostam a nì fèin-ghluasad air a ’mhòr-chuid de na gnìomhan àbhaisteach a thig am bàrr nuair a bhios tu ag obair le cearcall beatha toraidh. Tha am bytecode a tha an urra ris a’ chùis seo, mar a tha àbhaisteach le blockchains, air a stòradh ann an cuir a-steach agus toraidhean ghnothaichean (tha na gnothaichean fhèin air an stòradh ann am blocaichean, tha na blocaichean ann an LevelDB air an còdachadh ro-làimh ann an cruth GOB). An toiseach, bruidhnidh sinn mun phròtacal agus an fhrithealaiche (aka nód).

Chan eil am protocol iom-fhillte, is e a phuing gu lèir a bhith ag atharrachadh gu modh luchdachadh cuid de dhàta, mar as trice bloc no malairt, mar fhreagairt do loidhne-àithne sònraichte, agus tha feum air cuideachd airson iomlaid clàr-seilbhe, gus am bi fios aig an nód cò e. ceangailte ris agus mar a tha gnìomhachas aca ri dhèanamh (canar “neighbouring” ris na nodan a tha ceangailte airson an t-seisean sioncronaidh leis gu bheil fios air an IP aca agus gu bheil an dàta stàite aca air a stòradh mar chuimhneachan).

Canar pasganan ri pasganan (seòlaidhean mar a chanas Linux riutha) ann an tuigse prògramadairean Go, agus mar sin aig toiseach gach faidhle le còd Go bhon eòlaire seo bidh iad a’ sgrìobhadh pasgan folder_name_where_this_file suidhichte. Rud eile, cha bhith e comasach dhut am pasgan a bhiadhadh don neach-cruinneachaidh. Uill, chan eil seo na dhìomhaireachd dhaibhsan aig a bheil eòlas air a’ chànan seo. Seo na pacaidean:

  • Conaltradh lìonra (frithealaiche, teachdaiche, protocol)
  • Structar dàta air a stòradh agus air a ghluasad (bloc, malairt)
  • Stòr-dàta (blockchain)
  • Co-aontachd
  • Inneal mas-fhìor air a chruachadh (xvm)
  • Auxiliary (crypto, seòrsaichean) tha sin uile airson a-nis.

Seo an ceangal gu github

Is e dreach foghlaim a tha seo, chan eil eadar-obrachadh eadar-phròiseasan ann agus grunn phàirtean deuchainneach, ach tha an structar a rèir an fhear air a bheil leasachadh ga dhèanamh. Ma tha dad agad ri mholadh anns na beachdan, bidh mi toilichte aire a thoirt dha ann an tuilleadh leasachaidh. Agus a-nis airson mìneachadh air an fhrithealaiche agus protocol.

Bheir sinn sùil air an fhrithealaiche an toiseach.

Bidh fo-riaghailt an fhrithealaiche ag obair mar fhrithealaiche dàta a bhios a 'ruith air mullach a' phròtacail TCP a 'cleachdadh structaran dàta bhon phasgan protocol.

Bidh an cleachdadh àbhaisteach a’ cleachdadh na pacaidean a leanas: frithealaiche, protocol, seòrsa. Anns a 'phacaid fhèin tcp_server.go tha structar dàta ann Dèan frithealaidh.

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

Faodaidh e gabhail ris na paramadairean a leanas:

  • Port lìonra tron ​​​​tèid dàta a iomlaid
  • Faidhle rèiteachaidh an fhrithealaiche ann an cruth JSON
  • Bratach airson ruith ann am modh deasbaid (blockchain prìobhaideach)

Adhartas:

  • Leughadh rèiteachadh bho fhaidhle JSON
  • Tha bratach modh deasbaid air a sgrùdadh: ma tha e air a shuidheachadh, chan eil clàr-ama sioncronaidh an lìonraidh air a chuir air bhog agus chan eil an blockchain air a luchdachadh
  • A 'tòiseachadh air an structar dàta rèiteachaidh agus a' tòiseachadh air an fhrithealaiche

Server

  • A’ cur air bhog am frithealaiche TCP agus eadar-obrachadh lìonra a rèir a’ phròtacal.
  • Tha structar dàta Serve aige air a dhèanamh suas de àireamh port, meud bufair agus puing don structar seòrsaichean.Settings
  • Bidh an dòigh Run a’ tòiseachadh eadar-obrachadh lìonra (ag èisteachd airson ceanglaichean a tha a’ tighinn a-steach air port sònraichte, nuair a gheibhear ceangal ùr, thèid a ghiullachd a ghluasad chun dòigh làimhseachaidh prìobhaideach ann an snàithlean ùr)
  • В làimhseachadh tha dàta bhon cheangal air a leughadh gu bufair, air a thionndadh gu riochdachadh sreang agus air a chuir gu protocol.Choice
  • protocol.Choice a' tilleadh thoradh air no ag adhbhrachadh mearachd. thoradh air an uairsin air a ghluasad gu protocol.Interpretea thilleas eadar-theachd - seòrsa de stuth Eadar-theangachadh Dàta, no ag adhbhrachadh mearachd ann a bhith a’ làimhseachadh toradh an taghaidh
  • An uairsin tha an tionndadh air a chuir gu bàs intrpr.commands[0] a nì sgrùdadh air aon de: toradh, inv, mearachd agus tha earrann ann default
  • Anns an earrainn thoradh air lorgar suidse a rèir luach intrpr.commands[1] a tha a’ sgrùdadh nan luachan fad bufair и dreach (anns gach cùis canar an gnìomh co-fhreagarrach)

Feartan Faigh Tionndadh и Fad Bufair tha anns an fhaidhle srvlib.go pasgan frithealaiche

GetVersion(conn net.Conn, version string)

bidh e dìreach a’ clò-bhualadh chun consol agus a ’cur an dreach a chaidh a chuir seachad sa pharameter chun neach-dèiligidh:

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

.
gnìomh

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

a 'luchdachadh bloc, malairt, no dàta sònraichte eile mar a leanas:

  • Clò-bhuail don consol an seòrsa dàta a tha air a shònrachadh sa phròtacal ris am feumar gabhail:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Leughadh an luach intrpr.Body gu caochladair àireamhach buf_len
  • A 'cruthachadh bufair ùr-buf meud ainmichte:
    make([]byte, buf_len)
  • A’ cur freagairt ceart gu leòr:
    conn.Write([]byte("result:ok"))
  • A’ lìonadh a’ bhufair bhon t-sruth leughaidh gu tur:
    io.ReadFull(conn, newbuf)

    .

  • Clò-bhuail susbaint a’ bhufair chun chonsail
    fmt.Println(string(newbuf))

    agus an àireamh bytes a chaidh a leughadh

    fmt.Println("Bytes length:", n)
  • A’ cur freagairt ceart gu leòr:
    conn.Write([]byte("result:ok"))

Tha dòighean bhon phasgan frithealaiche air an rèiteachadh gus dàta a fhuaireadh a phròiseasadh a’ cleachdadh gnìomhan bhon phacaid protocol.

Pròtacal

Tha protocol a 'frithealadh mar dhòigh a tha a' riochdachadh dàta ann an iomlaid lìonra.

Roghainn (str string) (sreang, mearachd) a’ coileanadh prìomh ghiollachd dàta a gheibh an frithealaiche, a’ faighinn riochdachadh sreang den dàta mar chur-a-steach agus a’ tilleadh sreang a chaidh ullachadh airson Eadar-theangair:

  • Tha an sreang cuir a-steach air a roinn ann an cleachdadh ceann is bodhaig ReqParseN2(str)
  • tha ceann air a roinn ann an eileamaidean agus air a chuir ann an sliseag òrdughan a’ cleachdadh ReqParseHead (ceann)
  • В suidse (àitheantan[0]) tagh an àithne a fhuaireadh (cmd, iuchair, seòladh no tha an earrann air a phiobrachadh default)
  • Tha 2 àithne air an sgrùdadh ann an cmd suidse (òrdughan [1]) - fad и faighinn tionndadh.
  • fhad a’ sgrùdadh an seòrsa dàta a-steach òrduighean[2] agus ga shàbhaladh a-steach seòrsa dàta
  • A’ dèanamh sgrùdadh air sin buidheann tha luach sreang ann
    len(body) < 1
  • A’ tilleadh an t-sreath fhreagairtean:
    "result:bufferlength:" + datatype + "/" + body
  • faighinn tionndadh a 'tilleadh sreang
    return "result:version/auto"

Eadar-theangair

A’ gabhail a-steach structar InterpreteData agus a’ coileanadh giullachd àrd-sgoile air an dàta a chaidh a thilleadh roghainn sreathan agus cruthachadh stuthan Eadar-theangachadh Dàta.

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

gnìomh

Interprete(str string) (*InterpreteData, error)

a' gabhail ri sreang thoradh air agus a’ cruthachadh agus a’ tilleadh iomradh air an nì Eadar-theangachadh Dàta.

Adhartas:

  • San aon dòigh roghainn tha ceann agus corp air an toirt a-mach le bhith a’ cleachdadh ReqParseN2(str)
  • Tha an ceann air a roinn ann an eileamaidean a 'cleachdadh ReqParseHead (ceann)
  • Tha an nì air a thòiseachadh Eadar-theangachadh Dàta agus tha comharradh air a thoirt air ais :

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

Tha an nì seo air a chleachdadh ann an frithealaiche.go prìomh phacaid.

Client

Anns a’ phacaid teachdaiche tha na gnìomhan TCPConnect и Dàta freagairt TCPR.

gnìomh

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

ag obair mar seo:

  • Tha ceangal ga dhèanamh ris a’ cheangal a tha air a shònrachadh ann an nì nan roghainnean a chaidh seachad
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Tha an dàta a thèid seachad anns a’ pharamadair dàta air a ghluasad:
    conn.Write(data)
  • Tha am freagairt air a leughadh
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    agus air a chlò-bhualadh air a’ chonsail

    fmt.Println(string(resp[:n]))
  • Ma thèid a ghluasad luchd-pàighidh an uairsin ga thoirt seachad
    conn.Write(payload)

    agus cuideachd a 'leughadh freagairt an fhrithealaiche, ga chlò-bhualadh chun a' chonsail

gnìomh

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

a’ cruthachadh bufair den mheud ainmichte, a’ leughadh freagairt an fhrithealaiche an sin agus a’ tilleadh am bufair seo agus an àireamh de bytes a chaidh a leughadh, a bharrachd air nì mearachd.

Fo-riaghailt teachdaiche

A’ frithealadh òrdughan a chuir gu frithealaichean nód, a bharrachd air staitistig ghoirid agus deuchainn fhaighinn.

Gabhaidh iad ris na paramadairean a leanas: faidhle rèiteachaidh ann an cruth JSON, dàta ri chuir chun t-seirbheisiche mar shreang, slighe chun fhaidhle a thèid a chuir gu uallach pàighidh, bratach aithris clàr-ama nód, seòrsa dàta air a ghluasad mar luach àireamhach.

  • A 'faighinn an rèiteachaidh
    st := types.ParseConfig(*config)
  • Ma thèid bratach an emu seachad, tòisichidh e sguabadair
  • Ma thèid am bratach f a tha a’ comharrachadh an t-slighe chun fhaidhle a thoirt seachad, luchdaichidh sinn an dàta aige a-steach fdb agus thèid an susbaint a chuir chun t-seirbheisiche
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Mura h-eil am faidhle air a shònrachadh, tha an dàta bhon bhratach dìreach air a chuir -d:
    client.TCPConnect(st, []byte(*data), nil)

Tha seo uile na riochdachadh nas sìmplidhe a’ sealltainn structar a’ phròtacail. Rè leasachadh, tha an comas-gnìomh riatanach air a chur ris an structar aige.

Anns an dàrna pàirt bruidhnidh mi mu structaran dàta airson blocaichean agus gnothaichean, ann an 3 mun t-seirbheisiche WebSocket airson ceangal bho JavaScript, ann an 4 bheir mi sùil air a’ chlàr sioncronaidh, an uairsin inneal stac a bhios a’ pròiseasadh bytecode bho chuir a-steach agus toraidhean, cryptography agus pools airson toraidhean.

Source: www.habr.com

Cuir beachd ann