Haɓaka Blockchain don masana'antu ta amfani da Go. Kashi na 1

Watanni hudu yanzu ina aiki a kan wani aiki mai suna "Haɓaka kariyar bayanai da kayan aikin gudanarwa a cikin sassan gwamnati da masana'antu dangane da blockchain."
Yanzu ina so in gaya muku yadda na fara wannan aikin, kuma yanzu zan bayyana lambar shirin dalla-dalla.

Haɓaka Blockchain don masana'antu ta amfani da Go. Kashi na 1

Wannan shine labarin farko a cikin jerin kasidu. Anan na bayyana uwar garken da yarjejeniya. A gaskiya ma, mai karatu yana iya rubuta nasa nau'ikan waɗannan abubuwan blockchain.

Ga kuma kashi na biyu - game da blockchain da tsarin bayanan ma'amala, da kuma game da kunshin da ke aiwatar da hulɗa tare da bayanan.

A bara, a Digital Breakthrough hackathon, sun fito da wani ra'ayi don samar da tsari mai amfani ga masana'antu da tattalin arzikin dijital ta amfani da fasahar leda mai rarraba; An kuma ba da kyauta don ci gaba ta Asusun Taimakawa Innovation (Ya kamata in rubuta daban. labarin game da kyautar, ga waɗanda ke fara farawa kawai), kuma yanzu a cikin tsari.

Ana samun ci gaba a cikin yaren Go, kuma ma'aunin bayanan da aka adana tubalan shine LevelDB.
Babban sassan sune yarjejeniya, uwar garken (wanda ke tafiyar da TCP da WebSocket - na farko don daidaita blockchain, na biyu don haɗa abokan ciniki, aika ma'amaloli da umarni daga JavaScript, misali.

Kamar yadda aka ambata, ana buƙatar wannan blockchain da farko don sarrafa kansa da kuma kare musayar kayayyaki tsakanin masu kaya da abokan ciniki, ko duka a cikin mutum ɗaya. Waɗannan mutanen ba sa gaggawar amincewa da juna. Amma aikin ba kawai don ƙirƙirar "littafin dubawa" tare da ƙididdiga mai ginawa ba, amma tsarin da ke sarrafa yawancin ayyuka na yau da kullum da ke tasowa lokacin aiki tare da samfurin rayuwar samfurin. An adana bytecode wanda ke da alhakin wannan al'amari, kamar yadda aka saba da blockchain, ana adana shi a cikin bayanai da abubuwan da aka fitar na ma'amaloli (ma'amaloli da kansu ana adana su a cikin tubalan, tubalan a cikin LevelDB an riga an sanya su cikin tsarin GOB). Da farko, bari muyi magana game da yarjejeniya da uwar garken (aka node).

Ka’idar ba ta da sarkakiya, gaba daya abin da ake nufi da shi shi ne canjawa zuwa yanayin loda wasu bayanai, yawanci block ko mu’amala, a matsayin martani ga layin umarni na musamman, sannan kuma ana buqatar ta wajen musayar kaya, ta yadda kundila ta san ko wane ne. an haɗa su da kuma yadda suke da kasuwancin da za su yi ( nodes ɗin da aka haɗa don zaman daidaitawa kuma ana kiran su "maƙwabta" saboda an san IP ɗin su kuma ana adana bayanan jihar su cikin ƙwaƙwalwar ajiya).

Folders (directories kamar yadda Linux ke kiran su) a cikin fahimtar Go programmers ana kiran su packages, don haka a farkon kowane fayil tare da lambar Go daga wannan directory suna rubuta package folder_name_where_this_file. In ba haka ba, ba za ku iya ciyar da kunshin zuwa mai tarawa ba. To, wannan ba asiri ba ne ga waɗanda suka san wannan harshe. Waɗannan su ne fakitin:

  • Sadarwar hanyar sadarwa (sabar, abokin ciniki, yarjejeniya)
  • Tsarin bayanan da aka adana da watsawa (toshe, ciniki)
  • Database (blockchain)
  • Ijma'i
  • Na'ura mai ɗaukar hoto (xvm)
  • Auxiliary (crypto, iri) shi ke nan a yanzu.

Anan shine hanyar haɗi zuwa github

Wannan sigar ilimi ce, ba ta da hulɗar tsakanin tsari da wasu abubuwan gwaji da yawa, amma tsarin ya yi daidai da wanda ake aiwatar da ci gaba akansa. Idan kuna da wani abu da za ku ba da shawara a cikin sharhi, zan yi farin cikin yin la'akari da shi a cikin ci gaba. Kuma yanzu ga bayanin uwar garken da Yarjejeniya.

Bari mu fara duba uwar garken.

Subroutine uwar garken yana aiki azaman uwar garken bayanai wanda ke gudana a saman ka'idar TCP ta amfani da tsarin bayanai daga kunshin yarjejeniya.

Tsarin yau da kullun yana amfani da fakiti masu zuwa: uwar garken, Yarjejeniya, iri. A cikin kunshin kanta tcp_server.go ya ƙunshi tsarin bayanai Ku bauta wa.

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

Yana iya karɓar sigogi masu zuwa:

  • tashar sadarwa ta hanyar da za a musanya bayanai
  • Fayil ɗin daidaitawar uwar garken a cikin tsarin JSON
  • Tuta don gudana a cikin yanayin lalata (na sirri blockchain)

Ci gaba:

  • Yana karanta daidaitawa daga fayil ɗin JSON
  • Ana duba tutar yanayin gyara kuskure: idan an saita ta, ba a ƙaddamar da tsarin aiki tare da cibiyar sadarwa ba kuma ba a loda blockchain
  • Fara tsarin bayanan sanyi da fara uwar garken

Server

  • Yana aiwatar da ƙaddamar da uwar garken TCP da hulɗar cibiyar sadarwa daidai da ƙa'idar.
  • Yana da tsarin bayanan Hidima wanda ya ƙunshi lambar tashar jiragen ruwa, girman buffer da mai nuni ga tsarin iri.Saituna
  • Hanyar Run tana fara hulɗar cibiyar sadarwa (sauraron haɗin mai shigowa akan tashar da aka bayar, lokacin da aka karɓi sabon haɗi, ana canja wurin sarrafa shi zuwa hanyar sarrafa sirri a cikin sabon zaren)
  • В rike Ana karanta bayanai daga haɗin kai zuwa majigi, an juyar da su zuwa wakilcin kirtani kuma a wuce zuwa yarjejeniya.Zabi
  • yarjejeniya.Zabi ya dawo sakamakon ko yana haifar da kuskure. sakamakon sannan aka koma yarjejeniya.Fassarawanda ke dawowa intrpr - abu na nau'in FassaraData, ko haifar da kuskure wajen sarrafa sakamakon zaɓin
  • Sa'an nan kuma an kashe shi intrpr. Umurni[0] wanda ke duba daya daga cikin: sakamako, inv, kuskure kuma akwai sashe tsoho
  • A cikin sashin sakamakon Ana samun canji ta ƙima intrpr. Umurni[1] wanda ke duba ƙimar tsayin daka и version (a kowane hali ana kiran aikin da ya dace)

Ayyuka GetVersion и Tsawon Buffer suna cikin fayil srvlib.go kunshin uwar garke

GetVersion(conn net.Conn, version string)

kawai yana bugawa zuwa na'ura wasan bidiyo kuma yana aika sigar da aka wuce a cikin siga ga abokin ciniki:

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

.
aiki

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

yana loda toshe, ciniki, ko wasu takamaiman bayanai kamar haka:

  • Buga zuwa na'ura mai ba da hanya tsakanin hanyoyin sadarwa nau'in bayanan da aka kayyade a cikin ka'idar da ke buƙatar karɓa:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Yana karanta darajar intrpr.Jiki zuwa madaidaicin lamba buf_len
  • Yana ƙirƙira majigi sabon girman da aka ƙayyade:
    make([]byte, buf_len)
  • Yana aika amsa lafiya:
    conn.Write([]byte("result:ok"))
  • Gabaɗaya ya cika buffer daga rafin karantawa:
    io.ReadFull(conn, newbuf)

    .

  • Yana buga abubuwan da ke cikin majigi zuwa na'ura mai kwakwalwa
    fmt.Println(string(newbuf))

    da adadin bytes karanta

    fmt.Println("Bytes length:", n)
  • Yana aika amsa lafiya:
    conn.Write([]byte("result:ok"))

An tsara hanyoyin daga fakitin uwar garken don aiwatar da bayanan da aka karɓa ta amfani da ayyuka daga fakitin Yarjejeniya.

layinhantsaki

Ƙidaya tana aiki azaman hanyar da ke wakiltar bayanai a musayar hanyar sadarwa.

Zabi (string string) (kirtani, kuskure) yana aiwatar da bayanan farko na sabar da aka karɓa, yana karɓar bayanin kirtani na bayanan azaman shigarwa kuma ya dawo da kirtani da aka shirya don Mai Tafsiri:

  • An raba igiyar shigarwa zuwa kai da jiki ta amfani da ita ReqParseN2 (str)
  • an raba kai zuwa abubuwa kuma an sanya shi cikin yanki na umarni ta amfani da ReqParseHead (kai)
  • В canza (umarni[0]) zaɓi umarnin da aka karɓa (cmd, key, adireshin ko kuma an kunna sashe tsoho)
  • Ana duba umarni 2 a cmd canza (umarni[1]) - tsayi и tashin hankali.
  • tsawon duba nau'in data shiga umarni[2] kuma yana ajiyewa a ciki tsarin zamani
  • Duba cewa jiki ya ƙunshi ƙimar kirtani
    len(body) < 1
  • Yana dawo da layin amsa:
    "result:bufferlength:" + datatype + "/" + body
  • tashin hankali ya mayar da zare
    return "result:version/auto"

Mai Tafsiri

Ya ƙunshi tsarin InterpreteData kuma yana yin aiki na biyu na bayanan da aka dawo daga zabi igiyoyi da samuwar abu FassaraData.

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

aiki

Interprete(str string) (*InterpreteData, error)

ya yarda da kirtani sakamakon kuma ya ƙirƙira kuma ya dawo da nuni ga abu FassaraData.

Ci gaba:

  • Hakazalika zabi ana fitar da kai da jiki ta hanyar amfani ReqParseN2 (str)
  • kai ya rabu zuwa abubuwa ta amfani da ReqParseHead (kai)
  • An fara fara abun FassaraData kuma a mayar da mai nuni zuwa gare shi.

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

Ana amfani da wannan abu a ciki uwar garken.go babban kunshin.

Abokin ciniki

Kunshin abokin ciniki ya ƙunshi ayyuka TCPConnect и Bayanan Bayani na TCPR.

aiki

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

yana aiki kamar haka:

  • Ana yin haɗi zuwa haɗin da aka ƙayyade a cikin abin saitunan da aka wuce
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Ana watsa bayanan da aka wuce a cikin ma'aunin bayanai:
    conn.Write(data)
  • An karanta amsar
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    kuma an buga a kan na'ura mai kwakwalwa

    fmt.Println(string(resp[:n]))
  • Idan canja wuri dangi sannan ya wuce
    conn.Write(payload)

    sannan kuma yana karanta martanin uwar garken, yana buga shi zuwa na'ura mai kwakwalwa

aiki

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

yana ƙirƙirar buffer na ƙayyadaddun girman, karanta martanin uwar garken a can kuma ya dawo da wannan buffer da adadin bytes da aka karanta, da kuma abin kuskure.

Abokin ciniki subbroutine

Yana aiki don aika umarni zuwa sabar node, da kuma samun taƙaitaccen ƙididdiga da gwaji.

Za a iya karɓar sigogi masu zuwa: fayil ɗin sanyi a tsarin JSON, bayanan da za a aika zuwa uwar garken azaman kirtani, hanyar zuwa fayil ɗin da za a aika zuwa kaya, tuta mai tsara ƙira, nau'in bayanan da aka canjawa wuri azaman ƙimar lamba.

  • Samun tsari
    st := types.ParseConfig(*config)
  • Idan an wuce tutar emu, yana farawa sheduler
  • Idan an ba da tutar f mai nuna hanyar zuwa fayil ɗin, to muna loda bayanansa a ciki fdb kuma ana aika abun ciki zuwa uwar garken
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Idan ba a ƙayyade fayil ɗin ba, to ana aika bayanan daga tuta kawai -d:
    client.TCPConnect(st, []byte(*data), nil)

Duk wannan wakilci ne mai sauƙi wanda ke nuna tsarin yarjejeniya. Lokacin haɓakawa, ana ƙara aikin da ake buƙata zuwa tsarin sa.

A kashi na biyu zan yi magana game da tsarin bayanai don tubalan da ma'amaloli, a cikin 3 game da uwar garken WebSocket don haɗawa daga JavaScript, a cikin 4 zan duba mai tsara tsarin aiki tare, sannan injin tari mai sarrafa bytecode daga abubuwan shigarwa da fitarwa, cryptography da wuraren waha don fitarwa.

source: www.habr.com

Add a comment