Рушди blockchain барои саноат бо истифода аз Go. Қисми 1

Ҳоло чаҳор моҳ аст, ки ман дар болои лоиҳаи "Таҳияи абзорҳои ҳифзи додаҳо ва идоракунӣ дар бахшҳои давлатӣ ва саноатӣ дар асоси blockchain" кор мекунам.
Акнун ман мехостам ба шумо дар бораи он ки ман ин лоиҳаро чӣ гуна оғоз кардам, нақл кунам ва ҳоло ман рамзи барномаро муфассал тавсиф мекунам.

Рушди blockchain барои саноат бо истифода аз Go. Қисми 1

Ин аввалин мақола дар силсилаи мақолаҳост. Дар ин ҷо ман сервер ва протоколро тавсиф мекунам. Дар асл, хонанда ҳатто метавонад версияҳои шахсии ин унсурҳои blockchain нависад.

Ва дар ин ҷо қисми дуюм аст — дар бораи блокчейн ва сохторҳои додаҳои транзаксия, инчунин дар бораи бастае, ки ҳамкорӣ бо пойгоҳи додаҳоро амалӣ мекунад.

Соли гузашта, дар хакатони Digital Breakthrough, онҳо идеяи сохтани як системаи муфид барои саноат ва иқтисодиёти рақамиро бо истифода аз технологияи тақсимоти китоб пайдо карданд; инчунин аз ҷониби Фонди кӯмаки инноватсия барои рушд грант дода шуд (ман бояд алоҳида нависам) мақола дар бораи грант, барои онҳое, ки нав оғоз мекунанд ) ва ҳоло дар тартиб.

Таҳия бо забони Go сурат мегирад ва пойгоҳи додаҳо, ки дар он блокҳо нигоҳ дошта мешаванд, LevelDB мебошад.
Қисмҳои асосӣ протокол, сервер мебошанд (ки TCP ва WebSocket -ро идора мекунад - якум барои ҳамоҳангсозии blockchain, дуюм барои пайваст кардани мизоҷон, фиристодани транзаксияҳо ва фармонҳо аз JavaScript, масалан.

Тавре зикр гардид, ин блокчейн пеш аз ҳама барои автоматизатсия ва ҳифзи мубодилаи маҳсулот байни таъминкунандагон ва мизоҷон ё ҳарду дар як шахс лозим аст. Ин одамон ба боварии якдигар шитоб намекунанд. Аммо вазифа на танҳо аз он иборат аст, ки бо ҳисобкунаки дарунсохт эҷод кардани «дафтарчаи чекӣ», балки системаест, ки аксари вазифаҳои муқаррариро, ки ҳангоми кор бо давраи ҳаёти маҳсулот ба миён меоянд, автоматӣ мекунад. Байткоде, ки барои ин масъала масъул аст, тавре ки маъмулан дар blockchainҳо аст, дар воридот ва баромади транзаксияҳо нигоҳ дошта мешавад (худи транзаксияҳо дар блокҳо нигоҳ дошта мешаванд, блокҳо дар LevelDB дар формати GOB пешакӣ рамзгузорӣ карда мешаванд). Аввалан, биёед дар бораи протокол ва сервер (як гиреҳ) сӯҳбат кунем.

Протокол мураккаб нест, тамоми нуқтаи он гузаштан ба реҷаи боркунии баъзе маълумотҳо, одатан блок ё транзаксия дар ҷавоб ба хати фармони махсус мебошад ва он инчунин барои табодули инвентаризатсия лозим аст, то гиреҳ донад, ки он кист ба он пайваст аст ва чӣ гуна онҳо бояд кореро анҷом диҳанд (гиреҳҳое, ки барои сеанси ҳамоҳангсозӣ пайваст шудаанд, инчунин "ҳамсоя" номида мешаванд, зеро IP-и онҳо маълум аст ва маълумоти ҳолати онҳо дар хотира нигоҳ дошта мешавад).

Ҷузвдонҳо (директорияҳое, ки Linux онҳоро меноманд) дар фаҳмиши барномасозони Go бастаҳо номида мешаванд, аз ин рӯ дар аввали ҳар як файл бо рамзи Go аз ин директория онҳо бастаи папкаро менависанд folder_name_name_this_file ҷойгир аст. Дар акси ҳол, шумо наметавонед бастаро ба компилятор интиқол диҳед. Хуб, ин барои онҳое, ки ин забонро медонанд, пӯшида нест. Инҳо бастаҳо мебошанд:

  • Муоширати шабакавӣ (сервер, муштарӣ, протокол)
  • Сохторҳои маълумотҳои ҳифзшуда ва интиқолшуда (блок, транзаксия)
  • Пойгоҳи додаҳо (blockchain)
  • Консенсус
  • Мошини маҷозии маҷозӣ (xvm)
  • Ёрӣ (крипто, намудҳо), ки ҳоло.

Ин аст пайванд ба github

Ин версияи таълимӣ буда, дар он таъсири мутақобилаи байни равандҳо ва якчанд ҷузъҳои таҷрибавӣ мавҷуд нест, аммо сохтор ба сохторе мувофиқат мекунад, ки дар он таҳия карда мешавад. Агар шумо дар шарҳҳо чизе дошта бошед, ман бо камоли майл онро дар рушди минбаъда ба назар мегирам. Ва ҳоло барои шарҳи сервер ва протокол.

Биёед аввал серверро бубинем.

Зерпрограммаи сервер ҳамчун сервери додаҳо амал мекунад, ки дар болои протоколи TCP бо истифода аз сохторҳои додаҳои бастаи протокол кор мекунад.

Тартиб бастаҳои зеринро истифода мебарад: сервер, протокол, намуди. Дар худи баста tcp_server.go сохтори маълумотро дар бар мегирад Хизмат кунед.

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

Он метавонад параметрҳои зеринро қабул кунад:

  • Порти шабакавӣ, ки тавассути он маълумот мубодила мешавад
  • Файли конфигуратсияи сервер дар формати JSON
  • Парчам барои кор дар реҷаи debug (blockchain хусусӣ)

Пешравӣ:

  • Конфигуратсияро аз файли JSON мехонад
  • Парчами ҳолати дебаг тафтиш карда мешавад: агар он насб карда шуда бошад, нақшаи ҳамоҳангсозии шабака оғоз намешавад ва блокчейн бор карда намешавад
  • Оғоз кардани сохтори додаҳои конфигуратсия ва оғоз кардани сервер

Сервер

  • Оғози сервери TCP ва ҳамкории шабакаро мувофиқи протокол анҷом медиҳад.
  • Он дорои сохтори маълумотест, ки аз рақами порт, андозаи буфер ва нишондиҳанда ба сохтор иборат аст намудҳо. Танзимотҳо
  • Усули Run ҳамкории шабакаро оғоз мекунад (гӯш кардани пайвастҳои воридотӣ дар бандари додашуда, вақте ки пайвасти нав гирифта мешавад, коркарди он ба усули коркарди хусусӣ дар риштаи нав интиқол дода мешавад)
  • В идора карда мешаванд маълумот аз пайвастшавӣ ба буфер хонда мешавад, ба намоиши сатр табдил дода мешавад ва ба он интиқол дода мешавад протокол. Интихоб
  • протокол. Интихоб бармегардад натиҷа ё боиси хатоги мегардад. натиҷа баъд ба он интиқол дода мешавад протокол. тафсирки бармегардад intrpr - объекти намуд InterpreteData, ё боиси хатогӣ дар коркарди натиҷаи интихоб мегардад
  • Пас аз он, гузариш иҷро карда мешавад intrpr.Фармонҳо[0] ки яке аз: натиҷа, инв, хато ва як бахш вуҷуд дорад Пешфарз
  • Дар бахш натиҷа гузариш аз рӯи арзиш пайдо мешавад intrpr.Фармонҳо[1] ки арзишҳоро тафтиш мекунад дарозии буфер и нусхаи (дар ҳар як ҳолат функсияи мувофиқ даъват карда мешавад)

Функсияҳо GetVersion и Дарозии буфер дар файл ҳастанд srvlib.go бастаи сервер

GetVersion(conn net.Conn, version string)

он танҳо ба консол чоп мекунад ва версияи дар параметр додашударо ба муштарӣ мефиристад:

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

.
функсия

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

блок, транзаксия ё дигар маълумоти мушаххасро ба таври зерин бор мекунад:

  • Ба консол намуди маълумотеро, ки дар протокол нишон дода шудааст, ки бояд қабул карда шавад, чоп мекунад:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Қиматро мехонад intrpr.Body ба тағирёбандаи ададӣ buf_len
  • Буфер эҷод мекунад навбунёд андозаи муайян:
    make([]byte, buf_len)
  • Ҷавоби хуб мефиристад:
    conn.Write([]byte("result:ok"))
  • Буферро аз ҷараёни хондан пурра пур мекунад:
    io.ReadFull(conn, newbuf)

    .

  • Мундариҷаи буферро ба консол чоп мекунад
    fmt.Println(string(newbuf))

    ва шумораи байтҳои хондашуда

    fmt.Println("Bytes length:", n)
  • Ҷавоби хуб мефиристад:
    conn.Write([]byte("result:ok"))

Усулҳои бастаи сервер барои коркарди маълумоти гирифташуда бо истифода аз функсияҳои баста танзим карда мешаванд протокол.

Протокол

Протокол ҳамчун воситае хизмат мекунад, ки маълумотро дар мубодилаи шабака муаррифӣ мекунад.

Интихоб (сатри str) (сатр, хато) коркарди ибтидоии додаҳои аз ҷониби сервер гирифташударо иҷро мекунад, тасвири сатри маълумотро ҳамчун вуруд қабул мекунад ва сатри барои омодашударо бармегардонад Тарҷумон:

  • Бо истифода аз сатри вуруд ба сар ва бадан тақсим карда мешавад ReqParseN2(str)
  • сар ба элементҳо тақсим карда мешавад ва бо истифода аз ReqParseHead (head) ба як буридаи фармонҳо ҷойгир карда мешавад.
  • В гузариш (фармон[0]) фармони қабулшударо интихоб кунед (cmd, калид, суроға ё бахш ба кор андохта мешавад Пешфарз)
  • 2 фармон дар cmd тафтиш карда мешавад switch(фармон[1]) — дарозӣ и гардиш.
  • дарозӣ намуди маълумотро тафтиш мекунад фармон[2] ва онро захира мекунад навъи маълумот
  • Инро тафтиш мекунад бадан дорои арзиши сатр аст
    len(body) < 1
  • Сатри ҷавобро бармегардонад:
    "result:bufferlength:" + datatype + "/" + body
  • гардиш сатрро бармегардонад
    return "result:version/auto"

Тарҷумон

Сохтори InterpreteData-ро дар бар мегирад ва коркарди дуввуми маълумоти баргардонидашударо иҷро мекунад интихоб сатрҳо ва ташаккули объект InterpreteData.

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

функсия

Interprete(str string) (*InterpreteData, error)

сатрро кабул мекунад натиҷа ва истинодро ба объект эҷод ва бармегардонад InterpreteData.

Пешравӣ:

  • Ба ҳамин монанд интихоб бо истифода аз сару бадан гирифта мешаванд ReqParseN2(str)
  • бо истифода аз сар ба унсурҳо тақсим карда мешавад ReqParseHead (сар)
  • Объект оғоз карда мешавад InterpreteData ва ишоракунанда ба он бармегардад:

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

Ин объект дар server.go бастаи асосӣ.

мизоҷ

Бастаи муштарӣ дорои функсияҳо мебошад TCPConnect и TCPResponseData.

функсия

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

чунин кор мекунад:

  • Пайвастшавӣ ба пайвасти дар объекти танзимоти гузаронидашуда муқарраршуда сурат мегирад
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Маълумоти дар параметри додашуда интиқол дода мешавад:
    conn.Write(data)
  • Ҷавоб хонда мешавад
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ва дар консол чоп карда мешавад

    fmt.Println(string(resp[:n]))
  • Агар интиқол дода шавад пардохт баъд онро мегузарад
    conn.Write(payload)

    ва инчунин посухи серверро мехонад ва онро ба консол чоп мекунад

функсия

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

буфери андозаи муайяншударо эҷод мекунад, ҷавоби серверро дар он ҷо мехонад ва ин буфер ва шумораи байтҳои хондашуда, инчунин объекти хатогиро бармегардонад.

Зерпрограммаи муштарӣ

Барои фиристодани фармонҳо ба серверҳои гиреҳ, инчунин гирифтани омори мухтасар ва санҷиш хидмат мекунад.

Параметрҳои зеринро қабул карда метавонад: файли конфигуратсия дар формати JSON, маълумоте, ки ба сервер ҳамчун сатр фиристода мешавад, роҳ ба файле, ки ба боркашонӣ фиристода мешавад, парчами эмулятсияи нақшаи гиреҳ, навъи маълумоте, ки ҳамчун арзиши ададӣ интиқол дода мешавад.

  • Гирифтани конфигуратсия
    st := types.ParseConfig(*config)
  • Агар парчами emu гузаронида шавад, он оғоз меёбад шедулер
  • Агар парчами f, ки роҳи файлро нишон медиҳад, дода шуда бошад, мо маълумоти онро ба он бор мекунем fdb ва мундариҷа ба сервер фиристода мешавад
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Агар файл муайян нашуда бошад, пас маълумот аз парчам ба таври оддӣ фиристода мешавад -d:
    client.TCPConnect(st, []byte(*data), nil)

Ҳамаи ин як намоиши соддакардашудаест, ки сохтори протоколро нишон медиҳад. Ҳангоми таҳия, ба сохтори он функсияҳои зарурӣ илова карда мешаванд.

Дар қисми дуюм ман дар бораи сохторҳои додаҳо барои блокҳо ва транзаксияҳо сӯҳбат хоҳам кард, дар 3 дар бораи сервери WebSocket барои пайвастшавӣ аз JavaScript, дар 4 ман ба нақшаи синхронизатсия, баъд мошини стек, ки байткодро аз воридот ва баромадҳо коркард мекунад, криптография ва ҳавзҳо барои натиҷаҳо.

Манбаъ: will.com

Илова Эзоҳ