Kukula kwa blockchain kwamakampani ogwiritsa ntchito Go. Gawo 1

Kwa miyezi inayi tsopano ndakhala ndikugwira ntchito yotchedwa "Kupititsa patsogolo chitetezo cha deta ndi zida zoyendetsera ntchito m'maboma ndi mafakitale pogwiritsa ntchito blockchain."
Tsopano ndikufuna ndikuuzeni momwe ndinayambira polojekitiyi, ndipo tsopano ndikufotokozera ndondomeko ya pulogalamuyo mwatsatanetsatane.

Kukula kwa blockchain kwamakampani ogwiritsa ntchito Go. Gawo 1

Iyi ndi nkhani yoyamba m’nkhani zotsatizana. Apa ndikufotokozera seva ndi protocol. M'malo mwake, wowerenga amatha kulembanso matembenuzidwe ake azinthu izi blockchain.

Ndipo apa pali gawo lachiwiri - za blockchain ndi ma data transaction data, komanso za phukusi lomwe limagwiritsa ntchito kuyanjana ndi database.

Chaka chatha, pa Digital Breakthrough hackathon, adabwera ndi lingaliro lopanga njira yothandiza yamakampani ndi chuma cha digito pogwiritsa ntchito ukadaulo wa ledger; thandizo linaperekedwanso kuti chitukuko ndi Innovation Assistance Fund (ndiyenera kulemba chosiyana). nkhani yokhudza chithandizo, kwa omwe angoyamba kumene ), ndipo tsopano mu dongosolo.

Chitukuko chimachitika muchilankhulo cha Go, ndipo nkhokwe momwe midadada imasungidwa ndi LevelDB.
Zigawo zazikuluzikulu ndi protocol, seva (yomwe imayendetsa TCP ndi WebSocket - yoyamba yolumikizira blockchain, yachiwiri yolumikizira makasitomala, kutumiza zotuluka ndi malamulo kuchokera ku JavaScript, mwachitsanzo.

Monga tanenera, blockchain iyi ndiyofunika makamaka kuti ipangitse ndikuteteza kusinthanitsa kwa zinthu pakati pa ogulitsa ndi makasitomala, kapena onse mwa munthu mmodzi. Anthu amenewa safulumira kukhulupirirana. Koma ntchitoyo sikuti imangopanga "checkbook" yokhala ndi chowerengera chokhazikika, koma dongosolo lomwe limagwiritsa ntchito ntchito zambiri zomwe zimachitika nthawi zonse pogwira ntchito ndi moyo wazinthu. Bytecode yomwe imayang'anira nkhaniyi, monga momwe zimakhalira ndi blockchains, imasungidwa pazolowera ndi zotulukapo (zochitazo zimasungidwa mu midadada, midadada mu LevelDB idasindikizidwa kale mu mtundu wa GOB). Choyamba, tiyeni tikambirane za protocol ndi seva (aka node).

Protocol sizovuta, mfundo yake yonse ndikusinthira kumayendedwe akutsitsa deta, nthawi zambiri chipika kapena kugulitsa, poyankha mzere wapadera wamalamulo, komanso pamafunikanso kusinthanitsa zowerengera, kuti node idziwe yemwe amalumikizidwa ndi momwe amachitira bizinesi (ma node olumikizidwa pagawo lolumikizana amatchedwanso "oyandikana nawo" chifukwa IP yawo imadziwika ndipo deta yawo ya boma imasungidwa kukumbukira).

Mafoda (zolemba monga Linux amazitcha) pakumvetsetsa kwa opanga mapulogalamu a Go amatchedwa phukusi, kotero kumayambiriro kwa fayilo iliyonse yokhala ndi Go code kuchokera mu bukhuli amalemba phukusi foda_name_where_this_file ilipo. Apo ayi, simungathe kudyetsa phukusi kwa compiler. Chabwino, ichi si chinsinsi kwa iwo amene amadziwa chinenero ichi. Nawa mapaketi:

  • Kulankhulana pa intaneti (seva, kasitomala, protocol)
  • Mapangidwe a data yosungidwa ndi yofalitsidwa (block, transaction)
  • Database (blockchain)
  • Kugwirizana
  • Makina osanjikizana (xvm)
  • Zothandizira (crypto, mitundu) ndizo zonse pakadali pano.

Nawu ulalo wa github

Uwu ndi mtundu wamaphunziro, ulibe kuyanjana kwapakati ndi magawo angapo oyesera, koma kapangidwe kake kamafanana ndi komwe chitukuko chikuchitika. Ngati muli ndi chilichonse chomwe munganene mu ndemanga, ndidzakhala wokondwa kuziganizira pakupititsa patsogolo. Ndipo tsopano kufotokozera kwa seva ndi Protocol.

Tiyeni tiwone seva poyamba.

Seva subroutine imagwira ntchito ngati seva ya data yomwe imayenda pamwamba pa protocol ya TCP pogwiritsa ntchito mapangidwe a data kuchokera pa phukusi la protocol.

Njirayi imagwiritsa ntchito paketi zotsatirazi: seva, Protocol, mitundu. Mu phukusi lokha tcp_server.go ili ndi dongosolo la data Tumikirani.

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

Ikhoza kuvomereza magawo otsatirawa:

  • Doko la netiweki lomwe deta idzasinthidwe
  • Fayilo yosinthira seva mumtundu wa JSON
  • Mbendera kuti ikuyendetsedwe mu debug mode (chinsinsi blockchain)

Kupita patsogolo:

  • Imawerenga masinthidwe kuchokera ku fayilo ya JSON
  • Mbendera ya debug mode imayang'aniridwa: ngati yakhazikitsidwa, ndondomeko yolumikizira netiweki sinayambitsidwe ndipo blockchain siyimakwezedwa.
  • Kuyambitsa dongosolo lachidziwitso ndi kuyambitsa seva

Seva

  • Imayendetsa kukhazikitsidwa kwa seva ya TCP ndi kuyanjana kwa netiweki molingana ndi protocol.
  • Ili ndi dongosolo la Seva data lomwe lili ndi nambala ya doko, kukula kwa buffer ndi cholozera pamapangidwewo mitundu.Zokonda
  • Njira ya Run imayamba kuyanjana kwa netiweki (kumvetsera zolumikizira zomwe zikubwera padoko lopatsidwa, pomwe kulumikizana kwatsopano kulandilidwa, kukonza kwake kumasamutsidwa ku njira yachinsinsi mu ulusi watsopano)
  • Π’ kusamalira deta kuchokera ku kugwirizana imawerengedwa mu buffer, kusinthidwa kukhala chingwe choyimira ndi kuperekedwa protocol.Kusankha
  • protocol.Kusankha zobwerera chifukwa kapena kuyambitsa cholakwika. chifukwa kenako anasamutsidwa ku protocol.Kutanthauzirazomwe zimabwerera intrpr - chinthu chamtundu InterpreteData, kapena zimayambitsa cholakwika pokonza zotsatira zosankhidwa
  • Ndiye kusinthana kumachitidwa intrpr.Commands[0] yomwe imayang'ana chimodzi mwa: zotsatira, inv, zolakwika ndipo pali gawo chosasintha
  • Mu gawo chifukwa kusintha kumapezeka ndi mtengo intrpr.Commands[1] zomwe zimayang'ana mayendedwe kutalika kwa buffer ΠΈ Baibulo (nthawi zonse ntchito yofananira imatchedwa)

Ntchito GetVersion ΠΈ BufferLength zili mu fayilo srvlib.go seva phukusi

GetVersion(conn net.Conn, version string)

imangosindikiza ku kontrakitala ndikutumiza mtundu womwe wadutsa mu parameter kwa kasitomala:

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

.
ntchito

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

imanyamula block, transaction, kapena data ina motere:

  • Zimasindikiza ku konsoni mtundu wa data yomwe yafotokozedwa mu protocol yomwe ikuyenera kulandiridwa:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Amawerenga mtengo intrpr.Body ku kusintha kwa manambala buf_len
  • Amapanga buffer newbuf kukula kwake:
    make([]byte, buf_len)
  • Adatumiza yankho labwino:
    conn.Write([]byte("result:ok"))
  • Imadzaza kwathunthu buffer kuchokera pamasamba owerengeka:
    io.ReadFull(conn, newbuf)

    .

  • Zimasindikiza zomwe zili mu buffer ku console
    fmt.Println(string(newbuf))

    ndi chiwerengero cha mabayiti owerengedwa

    fmt.Println("Bytes length:", n)
  • Adatumiza yankho labwino:
    conn.Write([]byte("result:ok"))

Njira zochokera pa phukusi la seva zimakonzedwa kuti zigwiritse ntchito deta yolandilidwa pogwiritsa ntchito ntchito za phukusi Protocol.

Pulogalamu

Protocol imakhala ngati njira yomwe imayimira deta pakusinthana kwa netiweki.

Kusankha(str string) (chingwe, cholakwika) imagwira ntchito yokonza deta yolandilidwa ndi seva, imalandira chingwe choyimira deta ngati cholowetsa ndikubweza chingwe chokonzekera. Womasulira:

  • Chingwe cholowetsa chimagawidwa m'mutu ndi thupi pogwiritsa ntchito ReqParseN2(str)
  • mutu umagawanika kukhala zinthu ndikuyikidwa mugawo la malamulo pogwiritsa ntchito ReqParseHead(mutu)
  • Π’ sinthani (malamulo[0]) sankhani lamulo lomwe mwalandira (cmd, kiyi, adilesi kapena gawo linayambika chosasintha)
  • 2 malamulo amafufuzidwa mu cmd switch(malamulo[1]) - kutalika ΠΈ kusintha.
  • Kutalika imayang'ana mtundu wa data mkati malamulo[2] ndikusunga mkati deta
  • Amafufuza zimenezo thupi ili ndi mtengo wa chingwe
    len(body) < 1
  • Ikubweza mndandanda wamayankhidwe:
    "result:bufferlength:" + datatype + "/" + body
  • kusintha amabwezera chingwe
    return "result:version/auto"

Womasulira

Ili ndi mawonekedwe a InterpreteData ndipo imapanganso kusanja kwachiwiri kwa data yomwe wabwezedwa Kusankha zingwe ndi kupanga chinthu InterpreteData.

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

ntchito

Interprete(str string) (*InterpreteData, error)

amavomereza chingwe chifukwa ndi kulenga ndi kubweza kalozera ku chinthucho InterpreteData.

Kupita patsogolo:

  • Mofananamo Kusankha mutu ndi thupi amachotsedwa ntchito ReqParseN2(str)
  • mutu umagawidwa m'zinthu pogwiritsa ntchito ReqParseHead(mutu)
  • Chinthucho chimayambitsidwa InterpreteData ndipo cholozera chake chabwezedwa.

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

Chinthu ichi chimagwiritsidwa ntchito mu seva.go phukusi lalikulu.

kasitomala

Phukusi la kasitomala lili ndi ntchito TCPConnect ΠΈ TCPResponseData.

ntchito

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

imagwira ntchito motere:

  • Kulumikizana kumapangidwa ku kulumikizana komwe kumatchulidwa muzosintha zomwe zadutsa
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Deta yodutsa mu data parameter imatumizidwa:
    conn.Write(data)
  • Yankho likuwerengedwa
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ndi kusindikizidwa pa console

    fmt.Println(string(resp[:n]))
  • Ngati atasamutsidwa Kulipira kenako amachipereka
    conn.Write(payload)

    ndikuwerenganso yankho la seva, ndikusindikiza ku console

ntchito

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

imapanga buffer ya kukula kwake, imawerenga yankho la seva pamenepo ndikubwezeretsanso buffer iyi ndi kuchuluka kwa ma byte owerengedwa, komanso chinthu cholakwika.

Kasitomala subroutine

Imatumikira kutumiza malamulo ku ma node ma seva, komanso kupeza ziwerengero zazifupi ndi kuyesa.

Itha kuvomereza magawo otsatirawa: fayilo yosinthira mumtundu wa JSON, deta yotumizidwa ku seva ngati chingwe, njira yopita ku fayilo yotumizidwa kuti ikamalipire, mbendera yotsatsira ma node scheduler, mtundu wa data womwe umasamutsidwa ngati nambala.

  • Kupeza kasinthidwe
    st := types.ParseConfig(*config)
  • Ngati mbendera ya emu yadutsa, imayamba sheduler
  • Ngati f mbendera yosonyeza njira yopita ku fayilo yaperekedwa, ndiye kuti timayika deta yake fdb ndipo zomwe zili zimatumizidwa ku seva
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Ngati fayiloyo siinatchulidwe, ndiye kuti deta yochokera ku mbendera imangotumizidwa -d:
    client.TCPConnect(st, []byte(*data), nil)

Zonsezi ndi chiwonetsero chosavuta chomwe chikuwonetsa kapangidwe ka protocol. Panthawi yachitukuko, ntchito yofunikira imawonjezedwa pamapangidwe ake.

Mu gawo lachiwiri ndilankhula za mapangidwe a data a blocks ndi transactions, mu 3 za seva ya WebSocket yolumikizira kuchokera ku JavaScript, mu 4 ndidzayang'ana pa synchronization scheduler, kenako makina osungira omwe amakonza bytecode kuchokera pazolowetsa ndi zotuluka, cryptography ndi maiwe otulutsa.

Source: www.habr.com

Kuwonjezera ndemanga