{"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\/fr\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","title":{"rendered":"Comment j'ai con\u00e7u des blocs et des transactions dans ma blockchain en Go","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pour qu'un v\u00e9ritable blockchain soit cr\u00e9\u00e9, et pas simplement une base de donn\u00e9es, nous devons ajouter trois \u00e9l\u00e9ments importants \u00e0 notre projet : <\/p>\n<ul>\n<li> Description de la structure des donn\u00e9es et des m\u00e9thodes du bloc<\/li>\n<li> Description de la structure des donn\u00e9es et des m\u00e9thodes de transaction<\/li>\n<li> Fonctions de blockchain qui conservent les blocs dans la base de donn\u00e9es et les trouvent par leur hachage ou leur hauteur (ou de toute autre mani\u00e8re).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Comment j&#039;ai con\u00e7u des blocs et des transactions dans ma blockchain en 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 \/>\nCeci est le deuxi\u00e8me article sur la blockchain pour l'industrie, le premier <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499732\/\">ici<\/a><\/noindex>.<\/p>\n<p>En se rem\u00e9morant les questions que les lecteurs m'ont pos\u00e9es concernant l'article pr\u00e9c\u00e9dent de cette s\u00e9rie, il convient de noter : pour le stockage des donn\u00e9es de blockchain, nous utilisons dans ce cas une base de donn\u00e9es LevelDB, mais rien ne nous emp\u00eache d'utiliser n'importe quelle autre, disons MySQL. Passons maintenant \u00e0 la structure de ces donn\u00e9es.<\/p>\n<p>Commen\u00e7ons par les transactions : <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>Voici sa structure de donn\u00e9es :<\/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>\nDans TX, sont stock\u00e9s le type de donn\u00e9es (pour la transaction 2), le hachage de cette transaction, le type de la transaction elle-m\u00eame, l'horodatage, ainsi que les entr\u00e9es et sorties. Les entr\u00e9es TxIn stockent le hachage de la transaction \u00e0 laquelle elles font r\u00e9f\u00e9rence, le num\u00e9ro de cette sortie et le bytecode, tandis que les sorties TxOut stockent une valeur et \u00e9galement un bytecode.<\/p>\n<p>Regardons maintenant quelles actions une transaction peut effectuer sur ses donn\u00e9es, c'est-\u00e0-dire examinons les m\u00e9thodes.<\/p>\n<p>La fonction transaction.NewTransaction(txtype byte) *TX sert \u00e0 cr\u00e9er une transaction.<\/p>\n<p>La m\u00e9thode AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) ajoute une entr\u00e9e \u00e0 la transaction.<\/p>\n<p>La m\u00e9thode AddTxOut(value int, data []byte) (*TxOut, error) ajoute une sortie \u00e0 la transaction.<\/p>\n<p>La m\u00e9thode ToBytes() []byte transforme la transaction en un tableau de bytes.<\/p>\n<p>La fonction interne preByteHash(bytes []byte) string est utilis\u00e9e dans Build() et Check() pour garantir la compatibilit\u00e9 du hachage de la transaction cr\u00e9\u00e9e avec les hachages des transactions g\u00e9n\u00e9r\u00e9s par les applications en JavaScript.<\/p>\n<p>La m\u00e9thode Build() d\u00e9finit le hachage de la transaction comme suit : tx.TxHash = preByteHash(tx.ToBytes()).<\/p>\n<p>La m\u00e9thode ToJSON() string convertit la transaction en une cha\u00eene JSON.<\/p>\n<p>La m\u00e9thode FromJSON(data []byte) error charge la transaction \u00e0 partir du format JSON, transmis sous forme de tranche de bytes.<\/p>\n<p>La m\u00e9thode Check() bool compare le hachage obtenu du champ de hachage de la transaction avec le hachage obtenu suite au hachage de cette transaction (sans tenir compte du champ de hachage).<\/p>\n<p>Les transactions sont ajout\u00e9es au bloc : <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>La structure de donn\u00e9es du bloc est plus complexe :<\/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 conserve le type de donn\u00e9es, qui permet au n\u0153ud de distinguer un bloc d'une transaction ou d'autres donn\u00e9es. Pour un bloc, cette valeur est \u00e9gale \u00e0 1.<\/p>\n<p>BlockHeight conserve la hauteur du bloc.<br \/>\nTimestamp est le marqueur de temps.<br \/>\nHeaderSize est la taille du bloc en octets.<br \/>\nPrevBlockHash est le hachage du bloc pr\u00e9c\u00e9dent, tandis que SelfBlockHash est le hachage du bloc actuel.<br \/>\nTxsHash est le hachage global des transactions.<br \/>\nMerkleRoot est la racine de l'arbre de Merkle.<\/p>\n<p>Ensuite, les champs contiennent la cl\u00e9 publique du cr\u00e9ateur du bloc, la signature du cr\u00e9ateur, la version du bloc, le nombre de transactions dans le bloc et bien s\u00fbr ces transactions elles-m\u00eames.<\/p>\n<p>Examinons ses m\u00e9thodes :<br \/>\nPour cr\u00e9er un bloc, on utilise la fonction block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, qui prend le hachage du bloc pr\u00e9c\u00e9dent et la hauteur d\u00e9finie pour le bloc cr\u00e9\u00e9 dans la blockchain. On d\u00e9finit \u00e9galement le type de bloc depuis la constante du paquet types : <\/p>\n<pre><code class=\"go\">b.DataType = types.BLOCK_TYPE.<\/code><\/pre>\n<p>La m\u00e9thode AddTx(tx *transaction.TX) ajoute une transaction au bloc.<\/p>\n<p>La m\u00e9thode Build() charge les valeurs dans les champs du bloc et g\u00e9n\u00e8re et \u00e9tablit son hachage actuel.<\/p>\n<p>La m\u00e9thode ToBytesHeader() []byte convertit l'en-t\u00eate du bloc (sans transactions) en un tableau d'octets.<\/p>\n<p>La m\u00e9thode ToJSON() string convertit le bloc en format JSON en repr\u00e9sentation textuelle des donn\u00e9es.<\/p>\n<p>La m\u00e9thode FromJSON(data []byte) error charge des donn\u00e9es JSON dans la structure du bloc.<\/p>\n<p>La m\u00e9thode Check() bool g\u00e9n\u00e8re le hachage du bloc et le compare avec celui sp\u00e9cifi\u00e9 dans le champ du hachage du bloc.<\/p>\n<p>La m\u00e9thode GetTxsHash() string retourne le hachage global de toutes les transactions dans le bloc.<\/p>\n<p>La m\u00e9thode GetMerkleRoot() d\u00e9finit la racine de l'arbre de Merkle pour les transactions dans le bloc.<\/p>\n<p>La m\u00e9thode Sign(privk string) signe le bloc avec la cl\u00e9 priv\u00e9e du cr\u00e9ateur du bloc.<\/p>\n<p>La m\u00e9thode SetHeight(height int) enregistre la hauteur du bloc dans le champ de la structure du bloc.<\/p>\n<p>La m\u00e9thode GetHeight() int retourne la hauteur du bloc telle qu'indiqu\u00e9e dans le champ correspondant de la structure du bloc.<\/p>\n<p>La m\u00e9thode ToGOBBytes() []byte encode le bloc au format GOB et le retourne sous forme de tableau d'octets.<\/p>\n<p>La m\u00e9thode FromGOBBytes(data []byte) error enregistre les donn\u00e9es du bloc dans la structure du bloc \u00e0 partir du tableau d'octets fourni au format GOB.<\/p>\n<p>La m\u00e9thode GetHash() string retourne le hachage de ce bloc.<\/p>\n<p>La m\u00e9thode GetPrevHash() string retourne le hachage du bloc pr\u00e9c\u00e9dent.<\/p>\n<p>La m\u00e9thode SetPublicKey(pubk string) enregistre dans le bloc la cl\u00e9 publique du cr\u00e9ateur du bloc.<\/p>\n<p>Ainsi, gr\u00e2ce aux m\u00e9thodes de l'objet Block, nous pouvons facilement le convertir au format pour le transmettre sur le r\u00e9seau et le stocker dans une base de donn\u00e9es LevelDB.<\/p>\n<p>Les fonctions du paquet blockchain sont responsables de la sauvegarde dans la blockchain : <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>Pour cela, le bloc doit impl\u00e9menter l'interface 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>\nLa connexion \u00e0 la base de donn\u00e9es est cr\u00e9\u00e9e une fois lors de l'initialisation du paquet dans la fonction init() : <\/p>\n<pre><code class=\"go\">db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).<\/code><\/pre>\n<p>\nCloseDB() est une enveloppe pour db.Close() \u2014 elle est appel\u00e9e apr\u00e8s avoir travaill\u00e9 avec les fonctions du paquet pour fermer la connexion \u00e0 la base de donn\u00e9es.<\/p>\n<p>La fonction SetTargetBlockHash(hash string) error enregistre dans la base de donn\u00e9es le hachage du bloc actuel avec la cl\u00e9 d\u00e9finie par la constante BLOCK_HASH.<\/p>\n<p>La fonction GetTargetBlockHash() (string, error) retourne le hachage du bloc actuel, stock\u00e9 dans la base de donn\u00e9es.<\/p>\n<p>La fonction SetTargetBlockHeight(height int) error enregistre dans la base de donn\u00e9es la valeur de la hauteur de la blockchain pour le n\u0153ud avec la cl\u00e9 d\u00e9finie par la constante BLOCK_HEIGHT.<\/p>\n<p>La fonction GetTargetBlockHeight() (int, error) retourne la hauteur de la blockchain pour le n\u0153ud donn\u00e9, stock\u00e9e dans la base de donn\u00e9es.<\/p>\n<p>La fonction CheckBlock(block IBlock) bool effectue une v\u00e9rification du bloc pour en assurer la validit\u00e9 avant de l'ajouter \u00e0 la blockchain.<\/p>\n<p>La fonction AddBlock(block IBlock) error ajoute le bloc \u00e0 la blockchain.<\/p>\n<p>Les fonctions pour obtenir et visualiser les blocs se trouvent dans le fichier explore.go du paquet blockchain :<\/p>\n<p>La fonction GetBlockByHash(hash string) (*block.Block, error) cr\u00e9e un objet de bloc vide, charge le bloc correspondant de la base de donn\u00e9es dont le hachage lui a \u00e9t\u00e9 transmis et retourne un pointeur vers celui-ci.<\/p>\n<p>La cr\u00e9ation d'un bloc g\u00e9n\u00e9sis est effectu\u00e9e par la fonction Genesis() error du fichier genesis.go du paquet blockchain.<\/p>\n<p>Dans l'article suivant, nous aborderons la connexion des n\u0153uds clients via le m\u00e9canisme WebSocket.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Comment j'ai con\u00e7u des blocs et des transactions dans ma blockchain en Go | ProHoster","description":"Pour que nous obtenions finalement une blockchain, et non simplement une base de donn\u00e9es, nous devons ajouter 3 \u00e9l\u00e9ments importants \u00e0 notre projet : La description de la structure des donn\u00e9es et des m\u00e9thodes du bloc.","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/80122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=80122"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/80122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/80123"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=80122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=80122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=80122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}