{"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\/es\/blog\/administrirovanie\/kak-ya-proektiroval-bloki-i-tranzakczii-v-svoem-blokchejne-na-go","title":{"rendered":"C\u00f3mo dise\u00f1\u00e9 bloques y transacciones en mi blockchain en Go","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Para que al final se obtenga una cadena de bloques y no solo una base de datos, necesitamos agregar a nuestro proyecto 3 elementos importantes: <\/p>\n<ul>\n<li> Descripci\u00f3n de la estructura de datos y m\u00e9todos del bloque<\/li>\n<li> Descripci\u00f3n de la estructura de datos y m\u00e9todos de la transacci\u00f3n<\/li>\n<li> Funciones de la cadena de bloques que almacenan bloques en la base de datos y los encuentran all\u00ed seg\u00fan su hash o altura (o de alguna otra manera).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"C\u00f3mo dise\u00f1\u00e9 bloques y transacciones en mi 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 \/>\nEste es el segundo art\u00edculo sobre blockchain para la industria, el primero <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499732\/\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p>Recordando las preguntas que me hicieron los lectores sobre el art\u00edculo anterior de esta serie, cabe se\u00f1alar que para almacenar datos de la cadena de bloques en este caso se utiliza la base de datos LevelDB, pero nada impide usar cualquier otra, como MySQL. Ahora, profundicemos en la estructura de estos datos.<\/p>\n<p>Comencemos con las transacciones: <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>Esta es su estructura de datos:<\/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>\nEn TX se almacenan el tipo de datos (para la transacci\u00f3n 2), el hash de esta transacci\u00f3n, el tipo de la transacci\u00f3n, la marca de tiempo, as\u00ed como las entradas y salidas. Las entradas TxIn almacenan el hash de la transacci\u00f3n a la que apuntan, el n\u00famero de esta salida y el c\u00f3digo de bytes, mientras que las salidas TxOut almacenan un valor y tambi\u00e9n un c\u00f3digo de bytes.<\/p>\n<p>Ahora veamos qu\u00e9 acciones puede realizar una transacci\u00f3n sobre sus datos, es decir, analicemos los m\u00e9todos.<\/p>\n<p>La funci\u00f3n transaction.NewTransaction(txtype byte) *TX se utiliza para crear una transacci\u00f3n.<\/p>\n<p>El m\u00e9todo AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) agrega una entrada a la transacci\u00f3n.<\/p>\n<p>El m\u00e9todo AddTxOut(value int, data []byte) (*TxOut, error) agrega una salida a la transacci\u00f3n.<\/p>\n<p>El m\u00e9todo ToBytes() []byte convierte la transacci\u00f3n en un slice de bytes.<\/p>\n<p>La funci\u00f3n interna preByteHash(bytes []byte) string se aplica en Build() y Check() para la compatibilidad del hash de transacciones generado con los hashes de transacciones generados desde aplicaciones en JavaScript.<\/p>\n<p>El m\u00e9todo Build() establece el hash de la transacci\u00f3n de la siguiente manera: tx.TxHash = preByteHash(tx.ToBytes()).<\/p>\n<p>El m\u00e9todo ToJSON() string convierte la transacci\u00f3n en una cadena JSON.<\/p>\n<p>El m\u00e9todo FromJSON(data []byte) error carga la transacci\u00f3n desde el formato JSON, que se pasa como un slice de bytes.<\/p>\n<p>El m\u00e9todo Check() bool compara el hash recibido del campo hash de la transacci\u00f3n con el hash obtenido como resultado del hash de esta transacci\u00f3n (sin tener en cuenta el campo hash).<\/p>\n<p>Las transacciones se agregan al bloque: <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 estructura de datos del bloque es m\u00e1s extensa:<\/p>\n<pre><code class=\"go\">tipo 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 almacena el tipo de datos, con el que el nodo diferencia un bloque de una transacci\u00f3n u otros datos. Para un bloque, este valor es igual a 1.<\/p>\n<p>BlockHeight almacena la altura del bloque.<br \/>\nTimestamp es la marca de tiempo.<br \/>\nHeaderSize es el tama\u00f1o del bloque en bytes.<br \/>\nPrevBlockHash es el hash del bloque anterior, y SelfBlockHash \u2014 el actual.<br \/>\nTxsHash es el hash conjunto de las transacciones.<br \/>\nMerkleRoot es la ra\u00edz del \u00e1rbol de Merkle.<\/p>\n<p>En los siguientes campos se encuentran la clave p\u00fablica del creador del bloque, la firma del creador, la versi\u00f3n del bloque, el n\u00famero de transacciones en el bloque y, en s\u00ed, las transacciones.<\/p>\n<p>Veamos sus m\u00e9todos:<br \/>\nPara crear un bloque, se utiliza la funci\u00f3n block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, que acepta el hash del bloque anterior y la altura establecida para el bloque creado en la cadena de bloques. Tambi\u00e9n se especifica el tipo de bloque de la constante del paquete types: <\/p>\n<pre><code class=\"go\">b.DataType = types.BLOCK_TYPE.<\/code><\/pre>\n<p>El m\u00e9todo AddTx(tx *transaction.TX) a\u00f1ade una transacci\u00f3n al bloque.<\/p>\n<p>El m\u00e9todo Build() carga los valores en los campos del bloque y genera y establece su hash actual.<\/p>\n<p>El m\u00e9todo ToBytesHeader() []byte convierte el encabezado del bloque (sin transacciones) en un slice de bytes.<\/p>\n<p>El m\u00e9todo ToJSON() string convierte el bloque en formato JSON en representaci\u00f3n de cadena de datos.<\/p>\n<p>El m\u00e9todo FromJSON(data []byte) error carga datos desde JSON en la estructura del bloque.<\/p>\n<p>El m\u00e9todo Check() bool genera el hash del bloque y lo compara con el especificado en el campo del hash del bloque.<\/p>\n<p>El m\u00e9todo GetTxsHash() string devuelve el hash conjunto de todas las transacciones en el bloque.<\/p>\n<p>El m\u00e9todo GetMerkleRoot() establece la ra\u00edz del \u00e1rbol de Merkle para las transacciones en el bloque.<\/p>\n<p>El m\u00e9todo Sign(privk string) firma el bloque con la clave privada del creador del bloque.<\/p>\n<p>El m\u00e9todo SetHeight(height int) registra la altura del bloque en el campo de la estructura del bloque.<\/p>\n<p>El m\u00e9todo GetHeight() int devuelve la altura del bloque tal como est\u00e1 indicada en el campo correspondiente de la estructura del bloque.<\/p>\n<p>El m\u00e9todo ToGOBBytes() []byte codifica el bloque en formato GOB y lo devuelve como un slice de bytes.<\/p>\n<p>El m\u00e9todo FromGOBBytes(data []byte) error registra los datos del bloque en la estructura del bloque desde el slice de bytes recibido en formato GOB.<\/p>\n<p>El m\u00e9todo GetHash() string devuelve el hash de este bloque.<\/p>\n<p>El m\u00e9todo GetPrevHash() string devuelve el hash del bloque anterior.<\/p>\n<p>El m\u00e9todo SetPublicKey(pubk string) registra en el bloque la clave p\u00fablica del creador del bloque.<\/p>\n<p>As\u00ed, mediante los m\u00e9todos del objeto Block, podemos convertirlo f\u00e1cilmente a un formato para su transmisi\u00f3n a trav\u00e9s de la red y su almacenamiento en una base de datos LevelDB.<\/p>\n<p>Las funciones del paquete blockchain se encargan de almacenar en la cadena de bloques: <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>Para ello, el bloque debe implementar la interfaz 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 conexi\u00f3n a la base de datos se crea una vez durante la inicializaci\u00f3n del paquete en la funci\u00f3n init(): <\/p>\n<pre><code class=\"go\">db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).<\/code><\/pre>\n<p>\nCloseDB() es un envoltorio para db.Close() \u2014 se llama despu\u00e9s de trabajar con las funciones del paquete para cerrar la conexi\u00f3n con la base de datos.<\/p>\n<p>La funci\u00f3n SetTargetBlockHash(hash string) error graba en la base de datos el hash del bloque actual con la clave definida por la constante BLOCK_HASH.<\/p>\n<p>La funci\u00f3n GetTargetBlockHash() (string, error) devuelve el hash del bloque actual, almacenado en la base de datos.<\/p>\n<p>La funci\u00f3n SetTargetBlockHeight(height int) error graba en la base de datos el valor de la altura de la cadena de bloques para el nodo con la clave definida por la constante BLOCK_HEIGHT.<\/p>\n<p>La funci\u00f3n GetTargetBlockHeight() (int, error) devuelve la altura de la cadena de bloques para este nodo, almacenada en la base de datos.<\/p>\n<p>La funci\u00f3n CheckBlock(block IBlock) bool realiza una verificaci\u00f3n del bloque antes de agregarlo a la cadena de bloques.<\/p>\n<p>La funci\u00f3n AddBlock(block IBlock) error a\u00f1ade un bloque a la cadena de bloques.<\/p>\n<p>Las funciones para obtener y visualizar bloques se encuentran en el archivo explore.go del paquete blockchain:<\/p>\n<p>La funci\u00f3n GetBlockByHash(hash string) (*block.Block, error) crea un objeto de bloque vac\u00edo, carga el bloque desde la base de datos cuyo hash se le ha pasado y devuelve un puntero a \u00e9l.<\/p>\n<p>La creaci\u00f3n del bloque g\u00e9nesis se lleva a cabo mediante la funci\u00f3n Genesis() error del archivo genesis.go del paquete blockchain.<\/p>\n<p>En el pr\u00f3ximo art\u00edculo se hablar\u00e1 sobre c\u00f3mo conectarse al nodo de los clientes mediante el mecanismo WebSocket.<br \/>\n<br \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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 C\u00f3mo dise\u00f1\u00e9 bloques y transacciones en mi cadena de bloques en Go | ProHoster","description":"Para que al final obtengamos una cadena de bloques, y no solo una base de datos, necesitamos a\u00f1adir a nuestro proyecto 3 elementos importantes: La descripci\u00f3n de la estructura de datos y m\u00e9todos del bloque.","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/80122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=80122"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/80122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/80123"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=80122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=80122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=80122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}