Blockchain Entwécklung fir Industrie mat Go. Deel 1

Zënter véier Méint hunn ech un engem Projet geschafft mam Numm "Entwécklung vum Dateschutz a Gestiounsinstrumenter a Regierungs- an Industriesecteuren baséiert op Blockchain."
Elo wéilt ech Iech soen wéi ech dëse Projet ugefaang hunn, an elo wÀert ech de Programmcode am Detail beschreiwen.

Blockchain Entwécklung fir Industrie mat Go. Deel 1

Dëst ass den éischten Artikel an enger Serie vun Artikelen. Hei beschreiwen ech de Server a Protokoll. TatsÀchlech kann de Lieser souguer seng eege Versioune vun dëse Blockchain Elementer schreiwen.

An hei ass den zweeten Deel - iwwer Blockchain an Transaktiounsdatenstrukturen, wéi och iwwer de Package deen Interaktioun mat der Datebank implementéiert.

D'lescht Joer, um Digital Breakthrough Hackathon, si si mat enger Iddi komm fir en nëtzlechen System fir d'Industrie an d'Digital Wirtschaft mat Hëllef vun verdeelt Ledger Technologie ze maachen; e Subventioun gouf och fir d'Entwécklung vum Innovation Assistance Fund ausgestallt (ech soll eng separat schreiwen Artikel iwwer de Subventioun, fir déi, déi just ufÀnken Startups ze maachen), an elo an Uerdnung.

Entwécklung fënnt an der Go Sprooch statt, an d'Datebank an dÀr d'Blöcke gespÀichert sinn ass LevelDB.
D'Haaptdeeler sinn de Protokoll, de Server (deen TCP a WebSocket leeft - déi éischt fir d'Blockchain ze synchroniséieren, déi zweet fir Clienten ze verbannen, Transaktiounen a Kommandoen aus JavaScript ze schécken, zum Beispill.

WĂ©i scho gesot, ass dĂ«se Blockchain haaptsĂ€chlech gebraucht fir den Austausch vu Produkter tĂ«scht Liwweranten a Clienten ze automatisĂ©ieren an ze schĂŒtzen, oder bĂ©id an enger Persoun. DĂ«s Leit sinn net pressĂ©iert gĂ©igesĂ€iteg ze trauen. Awer d'Aufgab ass net nĂ«mmen e "Checkbook" mat engem agebaute Rechner ze kreĂ©ieren, mee e System deen dĂ©i meescht vun de Routine Aufgaben automatisĂ©iert, dĂ©i entstinn wann Dir mam Produktliewenszyklus schafft. De Bytecode, dee fir dĂ«s MatiĂšre verantwortlech ass, wĂ©i et ĂŒblech ass mat Blockchainen, gĂ«tt an den Inputen an AusgĂ€nge vun Transaktiounen gespĂ€ichert (d'Transaktioune selwer ginn a Blocken gespĂ€ichert, d'Blöcke am LevelDB sinn am GOB-Format virkodĂ©iert). Als Ă©ischt schwĂ€tze mer iwwer de Protokoll an de Server (alias Node).

De Protokoll ass net komplizĂ©iert, sĂ€i ganze Punkt ass op de Modus ze wiesselen fir e puer Daten ze lueden, normalerweis e Block oder Transaktioun, als Äntwert op eng speziell Kommandozeil, an et ass och nĂ©ideg fir Inventar auszetauschen, sou datt den Node weess wien et ass ass ugeschloss a wĂ©i se GeschĂ€fter hunn ze maachen (d'Noden, dĂ©i fir d'SynchronisĂ©ierungssitzung verbonne sinn, ginn och "Nopesch" genannt, well hir IP bekannt ass an hir Staatsdaten an der ErĂ«nnerung gespĂ€ichert sinn).

Ordner (Verzeichnisser, wéi se genannt ginn) Linux) ginn an der Go-Sprooch Pakete genannt, dofir schreiwen se um Ufank vun all Datei mat Go-Code an dësem Verzeichnis package [folder_name_where_this_file_is]. Soss kënne se de Pak net un de Compiler weiderginn. Dat ass kee Geheimnis fir déi, déi d'Sprooch kennen. Hei sinn dës Pakete:

  • Netzwierk Kommunikatioun (Server, Client, Protokoll)
  • Strukture vu gespĂ€icherten an iwwerdroenen DonnĂ©eĂ«n (Block, Transaktioun)
  • Datebank (Blockchain)
  • Konsens
  • Gestapelt virtuell Maschinn (xvm)
  • Auxiliary (Krypto, Typen) dat ass alles fir de Moment.

Hei ass de Link op github

Dëst ass eng pÀdagogesch Versioun, et feelt Inter-Prozess Interaktioun a verschidde experimentell Komponenten, awer d'Struktur entsprécht deem op deem d'Entwécklung duerchgefouert gëtt. Wann Dir eppes an de Kommentaren ze proposéieren hutt, wÀert ech frou et an der Weiderentwécklung Rechnung ze huelen. An elo fir eng ErklÀrung vum Server an Protokoll.

Loosst eis als éischt de Server kucken.

D'Server Subroutine wierkt als Dateserver deen uewen um TCP Protokoll leeft mat Datenstrukturen aus dem Protokollpaket.

D'Routine benotzt déi folgend Packagen: Server, Protokoll, Zorte. Am Package selwer tcp_server.go enthÀlt Daten Struktur Serve.

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

Et kann déi folgend Parameteren akzeptéieren:

  • Netzwierkport duerch deen Daten austauscht ginn
  • Server Konfiguratiounsdatei am JSON Format
  • FĂ€ndel fir am Debug Modus ze lafen (private Blockchain)

Fortschrëtt:

  • Liest d'Konfiguratioun vun der JSON Datei
  • Den Debug Modus FĂ€ndel gĂ«tt iwwerprĂ©ift: wann et agestallt ass, gĂ«tt den Netzwierk SynchronisĂ©ierung Scheduler net gestart an de Blockchain ass net gelueden
  • D'InitialisĂ©ierung vun der Konfiguratiounsdatenstruktur an de Server starten

Server

  • FĂ©iert de Start vum TCP Server an Netzwierk Interaktioun am Aklang mam Protokoll.
  • Et huet eng Serve-Datenstruktur besteet aus enger Portnummer, enger PuffergrĂ©isst an engem Zeiger op d'Struktur Zorte.Astellungen
  • D'Run-Methode fĂ€nkt d'Netzwierkinteraktioun un (lauschtert no erakommende Verbindungen op engem bestĂ«mmten Hafen, wann eng nei Verbindung kritt gĂ«tt, gĂ«tt seng Veraarbechtung op d'private Handle-Methode an engem neie Fuedem transferĂ©iert)
  • В packen Daten aus der Verbindung ginn an e Puffer gelies, an eng Stringrepresentatioun Ă«mgewandelt a weidergeleet Protokoll.Wiel
  • Protokoll.Wiel geet zrĂ©ck Resultat oder verursaacht e Feeler. Resultat dann iwwerdroen ze Protokoll.InterpretĂ©ierendĂ©i zrĂ©ck intrpr - Objet vun Typ InterpretData, oder verursaacht e Feeler beim Veraarbechtung vum Selektiounsresultat
  • Da gĂ«tt de Schalter ausgefouert intrpr.Commands[0] dĂ©i kontrollĂ©iert ee vun: Resultat, inv, Feeler an et gĂ«tt eng Rubrik StandarddrĂ©cker
  • An der Rubrik Resultat Schalter gĂ«tt duerch WĂ€ert fonnt intrpr.Commands[1] dĂ©i d'WĂ€erter iwwerprĂ©ift BufferlĂ€ngt Đž Versioun (an all Fall gĂ«tt dĂ©i entspriechend Funktioun genannt)

Functions GetVersion Đž Buffer LĂ€ngt sinn am Dossier srvlib.go Server Package

GetVersion(conn net.Conn, version string)

et dréckt einfach op d'Konsole a schéckt d'Versioun, déi am Parameter un de Client passéiert ass:

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

.
Funktioun

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

lued e Block, Transaktioun oder aner spezifesch Donnéeën wéi follegt:

  • DrĂ©ckt op d'Konsole d'Zort vun Daten, dĂ©i am Protokoll spezifizĂ©iert sinn, dĂ©i akzeptĂ©iert musse ginn:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Liest de WĂ€ert intrpr.Kierper zu enger numerescher Variabel buff_len
  • Erstellt e Puffer neibuf spezifizĂ©iert GrĂ©isst:
    make([]byte, buf_len)
  • SchĂ©ckt eng ok Äntwert:
    conn.Write([]byte("result:ok"))
  • FĂ«llt de Puffer komplett aus dem Liesstream:
    io.ReadFull(conn, newbuf)

    .

  • DrĂ©ckt den Inhalt vum Puffer op d'Konsole
    fmt.Println(string(newbuf))

    an d'Zuel vun Bytes liesen

    fmt.Println("Bytes length:", n)
  • SchĂ©ckt eng ok Äntwert:
    conn.Write([]byte("result:ok"))

Methoden aus dem Server Package sinn konfiguréiert fir kritt Daten ze veraarbecht mat Funktiounen aus dem Package Protokoll.

Protokoll

E Protokoll déngt als Mëttel dat Daten am Netzaustausch duerstellt.

Wiel (Str string) (String, Feeler) mécht primÀr Veraarbechtung vun Daten, déi vum Server kritt ginn, kritt eng String Representatioun vun den Daten als Input a bréngt e String zréck Dolmetscher:

  • D'Input String ass opgedeelt a Kapp a Kierper benotzt ReqParseN2(str)
  • De Kapp gĂ«tt an Elementer opgedeelt an an e Kommando Slice gesat mat ReqParseHead (Kapp)
  • В schalt (Commande[0]) wielt de kritt Kommando (cmd, SchlĂ«ssel, Adress oder d'Sektioun gĂ«tt ausgelĂ©ist StandarddrĂ©cker)
  • 2 Kommandoen ginn am cmd geprĂ©ift schalt (Kommando[1]) - LĂ€ngt Đž getversion.
  • LĂ€ngt kontrollĂ©iert d'Datentyp Kommandoen [2] a rett et an Datatyp
  • Schecken dat Kierper enthĂ€lt e StringwĂ€ert
    len(body) < 1
  • Gitt d'Äntwert String zrĂ©ck:
    "result:bufferlength:" + datatype + "/" + body
  • getversion gĂ«tt eng String zrĂ©ck
    return "result:version/auto"

Dolmetscher

EnthÀlt d'InterpreteData Struktur a mécht sekundÀr Veraarbechtung vun den Donnéeën aus presentéiert Saiten an Objet Formatioun InterpretData.

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

Funktioun

Interprete(str string) (*InterpreteData, error)

akzeptéiert eng String Resultat a schafft a gëtt eng Referenz op den Objet zréck InterpretData.

Fortschrëtt:

  • Ähnlech presentĂ©iert Kapp a Kierper ginn extrahĂ©iert benotzt ReqParseN2(str)
  • Kapp gĂ«tt an Elementer opgedeelt benotzt ReqParseHead (Kapp)
  • Den Objet gĂ«tt initialisĂ©iert InterpretData an en Zeigefanger drop gĂ«tt zrĂ©ckginn:

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

Dësen Objet gëtt benotzt an server.goen Package HaaptsÀit.

Client

De Client Package enthÀlt d'Funktiounen TCPConnect О TCPResponseData.

Funktioun

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

funktionnéiert sou:

  • Eng Verbindung gĂ«tt mat der Verbindung gemaach, dĂ©i am passĂ©ierten Astellungsobjekt spezifizĂ©iert ass
    net.Dial("tcp", s.Host + ":" + s.Port)
  • D'Daten, dĂ©i am Dateparameter passĂ©iert sinn, ginn iwwerdroen:
    conn.Write(data)
  • D'Äntwert ass gelies
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    an op der Konsol gedréckt

    fmt.Println(string(resp[:n]))
  • Wann iwwerdroen Notzlaascht da gitt et weider
    conn.Write(payload)

    a liest och d'Serverreaktioun, dréckt se op d'Konsole

Funktioun

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

schaaft e Puffer vun der spezifizéierter Gréisst, liest d'Serverreaktioun do a gëtt dëse Puffer zréck an d'Zuel vun de Bytes gelies, souwéi e Feelerobjekt.

Client Subroutine

Déngt fir Kommandoen op Node Server ze schécken, souwéi kuerz Statistiken an Tester ze kréien.

Kann déi folgend Parameteren akzeptéieren: Konfiguratiounsdatei am JSON-Format, Donnéeën, déi op de Server als String geschéckt ginn, Wee fir d'Datei, déi op d'Notzlaascht geschéckt gëtt, Node Scheduler Emulatiounsflagg, Typ vun Daten, déi als numeresche WÀert transferéiert ginn.

  • KrĂ©ien d'Konfiguratioun
    st := types.ParseConfig(*config)
  • Wann den Emu FĂ€ndel passĂ©iert ass, fĂ€nkt et un sheduler
  • Wann de f FĂ€ndel, deen de Wee op d'Datei weist, geliwwert gĂ«tt, da luede mir seng DonnĂ©eĂ«n an fdb an den Inhalt gĂ«tt op de Server geschĂ©ckt
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Wann d'Datei net spezifizĂ©iert ass, da ginn d'DonnĂ©eĂ« vum FĂ€ndel einfach geschĂ©ckt -d:
    client.TCPConnect(st, []byte(*data), nil)

All dĂ«st ass eng vereinfacht Representatioun dĂ©i d'Struktur vum Protokoll weist. WĂ€rend der EntwĂ©cklung gĂ«tt dĂ©i nĂ©ideg FunktionalitĂ©it zu senger Struktur bĂ€igefĂŒĂŒgt.

Am zweeten Deel wÀert ech iwwer Datestrukture fir Blocken an Transaktiounen schwÀtzen, am 3 iwwer de WebSocket Server fir d'Verbindung vu JavaScript, am 4 wÀert ech de Synchroniséierungsplang kucken, dann eng Stackmaschinn déi Bytecode vun Input an Output veraarbecht, Kryptografie an Pools fir AusgÀnge.

Source: will.com

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster