{"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 in unser Projekt hinzuf\u00fcgen: <\/p>\n<ul>\n<li> Beschreibung der Datenstruktur und der Methoden des Blocks<\/li>\n<li> Beschreibung der Datenstruktur und der Methoden der Transaktion<\/li>\n<li> Die Funktionen der Blockchain, die Bl\u00f6cke in der Datenbank speichern und diese 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 denke, die mir von Lesern zu dem vorherigen Artikel dieser Reihe gestellt wurden, sollte ich erw\u00e4hnen: F\u00fcr die Speicherung der Blockchain-Daten wird in diesem Fall die LevelDB-Datenbank verwendet, aber nichts hindert daran, eine andere zu verwenden, sagen wir MySQL. Lassen Sie uns jetzt die Struktur dieser Daten untersuchen.<\/p>\n<p>Lassen Sie uns mit den Transaktionen beginnen: <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 der Datentyp (f\u00fcr Transaktion 2), der Hash dieser Transaktion, der Typ der Transaktion, der Zeitstempel sowie die Eingaben und Ausgaben gespeichert. Die Eingaben TxIn speichern den Hash der Transaktion, auf die verwiesen wird, die Nummer dieser Ausgabe und den Bytecode, w\u00e4hrend die Ausgaben TxOut einen bestimmten Wert und ebenfalls Bytecode speichern.<\/p>\n<p>Lassen Sie uns nun ansehen, welche Aktionen eine Transaktion mit ihren Daten durchf\u00fchren kann, das hei\u00dft, lassen Sie uns die Methoden untersuchen.<\/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 der Transaktion einen Eingang hinzu.<\/p>\n<p>Die Methode AddTxOut(value int, data []byte) (*TxOut, error) f\u00fcgt der Transaktion einen Ausgang hinzu.<\/p>\n<p>Die Methode ToBytes() []byte verwandelt die Transaktion in einen Byte-Slice.<\/p>\n<p>Die interne Funktion preByteHash(bytes []byte) string wird in Build() und Check() verwendet, um die erstellte Hash der Transaktionen mit den Hashes der Transaktionen, die von JavaScript-Anwendungen generiert werden, kompatibel zu machen.<\/p>\n<p>Die Methode Build() legt den Hash der Transaktion wie folgt fest: tx.TxHash = preByteHash(tx.ToBytes()).<\/p>\n<p>Die Methode ToJSON() string wandelt die Transaktion in einen JSON-String um.<\/p>\n<p>Die Methode FromJSON(data []byte) error l\u00e4dt die Transaktion aus dem JSON-Format, das als Byte-Slice \u00fcbergeben wird.<\/p>\n<p>Die Methode Check() bool vergleicht den erhaltenen Hash aus dem Feld des Transaktionshashes mit dem Hash, der durch Hashing dieser Transaktion (ohne Ber\u00fccksichtigung des Hashfeldes) erhalten 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 den 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 Bytes.<br \/>\nPrevBlockHash ist der Hash des vorherigen Blocks, und SelfBlockHash ist der aktuelle Hash.<br \/>\nTxsHash ist der Gesamt-Hash der Transaktionen.<br \/>\nMerkleRoot ist die Wurzel des Merkle-Baums.<\/p>\n<p>Im Folgenden befinden sich die \u00f6ffentlichen Schl\u00fcssel des Blockerstellers, die Signatur des Erstellers, die Blockversion, die Anzahl der Transaktionen im Block und diese Transaktionen selbst.<\/p>\n<p>Lassen Sie uns seine Methoden betrachten:<br \/>\nZur Erstellung eines Blocks wird die Funktion block.NewBlock() verwendet: NewBlock(prevBlockHash string, height int) *Block, die den Hash des vorherigen Blocks und die H\u00f6he, die f\u00fcr den zu erstellenden Block in der Blockchain festgelegt ist, entgegennimmt. Zudem 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 eine Transaktion in den Block ein.<\/p>\n<p>Die Methode Build() l\u00e4dt Werte in die Felder des Blocks und generiert und setzt seinen aktuellen Hash.<\/p>\n<p>Die Methode ToBytesHeader() []byte konvertiert den Blockheader (ohne Transaktionen) in einen Byte-Slice.<\/p>\n<p>Die Methode ToJSON() string konvertiert den Block in das JSON-Format im String-Datenformat.<\/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 Blockhash-Feld angegebenen.<\/p>\n<p>Die Methode GetTxsHash() string gibt den Gesamt-Hash aller Transaktionen im Block zur\u00fcck.<\/p>\n<p>Die Methode GetMerkleRoot() setzt die Wurzel des Merkle-Baums f\u00fcr die Transaktionen im Block.<\/p>\n<p>Die Methode Sign(privk string) signiert den Block mit dem privaten Schl\u00fcssel des Blockerstellers.<\/p>\n<p>Die Methode SetHeight(height int) speichert die H\u00f6he des Blocks im Feld der Blockstruktur.<\/p>\n<p>Die Methode GetHeight() int gibt die H\u00f6he des Blocks zur\u00fcck, wie sie im entsprechenden Feld der Blockstruktur angegeben ist.<\/p>\n<p>Die Methode ToGOBBytes() []byte kodiert den Block im GOB-Format und gibt ihn als Byte-Slice zur\u00fcck.<\/p>\n<p>Die Methode FromGOBBytes(data []byte) error schreibt die Blockdaten in die Blockstruktur aus dem \u00fcbergebenen Byte-Slice im GOB-Format.<\/p>\n<p>Die Methode GetHash() string gibt den Hash des aktuellen 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>Durch die Methoden des Block-Objekts k\u00f6nnen wir es also problemlos in ein Netzwerk\u00fcbertragungsformat und zur Speicherung in einer LevelDB-Datenbank konvertieren.<\/p>\n<p>F\u00fcr die Speicherung in der Blockchain sind die Funktionen des Blockchain-Pakets 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 beim Initialisieren 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 eine Wrapper-Funktion f\u00fcr db.Close() \u2014 sie wird nach der Arbeit mit den 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 in die DB mit dem durch die Konstante BLOCK_HASH festgelegten Schl\u00fcssel.<\/p>\n<p>Die Funktion GetTargetBlockHash() (string, error) gibt den Hash des aktuellen Blocks zur\u00fcck, der in der DB gespeichert ist.<\/p>\n<p>Die Funktion SetTargetBlockHeight(height int) error schreibt den Wert der H\u00f6he der Blockchain f\u00fcr den Knoten in die DB mit dem durch die Konstante BLOCK_HEIGHT festgelegten Schl\u00fcssel.<\/p>\n<p>Die Funktion GetTargetBlockHeight() (int, error) gibt die H\u00f6he der Blockchain f\u00fcr diesen Knoten zur\u00fcck, die in der DB gespeichert ist.<\/p>\n<p>Die Funktion CheckBlock(block IBlock) bool \u00fcberpr\u00fcft die Korrektheit des Blocks, bevor dieser zur Blockchain hinzugef\u00fcgt wird.<\/p>\n<p>Die Funktion AddBlock(block IBlock) error f\u00fcgt einen Block zur Blockchain hinzu.<\/p>\n<p>Die Funktionen zum Abrufen und Anzeigen von Bl\u00f6cken befinden sich in der Datei explore.go des Blockchain-Pakets:<\/p>\n<p>Die Funktion GetBlockByHash(hash string) (*block.Block, error) erstellt ein leeres Blockobjekt, l\u00e4dt den Block mit dem angegebenen Hash aus der DB und gibt einen Zeiger darauf zur\u00fcck.<\/p>\n<p>Die Erstellung des Genesis-Blocks erfolgt in der Funktion Genesis() error in der Datei genesis.go des Blockchain-Pakets.<\/p>\n<p>Im n\u00e4chsten Artikel geht es um die Verbindung zu Client-Knoten mittels des WebSocket-Mechanismus.<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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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\udd47Wie ich Bl\u00f6cke und Transaktionen in meiner Blockchain mit Go gestaltet habe | ProHoster","description":"Um letztlich 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 Methoden des Blocks.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}