{"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\/sv\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","title":{"rendered":"Hur jag designade block och transaktioner i min blockchain p\u00e5 Go","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>F\u00f6r att i slut\u00e4ndan f\u00e5 en blockchain, och inte bara en databas, beh\u00f6ver vi l\u00e4gga till tre viktiga element i v\u00e5rt projekt: <\/p>\n<ul>\n<li> Beskrivning av dataskstrukturen och metoderna f\u00f6r blocket<\/li>\n<li> Beskrivning av dataskstrukturen och metoderna f\u00f6r transaktionen<\/li>\n<li> Blockchain-funktioner som sparar block i databasen och hittar dem d\u00e4r efter deras hash eller h\u00f6jd (eller p\u00e5 n\u00e5got annat s\u00e4tt).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Hur jag designade block och transaktioner i min blockchain p\u00e5 Go\" 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 \/>\nDetta \u00e4r den andra artikeln om blockchain f\u00f6r industrin; den f\u00f6rsta <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499732\/\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex>.<\/p>\n<p>N\u00e4r jag minns de fr\u00e5gor som mina l\u00e4sare st\u00e4llde efter den f\u00f6reg\u00e5ende artikeln i denna serie, b\u00f6r det noteras: f\u00f6r lagring av blockchain-data anv\u00e4nds i detta fall databasen LevelDB, men ingenting hindrar oss fr\u00e5n att anv\u00e4nda vilken annan som helst, till exempel MySQL. Nu ska vi ta en titt p\u00e5 strukturen f\u00f6r dessa data.<\/p>\n<p>L\u00e5t oss b\u00f6rja med transaktionerna: <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>H\u00e4r \u00e4r dess dataskstrukur:<\/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>\nI TX lagras datatypen (f\u00f6r transaktionen 2), hash f\u00f6r denna transaktion, typen av sj\u00e4lva transaktionen, tidsst\u00e4mpeln samt ing\u00e5ngar och utg\u00e5ngar. Ing\u00e5ngarna TxIn sparar hash f\u00f6r transaktionen som deras utg\u00e5ng refererar till, numret p\u00e5 denna utg\u00e5ng och bytekoden, medan utg\u00e5ngarna TxOut lagrar ett v\u00e4rde och ocks\u00e5 bytekoden.<\/p>\n<p>Nu ska vi se vilka \u00e5tg\u00e4rder transaktionen kan utf\u00f6ra med sina data, det vill s\u00e4ga vi kommer att g\u00e5 igenom metoderna.<\/p>\n<p>F\u00f6r att skapa en transaktion anv\u00e4nds funktionen transaction.NewTransaction(txtype byte) *TX.<\/p>\n<p>Metoden AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) l\u00e4gger till en ing\u00e5ng till transaktionen.<\/p>\n<p>Metoden AddTxOut(value int, data []byte) (*TxOut, error) l\u00e4gger till en utg\u00e5ng till transaktionen.<\/p>\n<p>Metoden ToBytes() []byte omvandlar transaktionen till en byte-array.<\/p>\n<p>Den interna funktionen preByteHash(bytes []byte) string anv\u00e4nds i Build() och Check() f\u00f6r att s\u00e4kerst\u00e4lla att den skapade hash:en av transaktionerna \u00e4r kompatibel med hash:ar som genereras fr\u00e5n applikationer i JavaScript.<\/p>\n<p>Metoden Build() st\u00e4ller in hash f\u00f6r transaktionen p\u00e5 f\u00f6ljande s\u00e4tt: tx.TxHash = preByteHash(tx.ToBytes()).<\/p>\n<p>Metoden ToJSON() string omvandlar transaktionen till en JSON-str\u00e4ng.<\/p>\n<p>Metoden FromJSON(data []byte) error laddar transaktionen fr\u00e5n JSON-formatet som \u00f6verf\u00f6rts som en byte-array.<\/p>\n<p>Metoden Check() bool j\u00e4mf\u00f6r den erh\u00e5llna hash av f\u00e4ltet i transaktionens hash med den hash som erh\u00e5llits genom hashning av denna transaktion (utan att ta h\u00e4nsyn till hashf\u00e4ltet).<\/p>\n<p>Transaktioner l\u00e4ggs till blocket: <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>Dataskstrukturen f\u00f6r blocket \u00e4r mer omfattande:<\/p>\n<pre><code class=\"go\">typ 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 lagrar datatypen, enligt vilken noden avg\u00f6r blocket fr\u00e5n transaktionen eller andra data. F\u00f6r block \u00e4r detta v\u00e4rde 1.<\/p>\n<p>BlockHeight lagrar blockets h\u00f6jd.<br \/>\nTimestamp \u00e4r tidsst\u00e4mpeln.<br \/>\nHeaderSize \u00e4r blockets storlek i byte.<br \/>\nPrevBlockHash \u00e4r hash av f\u00f6reg\u00e5ende block, medan SelfBlockHash \u00e4r det aktuella.<br \/>\nTxsHash \u00e4r den totala hash av transaktionerna.<br \/>\nMerkleRoot \u00e4r roten i Merkle-tr\u00e4det.<\/p>\n<p>N\u00e4st i f\u00e4lten finns den offentliga nyckeln f\u00f6r blockskaparen, signaturen fr\u00e5n skaparen, blockets version, antal transaktioner i blocket och faktiskt dessa transaktioner.<\/p>\n<p>L\u00e5t oss titta p\u00e5 dess metoder:<br \/>\nF\u00f6r att skapa ett block anv\u00e4nds funktionen block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, som tar hash av f\u00f6reg\u00e5ende block och h\u00f6jden inst\u00e4lld f\u00f6r det nyskapade blocket i blockkedjan. Typen av blocket anges fr\u00e5n konstanten i paketet types: <\/p>\n<pre><code class=\"go\">b.DataType = types.BLOCK_TYPE.<\/code><\/pre>\n<p>Metoden AddTx(tx *transaction.TX) l\u00e4gger till en transaktion i blocket.<\/p>\n<p>Metoden Build() laddar v\u00e4rden i blockets f\u00e4lt och genererar och st\u00e4ller in dess aktuella hash.<\/p>\n<p>Metoden ToBytesHeader() []byte konverterar blockets rubrik (utan transaktioner) till en byte-slice.<\/p>\n<p>Metoden ToJSON() string konverterar blocket till JSON-format i str\u00e4ngrepresentation.<\/p>\n<p>Metoden FromJSON(data []byte) error laddar data fr\u00e5n JSON till blockstrukturen.<\/p>\n<p>Metoden Check() bool genererar blockets hash och j\u00e4mf\u00f6r med den angivna i blockets hash-f\u00e4lt.<\/p>\n<p>Metoden GetTxsHash() string returnerar den totala hash av alla transaktioner i blocket.<\/p>\n<p>Metoden GetMerkleRoot() s\u00e4tter roten i Merkle-tr\u00e4det f\u00f6r transaktionerna i blocket.<\/p>\n<p>Metoden Sign(privk string) signerar blocket med blockskaparen nyckel.<\/p>\n<p>Metoden SetHeight(height int) skriver blockets h\u00f6jd i blockstrukturens f\u00e4lt.<\/p>\n<p>Metoden GetHeight() int returnerar blockets h\u00f6jd enligt det angivna f\u00e4ltet i blockstrukturen.<\/p>\n<p>Metoden ToGOBBytes() []byte kodar blocket i GOB-format och returnerar det som en byte-slice.<\/p>\n<p>Metoden FromGOBBytes(data []byte) error skriver blockets data i blockstrukturen fr\u00e5n den angivna byte-slicen i GOB-format.<\/p>\n<p>Metoden GetHash() string returnerar hash av detta block.<\/p>\n<p>Metoden GetPrevHash() string returnerar hash av f\u00f6reg\u00e5ende block.<\/p>\n<p>Metoden SetPublicKey(pubk string) skriver den offentliga nyckeln f\u00f6r blockskaparen i blocket.<\/p>\n<p>Genom metoderna f\u00f6r Block-objektet kan vi enkelt konvertera det till ett format f\u00f6r \u00f6verf\u00f6ring \u00f6ver n\u00e4tverket och lagring i LevelDB.<\/p>\n<p>Funktionerna i paketet blockchain ansvarar f\u00f6r lagring i blockkedjan: <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>F\u00f6r detta m\u00e5ste blocket implementera gr\u00e4nssnittet IBlock:<\/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>\nAnslutningen till databasen skapas en g\u00e5ng vid initialisering av paketet i funktionen init(): <\/p>\n<pre><code class=\"go\">db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).<\/code><\/pre>\n<p>\nCloseDB() \u00e4r en omslagsfunktion f\u00f6r db.Close() \u2014 anropas efter att ha arbetat med funktionerna i paketet f\u00f6r att st\u00e4nga kopplingen till databasen.<\/p>\n<p>Funktionen SetTargetBlockHash(hash string) error skriver hash f\u00f6r det aktuella blocket i databasen med nyckeln definierad av konstanten BLOCK_HASH.<\/p>\n<p>Funktionen GetTargetBlockHash() (string, error) returnerar hash f\u00f6r det aktuella blocket som lagras i databasen.<\/p>\n<p>Funktionen SetTargetBlockHeight(height int) error skriver v\u00e4rdet f\u00f6r blockkedjans h\u00f6jd f\u00f6r noden i databasen med nyckeln definierad av konstanten BLOCK_HEIGHT.<\/p>\n<p>Funktionen GetTargetBlockHeight() (int, error) returnerar blockkedjans h\u00f6jd f\u00f6r denna nod, lagrad i databasen.<\/p>\n<p>Funktionen CheckBlock(block IBlock) bool kontrollerar blockets korrekthet innan det l\u00e4ggs till i blockkedjan.<\/p>\n<p>Funktionen AddBlock(block IBlock) error l\u00e4gger till blocket i blockkedjan.<\/p>\n<p>Funktionerna f\u00f6r att h\u00e4mta och visa block finns i filen explore.go i paketet blockchain:<\/p>\n<p>Funktionen GetBlockByHash(hash string) (*block.Block, error) skapar ett tomt blockobjekt, laddar blocket med den angivna hashen fr\u00e5n databasen och returnerar en pekare till det.<\/p>\n<p>Skapandet av genesis-blocket utf\u00f6rs av funktionen Genesis() error fr\u00e5n filen genesis.go i paketet blockchain.<\/p>\n<p>I n\u00e4sta artikel kommer vi att diskutera hur man ansluter till noden via WebSocket-mekanismen.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Hur jag designade block och transaktioner i min blockkedja p\u00e5 Go | ProHoster","description":"F\u00f6r att slutligen f\u00e5 en blockkedja och inte bara en databas m\u00e5ste vi l\u00e4gga till tre viktiga element i v\u00e5rt projekt: Beskrivning av databasstrukturen och blockmetoder.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/80122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=80122"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/80122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/80123"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=80122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=80122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=80122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}