Go istifadə edərək sənaye üçün blokçeyn inkişafı. 1-ci hissə

Artıq dörd aydır ki, mən “Blokçeyn əsasında dövlət və sənaye sektorlarında məlumatların qorunması və idarəetmə vasitələrinin hazırlanması” adlı layihə üzərində işləyirəm.
İndi sizə bu layihəyə necə başladığım barədə danışmaq istərdim və indi proqram kodunu ətraflı təsvir edəcəyəm.

Go istifadə edərək sənaye üçün blokçeyn inkişafı. 1-ci hissə

Bu, məqalələr silsiləsindəki ilk məqalədir. Burada server və protokolu təsvir edirəm. Əslində, oxucu hətta bu blokçeyn elementlərinin öz versiyalarını da yaza bilər.

Və burada ikinci hissə — blokçeyn və tranzaksiya məlumat strukturları, həmçinin verilənlər bazası ilə qarşılıqlı əlaqəni həyata keçirən paket haqqında.

Keçən il Digital Breakthrough hakatonunda onlar paylanmış kitab texnologiyasından istifadə edərək sənaye və rəqəmsal iqtisadiyyat üçün faydalı sistem yaratmaq ideyası ilə çıxış etdilər; İnnovasiyalara Yardım Fondu tərəfindən inkişaf üçün qrant da verildi (ayrıca yazmalıyam) qrant haqqında məqalə, startapla məşğul olmağa yeni başlayanlar üçün ) və indi qaydasında.

İnkişaf Go dilində baş verir və blokların saxlandığı verilənlər bazası LevelDB-dir.
Əsas hissələr protokol, serverdir (TCP və WebSocket-i işlədir - birincisi blokçeyni sinxronlaşdırmaq üçün, ikincisi müştəriləri birləşdirmək, əməliyyatlar və JavaScript-dən əmrlər göndərmək üçün).

Qeyd edildiyi kimi, bu blokçeyn ilk növbədə təchizatçılar və müştərilər və ya hər ikisi arasında məhsul mübadiləsini avtomatlaşdırmaq və qorumaq üçün lazımdır. Bu insanlar bir-birlərinə güvənməyə tələsmirlər. Ancaq vəzifə yalnız daxili kalkulyatoru olan bir "çek kitabçası" yaratmaq deyil, məhsulun həyat dövrü ilə işləyərkən ortaya çıxan gündəlik vəzifələrin əksəriyyətini avtomatlaşdıran bir sistemdir. Bu məsələyə cavabdeh olan bayt kodu, adət olduğu kimi, blokçeynlərdə olduğu kimi, əməliyyatların giriş və çıxışlarında saxlanılır (əməliyyatların özləri bloklarda saxlanılır, LevelDB-dəki bloklar GOB formatında əvvəlcədən kodlaşdırılır). Əvvəlcə protokol və server (aka node) haqqında danışaq.

Protokol mürəkkəb deyil, onun bütün mahiyyəti xüsusi əmr xəttinə cavab olaraq bəzi məlumatların, adətən blokun və ya əməliyyatın yüklənməsi rejiminə keçməkdir və o, inventar mübadiləsi üçün də lazımdır ki, node kim olduğunu bilsin. bağlıdır və onların necə iş görəcəkləri var (sinxronizasiya sessiyası üçün qoşulmuş qovşaqlar həm də “qonşu” adlanır, çünki onların IP-si məlumdur və vəziyyət məlumatları yaddaşda saxlanılır).

Qovluqlar (Linux onları adlandırdığı kimi qovluqlar) Go proqramçılarının anlayışında paketlər adlanır, ona görə də bu qovluqdan Go kodu olan hər bir faylın əvvəlində qovluğun_adı_harada_bu_faylın yerləşdiyi paketi yazırlar. Əks halda, siz paketi tərtibçiyə çatdıra bilməyəcəksiniz. Yaxşı, bu dili bilənlər üçün sirr deyil. Bunlar paketlərdir:

  • Şəbəkə rabitəsi (server, müştəri, protokol)
  • Saxlanılan və ötürülən məlumatların strukturları (blok, əməliyyat)
  • Məlumat bazası (blokçeyn)
  • Konsensus
  • Yığılmış virtual maşın (xvm)
  • Köməkçi (kripto, növlər) hələlik bunlardır.

Budur github-a keçid

Bu təhsil versiyasıdır, proseslərarası qarşılıqlı əlaqə və bir neçə eksperimental komponentdən məhrumdur, lakin struktur inkişafın aparıldığı birinə uyğundur. Şərhlərdə təklif edəcəyiniz bir şey varsa, gələcək inkişafda bunu nəzərə almaqdan məmnun olaram. İndi isə serverin izahı üçün və protokol.

Əvvəlcə serverə baxaq.

Server alt proqramı protokol paketindən verilənlər strukturlarından istifadə edərək TCP protokolunun üstündə işləyən məlumat serveri kimi çıxış edir.

Rutin aşağıdakı paketlərdən istifadə edir: server, protokol, növləri. Paketin özündə tcp_server.go məlumat strukturunu ehtiva edir Xidmət et.

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

Aşağıdakı parametrləri qəbul edə bilər:

  • Məlumat mübadiləsinin aparılacağı şəbəkə portu
  • JSON formatında server konfiqurasiya faylı
  • Sazlama rejimində işləmək üçün işarə (şəxsi blokçeyn)

Tərəqqi:

  • JSON faylından konfiqurasiyanı oxuyur
  • Sazlama rejimi bayrağı yoxlanılır: əgər o quraşdırılıbsa, şəbəkə sinxronizasiya planlayıcısı işə salınmır və blokçeyn yüklənmir.
  • Konfiqurasiya məlumat strukturunun işə salınması və serverin işə salınması

server

  • TCP serverinin işə salınmasını və protokola uyğun olaraq şəbəkənin qarşılıqlı əlaqəsini həyata keçirir.
  • O, port nömrəsi, bufer ölçüsü və struktura göstəricidən ibarət olan Xidmət məlumat strukturuna malikdir növləri.Parametrlər
  • Run metodu şəbəkə qarşılıqlı əlaqəsinə başlayır (müəyyən bir portda daxil olan əlaqələri dinləmək, yeni bir əlaqə alındıqda, onun işlənməsi yeni bir mövzuda şəxsi idarə üsuluna köçürülür)
  • В idarə əlaqədən alınan məlumatlar buferə oxunur, simli təsvirə çevrilir və ötürülür protokol.Seçim
  • protokol.Seçim qayıdır nəticələnəcək ya da xətaya səbəb olur. nəticələnəcək sonra köçürüldü protokol. şərh etməkhansı qayıdır intrpr - tipli obyekt Məlumatları şərh edin, və ya seçim nəticəsinin işlənməsi zamanı xətaya səbəb olur
  • Sonra keçid yerinə yetirilir intrpr.Commands[0] bunlardan birini yoxlayır: nəticə, inv, səhv və bölmə var default
  • Bölmədə nəticələnəcək keçid dəyəri ilə tapılır intrpr.Commands[1] dəyərləri yoxlayır tampon uzunluğu и variant (hər bir halda müvafiq funksiya çağırılır)

Funksiyalar GetVersion и Bufer Uzunluğu faylda var srvlib.go server paketi

GetVersion(conn net.Conn, version string)

o, sadəcə olaraq konsola çap edir və parametrdə ötürülən versiyanı müştəriyə göndərir:

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

.
Function

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

bloku, əməliyyatı və ya digər xüsusi məlumatları aşağıdakı kimi yükləyir:

  • Qəbul edilməli olan protokolda göstərilən məlumat növünü konsola çap edir:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Dəyəri oxuyur intrpr.Bədən ədədi dəyişənə buf_len
  • Bufer yaradır yenibuf müəyyən ölçü:
    make([]byte, buf_len)
  • Tamam cavabı göndərir:
    conn.Write([]byte("result:ok"))
  • Oxuma axınından tamponu tam doldurur:
    io.ReadFull(conn, newbuf)

    .

  • Buferin məzmununu konsola çap edir
    fmt.Println(string(newbuf))

    və oxunan baytların sayı

    fmt.Println("Bytes length:", n)
  • Tamam cavabı göndərir:
    conn.Write([]byte("result:ok"))

Server paketindən olan üsullar paketdəki funksiyalardan istifadə edərək alınan məlumatları emal etmək üçün konfiqurasiya edilmişdir protokol.

protokol

Protokol şəbəkə mübadiləsində məlumatları təmsil edən bir vasitə kimi xidmət edir.

Seçim(str sətri) (sətir, xəta) server tərəfindən alınan məlumatların ilkin işlənməsini həyata keçirir, verilənlərin giriş kimi sətir təsvirini alır və hazırlanmış sətri qaytarır. Tərcüməçi:

  • Giriş sətri istifadə edərək baş və bədənə bölünür ReqParseN2(küç)
  • baş elementlərə bölünür və ReqParseHead(head) istifadə edərək əmrlər diliminə yerləşdirilir.
  • В keçid(əmrlər[0]) alınan əmri seçin (cmd, açar, ünvan və ya bölmə işə salınır default)
  • 2 əmr cmd-də yoxlanılır switch(commands[1]) — uzunluq и çevrilmə.
  • uzunluq məlumat növünü yoxlayır əmrlər[2] və onu saxlayır Datatype
  • Bunu yoxlayır bədən sətir dəyərini ehtiva edir
    len(body) < 1
  • Cavab sətirini qaytarır:
    "result:bufferlength:" + datatype + "/" + body
  • çevrilmə sətri qaytarır
    return "result:version/auto"

Tərcüməçi

InterpreteData strukturunu ehtiva edir və geri qaytarılan məlumatların ikincil işlənməsini həyata keçirir Choice strings və obyekt formalaşması Məlumatları şərh edin.

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

Function

Interprete(str string) (*InterpreteData, error)

sətri qəbul edir nəticələnəcək və obyektə istinad yaradır və qaytarır Məlumatları şərh edin.

Tərəqqi:

  • Eynilə Choice istifadə edərək baş və bədən çıxarılır ReqParseN2(küç)
  • istifadə edərək baş elementlərə bölünür ReqParseHead(baş)
  • Obyekt işə salınıb Məlumatları şərh edin və ona bir göstərici qaytarılır:

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

Bu obyektdə istifadə olunur server.go əsas paket.

Müştəri

Müştəri paketi funksiyaları ehtiva edir TCPConnect и TCPResponseData.

Function

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

aşağıdakı kimi işləyir:

  • Keçilmiş parametrlər obyektində göstərilən əlaqə ilə əlaqə qurulur
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Məlumat parametrində ötürülən məlumatlar ötürülür:
    conn.Write(data)
  • Cavab oxunur
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    və konsolda çap olunur

    fmt.Println(string(resp[:n]))
  • Əgər köçürülsə yük yükü sonra ötür
    conn.Write(payload)

    və həmçinin server cavabını oxuyur, onu konsola çap edir

Function

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

göstərilən ölçüdə bufer yaradır, orada server cavabını oxuyur və bu buferi və oxunan baytların sayını, həmçinin xəta obyektini qaytarır.

Müştəri alt proqram

Düyün serverlərinə əmrlər göndərmək, həmçinin qısa statistik məlumatlar və testlər almaq üçün xidmət edir.

Aşağıdakı parametrləri qəbul edə bilər: JSON formatında konfiqurasiya faylı, sətir kimi serverə göndəriləcək məlumatlar, faydalı yükə göndəriləcək faylın yolu, qovşaq planlaşdırıcı emulyasiya bayrağı, rəqəmsal dəyər kimi ötürülən məlumat növü.

  • Konfiqurasiya əldə edilir
    st := types.ParseConfig(*config)
  • Emu bayrağı keçərsə, başlayır sheduler
  • Əgər faylın yolunu göstərən f bayrağı verilirsə, biz onun məlumatlarını yükləyirik fdb və məzmun serverə göndərilir
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Fayl göstərilməyibsə, bayraqdakı məlumatlar sadəcə göndərilir -d:
    client.TCPConnect(st, []byte(*data), nil)

Bütün bunlar protokolun strukturunu göstərən sadələşdirilmiş təqdimatdır. İnkişaf zamanı onun strukturuna lazımi funksionallıq əlavə olunur.

İkinci hissədə bloklar və əməliyyatlar üçün məlumat strukturları haqqında, 3-də JavaScript-dən qoşulmaq üçün WebSocket serveri haqqında, 4-də sinxronizasiya planlaşdırıcısına, sonra giriş və çıxışlardan bayt kodu emal edən stek maşınına, kriptoqrafiyaya və çıxışlar üçün hovuzlar.

Mənbə: www.habr.com

Добавить комментарий