Forbairt Blockchain don tionscal ag baint úsáide as Go. Cuid 1

Le ceithre mhí anuas anois tá mé ag obair ar thionscadal ar a dtugtar "Forbairt uirlisí cosanta sonraí agus bainistíochta in earnálacha rialtais agus tionsclaíochta bunaithe ar blockchain."
Anois ba mhaith liom a insint duit faoi conas a thosaigh mé ar an tionscadal seo, agus anois déanfaidh mé cur síos mionsonraithe ar chód an chláir.

Forbairt Blockchain don tionscal ag baint úsáide as Go. Cuid 1

Is é seo an chéad alt i sraith alt. Anseo déanaim cur síos ar an bhfreastalaí agus ar an bprótacal. Go deimhin, is féidir leis an léitheoir fiú a leaganacha féin de na heilimintí blockchain seo a scríobh.

Agus seo é an dara cuid — faoi struchtúir blockchain agus sonraí idirbhirt, chomh maith leis an bpacáiste a chuireann idirghníomhú leis an mbunachar sonraí i bhfeidhm.

An bhliain seo caite, ag an hackathon Digital Breakthrough, tháinig siad ar smaoineamh chun córas úsáideach a dhéanamh don tionscal agus don gheilleagar digiteach ag baint úsáide as teicneolaíocht mórleabhair dáilte; eisíodh deontas freisin le haghaidh forbartha ag an gCiste um Chúnamh Nuálaíochta (ba cheart dom ráiteas ar leith a scríobh. alt faoin deontas, dóibh siúd atá díreach ag tosú a dhéanamh startups ), agus anois in ord.

Tarlaíonn forbairt sa teanga Go, agus is é LevelDB an bunachar sonraí ina stóráiltear na bloic.
Is iad na príomhchodanna an prótacal, an freastalaí (a ritheann TCP agus WebSocket - an chéad cheann chun an blockchain a shioncronú, an dara ceann chun cliaint a nascadh, idirbhearta agus orduithe ó JavaScript a sheoladh, mar shampla.

Mar a luadh, tá gá leis an blockchain seo go príomha chun malartú táirgí idir soláthraithe agus custaiméirí a uathoibriú agus a chosaint, nó an dá cheann in aon duine. Níl aon deifir ar na daoine seo muinín a bheith acu as a chéile. Ach is é an tasc ní hamháin “seicleabhar” a chruthú le háireamhán ionsuite, ach córas a uathoibríonn an chuid is mó de na gnáththascanna a thagann chun cinn agus iad ag obair le saolré an táirge. Stóráiltear an bytecode atá freagrach as an ábhar seo, mar is gnách le blockchain, in ionchuir agus aschuir na n-idirbheart (stóráiltear na hidirbhearta féin i mbloic, tá na bloic i LevelDB réamh-ionchódaithe i bhformáid GOB). Ar dtús, déanaimis labhairt faoin bprótacal agus faoin bhfreastalaí (nó nód).

Níl an prótacal casta, is é a phointe iomlán ná aistriú go dtí an modh luchtaithe roinnt sonraí, de ghnáth bloc nó idirbheart, mar fhreagra ar líne ordaithe speisialta, agus tá gá leis freisin chun fardal a mhalartú, ionas go mbeidh a fhios ag an nód cé hé. a bhfuil baint aige leis agus conas a bhfuil gnó le déanamh acu (tugtar “comharsanachta” freisin ar na nóid a bhaineann leis an seisiún sioncrónaithe toisc go bhfuil a n-IP ar eolas agus go bhfuil a sonraí stáit stóráilte sa chuimhne).

Tugtar pacáistí ar fhillteáin (eolaire mar a ghlaonn Linux orthu) i dtuiscint ríomhchláraitheoirí Go, mar sin ag tús gach comhad le cód Téigh ón eolaire seo scríobhann siad pacáiste folder_name_where_this_file suite. Seachas sin, ní bheidh tú in ann an pacáiste a thabhairt don tiomsaitheoir. Bhuel, ní rún ar bith é seo dóibh siúd a bhfuil an teanga seo acu. Seo iad na pacáistí:

  • Cumarsáid líonra (freastalaí, cliant, prótacal)
  • Struchtúir sonraí stóráilte agus tarchurtha (bloc, idirbheart)
  • Bunachar Sonraí (blockchain)
  • Comhdhearcadh
  • Meaisín fíorúil cruachta (xvm)
  • Cúnta (crypto, cineálacha) sin go léir faoi láthair.

Seo é an nasc chuig github

Is leagan oideachais é seo, níl idirghníomhú idirphróisis agus roinnt comhpháirteanna turgnamhacha ann, ach comhfhreagraíonn an struchtúr don cheann ar a bhfuil forbairt á déanamh. Má tá aon rud le moladh agat sna tuairimí, beidh mé sásta é a chur san áireamh i bhforbairt bhreise. Agus anois le haghaidh míniú ar an bhfreastalaí agus prótacal.

Breathnaímid ar an bhfreastalaí ar dtús.

Feidhmíonn an fo-riail freastalaí mar fhreastalaí sonraí a ritheann ar bharr an phrótacail TCP ag baint úsáide as struchtúir sonraí ón bpacáiste prótacail.

Úsáideann an gnáthamh na pacáistí seo a leanas: freastalaí, prótacal, cineálacha. Sa phacáiste féin tcp_server.go ina bhfuil struchtúr sonraí Freastal.

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

Is féidir leis na paraiméadair seo a leanas a ghlacadh:

  • Port líonra trína malartófar sonraí
  • Comhad cumraíochta freastalaí i bhformáid JSON
  • Bratach le haghaidh rith i mód dífhabhtaithe (blockchain príobháideach)

Dul chun cinn:

  • Léann cumraíocht ó chomhad JSON
  • Seiceáiltear bratach an mhodha dífhabhtaithe: má tá sé socraithe, ní sheoltar an sceidealóir sioncrónaithe líonra agus níl an blockchain luchtaithe
  • An struchtúr sonraí cumraíochta a thosú agus an freastalaí a thosú

freastalaí

  • Seoladh an fhreastalaí TCP agus idirghníomhú líonra de réir an phrótacail.
  • Tá struchtúr sonraí Freastal aige comhdhéanta d'uimhir phoirt, méid maoláin agus pointeoir don struchtúr cineálacha.Socruithe
  • Tosaíonn an modh Rith idirghníomhaíocht líonra (éisteacht le naisc isteach ar phort ar leith, nuair a fhaightear nasc nua, aistrítear a phróiseáil chuig an modh láimhseála príobháideach i snáithe nua)
  • В láimhseáil déantar sonraí ón nasc a léamh i maolán, a thiontú go léiriú teaghrán agus a chur ar aghaidh chuig prótacal.Choice
  • prótacal.Choice filleann mar thoradh ar nó is cúis le hearráid. mar thoradh ar ansin aistríodh go prótacal.Idirmhíniúa fhilleann intrpr - réad den chineál Léirmhíniú Sonraí, nó ina chúis le hearráid agus an toradh roghnaithe á phróiseáil
  • Ansin déantar an lasc a fhorghníomhú intrpr.Orduithe[0] a sheiceálann ceann de na: toradh, inv, earráid agus tá alt réamhshocraithe
  • Sa chuid mar thoradh ar faightear lasc de réir luacha intrpr.Orduithe[1] a sheiceálann na luachanna fad maolánach и leagan (i ngach cás tugtar an fheidhm chomhfhreagrach)

Feidhmeanna Faigh Leagan и Fad Maolán atá sa chomhad srvlib.go pacáiste freastalaí

GetVersion(conn net.Conn, version string)

priontálann sé go dtí an consól agus seolann sé an leagan a ritheadh ​​sa pharaiméadar chuig an gcliant:

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

.
Feidhm

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

lódálann sé bloc, idirbheart, nó sonraí sonracha eile mar seo a leanas:

  • Priontálann chuig an gconsól an cineál sonraí atá sonraithe sa phrótacal ar gá glacadh leis:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Léann an luach intrpr.Comhlacht chuig athróg uimhriúil buf_len
  • Cruthaíonn maolán nuabhabh méid sonraithe:
    make([]byte, buf_len)
  • Seolann freagra ceart go leor:
    conn.Write([]byte("result:ok"))
  • Líonann sé an maolán go hiomlán ón sruth léite:
    io.ReadFull(conn, newbuf)

    .

  • Priontaí inneachar an mhaoláin chuig an consól
    fmt.Println(string(newbuf))

    agus líon na mbeart a léadh

    fmt.Println("Bytes length:", n)
  • Seolann freagra ceart go leor:
    conn.Write([]byte("result:ok"))

Tá modhanna ón bpacáiste freastalaí cumraithe chun sonraí faighte a phróiseáil ag baint úsáide as feidhmeanna ón bpacáiste prótacal.

Prótacal

Feidhmíonn prótacal mar mhodh a léiríonn sonraí i malartú líonra.

Rogha (teaghrán) (teaghrán, earráid) déanann sé príomhphróiseáil sonraí a fhaigheann an freastalaí, faigheann sé léiriú teaghrán de na sonraí mar ionchur agus seolann sé ar ais teaghrán ullmhaithe dó Ateangaire:

  • Roinntear an téad ionchuir ina cheann agus ina gcorp ag baint úsáide as ReqParseN2(str)
  • roinntear an ceann ina dúile agus cuirtear i slisne orduithe é ag úsáid ReqParseHead(head)
  • В lasc(orduithe[0]) roghnaigh an t-ordú faighte (cmd, eochair, seoladh nó tá an t-alt spreagtha réamhshocraithe)
  • Déantar 2 ordú a sheiceáil i cmd lasc (orduithe[1]) — fad и fháil leagan.
  • fad seiceálann sé an cineál sonraí isteach orduithe[2] agus sábhálann sé i datatype
  • Seiceálann sé sin comhlacht tá luach teaghrán ann
    len(body) < 1
  • Seoltar ar ais an teaghrán freagartha:
    "result:bufferlength:" + datatype + "/" + body
  • fháil leagan filleann teaghrán
    return "result:version/auto"

Ateangaire

Tá an struchtúr InterpreteData ann agus déanann sé próiseáil thánaisteach ar na sonraí a fuarthas uaidh Rogha teaghráin agus foirmiú réad Léirmhíniú Sonraí.

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

Feidhm

Interprete(str string) (*InterpreteData, error)

glacann teaghrán mar thoradh ar agus cruthaíonn agus cuireann sé ar ais tagairt don réad Léirmhíniú Sonraí.

Dul chun cinn:

  • Mar an gcéanna Rogha bhaintear ceann agus comhlacht ag baint úsáide as ReqParseN2(str)
  • Tá ceann roinnte ina heilimintí ag baint úsáide as ReqParseHead(ceann)
  • Cuirtear tús leis an réad Léirmhíniú Sonraí agus cuirtear pointeoir chuige ar ais:

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

Úsáidtear an réad seo i freastalaí.go príomhphacáiste.

Cliant

Tá na feidhmeanna sa phacáiste cliant TCPConnect и TCPResponseData.

Feidhm

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

oibríonn mar seo:

  • Déantar nasc leis an nasc atá sonraithe sa réad socruithe a ritheadh
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Tarchuirtear na sonraí a ritheadh ​​sa pharaiméadar sonraí:
    conn.Write(data)
  • Is é an freagra a léamh
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    agus clóite ar an consól

    fmt.Println(string(resp[:n]))
  • Má aistrítear é pálasta ansin cuireann sé ar aghaidh
    conn.Write(payload)

    agus léann sé freisin an freagra freastalaí, é a phriontáil ar an consól

Feidhm

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

cruthaíonn sé maolán den mhéid sonraithe, léann sé freagra an fhreastalaí ansin agus filleann sé an maolán seo agus líon na mbeart a léitear, chomh maith le réad earráide.

Fo-riarachán cliant

Feidhmíonn sé chun orduithe a sheoladh chuig freastalaithe nód, chomh maith le staitisticí gairid agus tástáil a fháil.

An féidir glacadh leis na paraiméadair seo a leanas: comhad cumraíochta i bhformáid JSON, sonraí a sheoladh chuig an bhfreastalaí mar teaghrán, cosán go dtí an comhad a sheoladh chuig pálasta, nód sceidealóir bratach aithrise, cineál na sonraí a aistríodh mar luach uimhriúil.

  • Faigh an chumraíocht
    st := types.ParseConfig(*config)
  • Má ritear an bhratach AEA, tosaíonn sé cailleoir
  • Má sholáthraítear an bhratach f a thaispeánann an cosán chuig an gcomhad, lódálaimid a chuid sonraí isteach ansin fdb agus seoltar an t-ábhar chuig an bhfreastalaí
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Mura bhfuil an comhad sonraithe, ansin seoltar na sonraí ón mbratach go simplí -d:
    client.TCPConnect(st, []byte(*data), nil)

Is léiriú simplithe é seo ar fad a léiríonn struchtúr an phrótacail. Le linn na forbartha, cuirtear an fheidhmiúlacht riachtanach lena struchtúr.

Sa dara cuid beidh mé ag caint faoi struchtúir sonraí le haghaidh bloic agus idirbhearta, i 3 faoi fhreastalaí WebSocket le haghaidh nascadh ó JavaScript, i 4 féachfaidh mé ar an sceidealóir sioncrónaithe, ansin meaisín cruachta a phróiseálann bytecode ó ionchuir agus aschuir, cripteagrafaíocht agus linnte le haghaidh aschuir.

Foinse: will.com

Add a comment