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.
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.
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.
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