{"id":80122,"date":"2020-05-03T13:42:34","date_gmt":"2020-05-03T11:42:34","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go"},"modified":"2020-05-03T13:42:34","modified_gmt":"2020-05-03T11:42:34","slug":"kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","title":{"rendered":"Wie ich Bl\u00f6cke und Transaktionen in meiner Blockchain mit Go entworfen habe","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Um letztendlich eine Blockchain und nicht nur eine Datenbank zu erhalten, m\u00fcssen wir drei wichtige Elemente zu unserem Projekt hinzuf\u00fcgen: <\/p>\n<ul>\n<li> Beschreibung der Datenstruktur und Methoden des Blocks<\/li>\n<li> Beschreibung der Datenstruktur und Methoden der Transaktion<\/li>\n<li> Blockchain-Funktionen, die Bl\u00f6cke in der Datenbank speichern und sie dort anhand ihres Hashes oder ihrer H\u00f6he (oder auf andere Weise) finden.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Wie ich Bl\u00f6cke und Transaktionen in meiner Blockchain mit Go entworfen habe\" src=\"\/wp-content\/uploads\/2020\/05\/75099a735419b5c2bfbffa82865d1d4a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDies ist der zweite Artikel \u00fcber Blockchain f\u00fcr die Industrie, der erste <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499732\/\">hier<\/a><\/noindex>.<\/p>\n<p>Wenn ich an die Fragen zur\u00fcckdenke, die mir Leser zum vorherigen Artikel dieser Reihe gestellt haben, sollte erw\u00e4hnt werden: F\u00fcr die Speicherung von Blockchain-Daten wird in diesem Fall die LevelDB-Datenbank verwendet, aber es steht nichts im Wege, jede andere wie beispielsweise MySQL zu nutzen. Lassen Sie uns nun die Struktur dieser Daten untersuchen.<\/p>\n<p>Beginnen wir mit den Transaktionen: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Rusldv\/bcstartup\/blob\/master\/transaction\/builder.go\">github.com\/Rusldv\/bcstartup\/blob\/master\/transaction\/builder.go<\/a><\/noindex><\/p>\n<p>Hier ist ihre Datenstruktur:<\/p>\n<pre><code class=\"go\">type TX struct {\n\tDataType byte\t\t\n\tTxHash string \n\tTxType byte\t\n\tTimestamp int64\t\t\n\tINs []TxIn\n\tOUTs []TxOut\n}\n\ntype TxIn struct {\n\tThatTxHash string\n\tTxOutN int\n\tByteCode string\n}\n\ntype TxOut struct {\n\tValue int\n\tByteCode string\n}<\/code><\/pre>\n<p>\nIn TX werden die Datentypen (f\u00fcr Transaktion 2), der Hash dieser Transaktion, der Typ der Transaktion selbst, der Zeitstempel sowie Eingaben und Ausgaben gespeichert. Die Eingaben TxIn enthalten den Hash der Transaktion, auf deren Ausgabe verwiesen wird, die Nummer dieser Ausgabe und den Bytecode, w\u00e4hrend TxOut-Ausgaben Werte und ebenfalls Bytecode speichern.<\/p>\n<p>Schauen wir uns nun an, welche Aktionen eine Transaktion mit ihren Daten durchf\u00fchren kann, d.h. wir werden die Methoden betrachten.<\/p>\n<p>Die Funktion transaction.NewTransaction(txtype byte) *TX dient zur Erstellung einer Transaktion.<\/p>\n<p>Die Methode AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) f\u00fcgt einen Eingang zur Transaktion hinzu.<\/p>\n<p>Die Methode AddTxOut(value int, data []byte) (*TxOut, error) f\u00fcgt eine Ausgabe zur Transaktion hinzu.<\/p>\n<p>Die Methode ToBytes() []byte wandelt die Transaktion in ein Byte-Array um.<\/p>\n<p>Die interne Funktion preByteHash(bytes []byte) string wird in Build() und Check() verwendet, um die Kompatibilit\u00e4t des generierten Transaktionshashs mit Hashes zu gew\u00e4hrleisten, die aus JavaScript-Anwendungen generiert werden.<\/p>\n<p>Die Methode Build() setzt den Transaktionshash wie folgt: tx.TxHash = preByteHash(tx.ToBytes()).<\/p>\n<p>Die Methode ToJSON() string konvertiert die Transaktion in eine JSON-Zeichenkette.<\/p>\n<p>Die Methode FromJSON(data []byte) error l\u00e4dt die Transaktion im JSON-Format, das als Byte-Slice \u00fcbergeben wurde.<\/p>\n<p>Die Methode Check() bool vergleicht den erhaltenen Hash aus dem Transaktionshash-Feld mit dem Hash, der durch das Hashing dieser Transaktion (ohne das Hashfeld) erlangt wurde.<\/p>\n<p>Transaktionen werden in den Block hinzugef\u00fcgt: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Rusldv\/bcstartup\/blob\/master\/block\/builder.go\">github.com\/Rusldv\/bcstartup\/blob\/master\/block\/builder.go<\/a><\/noindex><\/p>\n<p>Die Datenstruktur des Blocks ist umfangreicher:<\/p>\n<pre><code class=\"go\">type Block struct {\n\tDataType byte\t\t\t\t\n\tBlockHeight int\t\t\t\t\t\n        Timestamp int64\t\t\t\t \n        HeaderSize int\t\t\t\t\t\n        PrevBlockHash string\t\t\t\t \n        SelfBlockHash string\t\t\t\n\tTxsHash string\t\t\t\n\tMerkleRoot string\n\tCreatorPublicKey string\t\t\t\n\tCreatorSig string\n\tVersion int\n\tTxsN int\n\tTxs []transaction.TX\n}<\/code><\/pre>\n<p>\nDataType speichert den Datentyp, anhand dessen der Knoten den Block von einer Transaktion oder anderen Daten unterscheidet. F\u00fcr einen Block hat dieser Wert den Wert 1.<\/p>\n<p>BlockHeight speichert die H\u00f6he des Blocks.<br \/>\nTimestamp ist der Zeitstempel.<br \/>\nHeaderSize ist die Gr\u00f6\u00dfe des Blocks in Byte.<br \/>\nPrevBlockHash ist der Hash des vorherigen Blocks, w\u00e4hrend SelfBlockHash der aktuelle ist.<br \/>\nTxsHash ist der Gesamt-Hash der Transaktionen.<br \/>\nMerkleRoot ist die Wurzel des Merkle-Baums.<\/p>\n<p>Dar\u00fcber hinaus befinden sich in den Feldern der \u00f6ffentliche Schl\u00fcssel des Blockerstellers, die Signatur des Erstellers, die Version des Blocks, die Anzahl der Transaktionen im Block und die Transaktionen selbst.<\/p>\n<p>Betrachten wir seine Methoden:<br \/>\nDie Funktion block.NewBlock() wird verwendet, um einen Block zu erstellen: NewBlock(prevBlockHash string, height int) *Block. Diese Funktion nimmt den Hash des vorherigen Blocks sowie die f\u00fcr den neuen Block im Blockchain festgelegte H\u00f6he entgegen. Au\u00dferdem wird der Blocktyp aus der Konstante des Pakets types festgelegt: <\/p>\n<pre><code class=\"go\">b.DataType = types.BLOCK_TYPE.<\/code><\/pre>\n<p>Die Methode AddTx(tx *transaction.TX) f\u00fcgt dem Block eine Transaktion hinzu.<\/p>\n<p>Die Methode Build() l\u00e4dt die Werte in die Blockfelder und generiert und setzt den aktuellen Hash.<\/p>\n<p>Die Methode ToBytesHeader() []byte konvertiert den Header des Blocks (ohne Transaktionen) in einen Byte-Slice.<\/p>\n<p>Die Methode ToJSON() string konvertiert den Block in das JSON-Format in einer string-basierten Datenrepr\u00e4sentation.<\/p>\n<p>Die Methode FromJSON(data []byte) error l\u00e4dt Daten aus JSON in die Blockstruktur.<\/p>\n<p>Die Methode Check() bool generiert den Hash des Blocks und vergleicht ihn mit dem im Hash-Feld des Blocks angegebenen Wert.<\/p>\n<p>Die Methode GetTxsHash() string gibt den Gesamthash aller Transaktionen im Block zur\u00fcck.<\/p>\n<p>Die Methode GetMerkleRoot() legt die Wurzel des Merkle-Baums f\u00fcr die Transaktionen im Block fest.<\/p>\n<p>Die Methode Sign(privk string) signiert den Block mit dem privaten Schl\u00fcssel des Erstellers.<\/p>\n<p>Die Methode SetHeight(height int) speichert die H\u00f6he des Blocks im entsprechenden Feld der Blockstruktur.<\/p>\n<p>Die Methode GetHeight() int gibt die H\u00f6he des Blocks zur\u00fcck, wie im entsprechenden Feld der Blockstruktur angegeben.<\/p>\n<p>Die Methode ToGOBBytes() []byte kodiert einen Block im GOB-Format und gibt ihn als Byte-Slice zur\u00fcck.<\/p>\n<p>Die Methode FromGOBBytes(data []byte) error schreibt die Daten des Blocks aus dem \u00fcbergebenen Byte-Slice im GOB-Format in die Blockstruktur.<\/p>\n<p>Die Methode GetHash() string gibt den Hash dieses Blocks zur\u00fcck.<\/p>\n<p>Die Methode GetPrevHash() string gibt den Hash des vorherigen Blocks zur\u00fcck.<\/p>\n<p>Die Methode SetPublicKey(pubk string) speichert den \u00f6ffentlichen Schl\u00fcssel des Blockerstellers im Block.<\/p>\n<p>Somit k\u00f6nnen wir mit Hilfe der Methoden des Objekts Block diesen leicht in ein Format konvertieren, das f\u00fcr die \u00dcbertragung \u00fcber das Netzwerk und die Speicherung in der LevelDB geeignet ist.<\/p>\n<p>F\u00fcr die Speicherung in der Blockchain sind die Funktionen des Pakets blockchain verantwortlich: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Rusldv\/bcstartup\/tree\/master\/blockchain\">github.com\/Rusldv\/bcstartup\/tree\/master\/blockchain<\/a><\/noindex><\/p>\n<p>Daf\u00fcr muss der Block das Interface IBlock implementieren:<\/p>\n<pre><code class=\"go\">type IGOBBytes interface {\n\tToGOBBytes() []byte\n\tFromGOBBytes(data []byte) error\n}\n\ntype IBlock interface {\n\tIGOBBytes\n\tGetHash() string\n\tGetPrevHash() string\n\tGetHeight() int\n\tCheck() bool\n\n}<\/code><\/pre>\n<p>\nDie Verbindung zur Datenbank wird einmalig bei der Initialisierung des Pakets in der Funktion init() hergestellt: <\/p>\n<pre><code class=\"go\">db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).<\/code><\/pre>\n<p>\nCloseDB() ist ein Wrapper f\u00fcr db.Close() \u2013 wird nach der Verwendung der Funktionen des Pakets aufgerufen, um die Verbindung zur DB zu schlie\u00dfen.<\/p>\n<p>Die Funktion SetTargetBlockHash(hash string) error schreibt den Hash des aktuellen Blocks mit dem Schl\u00fcssel, der durch die Konstante BLOCK_HASH festgelegt ist, in die DB.<\/p>\n<p>Die Funktion GetTargetBlockHash() (string, error) gibt den Hash des aktuellen Blocks zur\u00fcck, der in der Datenbank gespeichert ist.<\/p>\n<p>Die Funktion SetTargetBlockHeight(height int) error schreibt den Wert der Blockh\u00f6he f\u00fcr den Knoten mit dem Schl\u00fcssel, der durch die Konstante BLOCK_HEIGHT definiert ist, in die Datenbank.<\/p>\n<p>Die Funktion GetTargetBlockHeight() (int, error) gibt die Blockh\u00f6he f\u00fcr diesen Knoten zur\u00fcck, die in der Datenbank gespeichert ist.<\/p>\n<p>Die Funktion CheckBlock(block IBlock) bool \u00fcberpr\u00fcft die Korrektheit des Blocks, bevor dieser Block in die Blockchain eingef\u00fcgt wird.<\/p>\n<p>Die Funktion AddBlock(block IBlock) error f\u00fcgt einen Block zur Blockchain hinzu.<\/p>\n<p>Funktionen zum Abrufen und Anzeigen von Bl\u00f6cken befinden sich in der Datei explore.go des Pakets blockchain:<\/p>\n<p>Die Funktion GetBlockByHash(hash string) (*block.Block, error) erstellt ein leeres Blockobjekt, l\u00e4dt den Block mit dem \u00fcbergebenen Hash aus der Datenbank und gibt einen Verweis darauf zur\u00fcck.<\/p>\n<p>Die Erstellung des Genesis-Blocks erfolgt durch die Funktion Genesis() error aus der Datei genesis.go des Pakets blockchain.<\/p>\n<p>Im n\u00e4chsten Artikel wird die Verbindung von Clients zur Node \u00fcber den WebSocket-Mechanismus behandelt.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499930\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u044f\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 3 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043b\u043e\u043a\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0414 \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0438\u0445 \u0442\u0430\u043c \u043f\u043e \u0438\u0445 \u0445\u0435\u0448\u0443 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0435 (\u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c). \u042d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80123,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80122","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u044f\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 3 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043b\u043e\u043a\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0414 \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0438\u0445 \u0442\u0430\u043c \u043f\u043e \u0438\u0445 \u0445\u0435\u0448\u0443 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0435 (\u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c). \u042d\u0442\u043e\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u043b\u043e\u043a\u0438 \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435 \u043d\u0430 Go | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u044f\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 3 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043b\u043e\u043a\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0414 \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0438\u0445 \u0442\u0430\u043c \u043f\u043e \u0438\u0445 \u0445\u0435\u0448\u0443 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0435 (\u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c). \u042d\u0442\u043e\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 So habe ich Bl\u00f6cke und Transaktionen in meiner Blockchain mit Go entworfen | ProHoster","description":"Um letztendlich eine Blockchain und nicht nur eine Datenbank zu erhalten, m\u00fcssen wir drei wichtige Elemente in unser Projekt integrieren: die Beschreibung der Datenstruktur und der Blockmethoden, die Beschreibung der Datenstruktur und der Transaktionsmethoden sowie die Blockchain-Funktionen, die Bl\u00f6cke in der Datenbank speichern und sie dort anhand ihres Hashes oder ihrer H\u00f6he (oder auf andere Weise) finden. Das ist.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u043b\u043e\u043a\u0438 \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435 \u043d\u0430 Go | ProHoster","og:description":"\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u044f\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 3 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043b\u043e\u043a\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0414 \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u0438\u0445 \u0442\u0430\u043c \u043f\u043e \u0438\u0445 \u0445\u0435\u0448\u0443 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0435 (\u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c). \u042d\u0442\u043e","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-03T11:42:34+00:00","article:modified_time":"2020-05-03T11:42:34+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80122","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:23:29","updated":"2022-09-30 17:12:23"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/80122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=80122"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/80122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/80123"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=80122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=80122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=80122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}