Este lab se desarrolló junto con nuestro socio Block.one. Es posible que tu información personal se comparta con Block.one, el patrocinador del lab, si aceptaste recibir actualizaciones, anuncios y ofertas de productos en el perfil de tu cuenta.
GSP991
Descripción general
En este lab, ampliarás la cadena de bloques de EOSIO de un solo nodo para usar varios nodos. Instalarás distintos componentes de software EOSIO para configurar tu cadena de bloques de EOSIO de varios nodos. Por último, realizarás algunas tareas de operador de nodos en la nueva cadena de bloques de EOSIO.
Objetivos
En este lab, aprenderás a realizar las siguientes tareas:
- Cargar una máquina virtual existente de Compute Engine
- Instalar y compilar los contratos del sistema EOSIO
- Implementar una cadena de bloques de varios nodos con cuatro (4) nodos de EOSIO
- Crear cuentas de usuario en la cadena de bloques de varios nodos de EOSIO
- Llamar a una acción para transferir tokens entre cuentas de usuario
Requisitos previos
Antes de comenzar este lab, te sugerimos que completes el lab titulado Block.one: Getting Started with the EOSIO Blockchain.
También se recomienda que te familiarices con los siguientes conceptos:
Configuración y requisitos
Antes de hacer clic en el botón Comenzar lab
Lee estas instrucciones. Los labs cuentan con un temporizador que no se puede pausar. El temporizador, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.
Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.
Para completar este lab, necesitarás lo siguiente:
- Acceso a un navegador de Internet estándar. Se recomienda el navegador Chrome.
Nota: Usa una ventana del navegador privada o de incógnito (opción recomendada) para ejecutar el lab. Así evitarás conflictos entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
- Tiempo para completar el lab (recuerda que, una vez que comienzas un lab, no puedes pausarlo).
Nota: Usa solo la cuenta de estudiante para este lab. Si usas otra cuenta de Google Cloud, es posible que se apliquen cargos a esa cuenta.
Cómo iniciar tu lab y acceder a la consola de Google Cloud
-
Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá un diálogo para que selecciones la forma de pago.
A la derecha, se encuentra el panel Configuración del lab y acceso, que tiene los siguientes elementos:
- El botón Abrir la consola de Google Cloud
- Las credenciales temporales (nombre de usuario y contraseña) que debes usar para este lab
- Otra información para completar el lab (si es necesaria)
Ten en cuenta que el cronómetro del lab se encuentra cerca de la parte superior de la página y muestra el tiempo restante.
-
Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).
El lab inicia los recursos y abre otra pestaña, en la que se muestra la página de acceso.
Sugerencia: Ordena las pestañas en ventanas separadas, una junto a la otra.
Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usa otra cuenta.
-
De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.
{{{user_0.username | "Username"}}}
También puedes encontrar el nombre de usuario en el panel Configuración del lab y acceso.
-
Haz clic en Siguiente.
-
Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.
{{{user_0.password | "Password"}}}
También puedes encontrar la contraseña en el panel Configuración del lab y acceso.
-
Haz clic en Siguiente.
Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud.
Nota: Usar tu propia cuenta de Google Cloud para este lab podría generar cargos adicionales.
-
Haz clic para avanzar por las páginas siguientes:
- Acepta los Términos y Condiciones.
- No agregues opciones de recuperación ni autenticación de dos factores, ya que esta cuenta es temporal.
- No te registres para obtener pruebas gratuitas.
Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.
Nota: Para acceder a los productos y servicios de Google Cloud, haz clic en el menú de navegación o escribe el nombre del servicio o producto en el campo Buscar.
Información general
En esta sección, se proporciona una descripción general de los conceptos incluidos en este lab.
Cadena de bloques de EOSIO
Una cadena de bloques de EOSIO es una máquina de estado distribuida, determinística y altamente eficiente que puede operar de forma descentralizada. La cadena de bloques realiza un seguimiento de las transacciones dentro de una secuencia de bloques intercambiados. Cada bloque se confirma de forma criptográfica en los bloques anteriores a lo largo de la misma cadena. Por lo tanto, es imposible modificar una transacción registrada en un bloque determinado sin interrumpir las verificaciones criptográficas de los bloques sucesivos. Por eso, las transacciones de cadenas de bloques son inmutables y seguras. La producción y validación de bloques se realizan por medio de nodos especiales llamados productores de bloques.
Consenso de EOSIO
La validación de bloques representa un desafío para cualquier grupo de nodos distribuidos. Debe implementarse un modelo de consenso para validar esos bloques de manera tolerante a errores dentro del sistema descentralizado. El consenso es la forma en la que los usuarios y nodos distribuidos acuerdan el estado actual de la cadena de bloques. Dos de los modelos de consenso más comunes que se usan en las cadenas de bloques son la prueba de trabajo (PoW) y la prueba de participación (PoS). En la prueba de participación, los nodos que poseen la mayor participación o el mayor porcentaje de algún activo tienen un poder de decisión equivalente. Una variante interesante es la prueba de participación delegada (DPoS), en la que una gran cantidad de participantes o partes interesadas elige una cantidad menor de delegados, quienes, a su vez, toman decisiones por ellos. EOSIO usa la prueba de participación delegada (DPoS) para elegir a los productores activos que luego recibirán la autorización para producir bloques, validarlos y firmarlos para que, finalmente, se agreguen a la cadena de bloques.
Cuentas, claves y permisos de EOSIO
Una cuenta identifica a un participante en una cadena de bloques de EOSIO. Un participante puede ser una persona o un grupo, según los permisos asignados dentro de la cuenta. Las cuentas también representan los actores de contratos inteligentes que envían y reciben acciones hacia otras cuentas en la cadena de bloques y desde ellas. En EOSIO, las claves son cadenas binarias representadas en Base58 que se usan para firmar y verificar transacciones, bloques y otros mensajes. Las claves se crean dentro de una billetera digital asociada a una cuenta. Dado que la propiedad de la cuenta se define únicamente por el nombre de la cuenta, las claves asociadas a una cuenta se pueden actualizar sin comprometer la seguridad. Un nuevo esquema de permisos que incluye cuentas, permisos y tablas de autoridad determina qué pueden hacer las cuentas y cómo se autorizan las acciones que componen una transacción. Para ello, a cada cuenta se le asigna una estructura de permisos jerárquica, y a cada permiso se le asigna un par de claves públicas y privadas que se usa para la firma y verificación.
Contratos inteligentes de EOSIO
Un contrato inteligente es una biblioteca de software de bajo nivel que contiene la implementación de las acciones que componen una transacción. También define cómo se almacenan los datos a los que acceden las acciones y que estas procesan. En EOSIO, un contrato inteligente se implementa en un lenguaje de alto nivel, como C++, y se compila en un archivo binario de WebAssembly (WASM). Por eso, los contratos inteligentes se pueden implementar y ejecutar en la zona de pruebas de una cuenta en la cadena de bloques.
Tarea 1: Crea una máquina virtual
-
En Menú de navegación (
), haz clic en Compute Engine > Instancias de VM.
-
Para crear una instancia nueva, haz clic en Crear instancia.
-
En la Configuración de la máquina.
Selecciona los siguientes valores:
-
Nombre:
instance-1
-
Región:
-
Zona:
-
Familia de máquinas:
General Purpose (opción predeterminada)
-
Serie:
E2
-
Tipo de máquina:
e2-standard-2 (2 CPU virtuales, 8 GB de memoria)
-
Haz clic en SO y almacenamiento.
Haz clic en Cambiar para comenzar a configurar el disco de arranque y selecciona los siguientes valores:
-
Sistema operativo:
Ubuntu
-
Versión:
Ubuntu 22.04 LTS
-
Arquitectura:
x86/64
Haz clic en Seleccionar.
-
Para crear e iniciar la VM, haz clic en Crear.
Nota: La VM puede tardar aproximadamente dos minutos en iniciarse y en estar disponible por completo para su uso.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crea una máquina virtual
Tarea 2: Instala la plataforma de EOSIO
- En Menú de navegación (
), haz clic en Compute Engine > Instancias de VM.
Verás la instancia de VM que creaste.
-
Para abrir un símbolo del sistema en la instancia de VM instance-1, haz clic en SSH en su fila de la lista de Instancias de VM. Se abrirá una ventana de terminal de la shell.
-
Primero, asegúrate de actualizar la lista de paquetes de software en el cuadro de tu VM:
sudo apt update
- Instala la dependencia
libssl1.1, que se requiere para EOSIO 2.1.0, pero no se incluye en Ubuntu 22.04 y versiones posteriores de forma predeterminada:
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
sudo apt install ./libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
- Obtén los objetos binarios del software EOSIO. Eso incluye nodeos, el software P2P de nodos, cleos, el cliente de CLI, keosd, el administrador de billeteras y otras herramientas:
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- Instala los objetos binarios del software EOSIO. Presiona Intro si es necesario para instalar las dependencias de software requeridas:
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- Confirma que nodeos esté instalado:
nodeos --version
La respuesta será la versión de nodeos:
v2.1.0
- Confirma que cleos esté instalado:
cleos version client
La respuesta será la versión de cleos:
v2.1.0
- Confirma que keosd esté instalado:
keosd -v
La respuesta será la versión de keosd:
v2.1.0
Haz clic en Revisar mi progreso para verificar el objetivo.
Instala la plataforma de EOSIO
Tarea 3: Crea una billetera predeterminada
En las billeteras, se almacenan las claves criptográficas que usan las cuentas y los productores para firmar transacciones y bloques, respectivamente. También proporcionan un enclave seguro para realizar la firma y que las claves privadas nunca salgan de la billetera. Para cambiar el estado en la cadena de bloques, necesitas una billetera para almacenar claves criptográficas y realizar la firma digital.
- Primero, define un tiempo de espera de desbloqueo largo para cualquier billetera administrada por keosd, el administrador de billeteras de EOSIO:
keosd --unlock-timeout 999999999 &
Esto evitará que se desbloquee la billetera cada 15 minutos, que es el tiempo de espera predeterminado. También se iniciará el servicio de daemon keosd. La respuesta debería ser similar a la siguiente:
info thread-0 wallet_plugin.cpp:38 plugin_initialize ] initializing wallet plugin
info thread-0 wallet_api_plugin.cpp:84 plugin_startup ] starting wallet_api_plugin
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/create
...
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/unlock
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/node/get_supported_apis
Si es necesario, presiona Intro para volver a obtener el prompt de la shell.
- Crea una billetera predeterminada y genera la contraseña de la billetera en un archivo llamado my_wallet_password:
cleos wallet create --file my_wallet_password
Esto creará una billetera llamada default. La respuesta debería ser así:
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
saving password to my_wallet_password
Después de crear la billetera, keosd la abre y desbloquea de forma predeterminada.
- Para ver todas las billeteras administradas, ejecuta el siguiente comando:
cleos wallet list
La respuesta debería ser así:
Wallets:
[
"default *"
]
El asterisco junto al nombre de la billetera indica que está desbloqueada.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crea una billetera predeterminada
Tarea 4: Agrega la clave privada de la cuenta del sistema EOSIO a la billetera
Cada nueva cadena de bloques de EOSIO tiene una cuenta predeterminada del sistema llamada eosio. Esta cuenta se usa inicialmente para configurar la cadena de bloques. De forma predeterminada, se asocia a la siguiente clave privada: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3.
Importa la clave privada a tu billetera para firmar transacciones en nombre de la cuenta eosio.
- Usa el comando cleos wallet open para abrir la billetera default. Ten en cuenta que la billetera ya está abierta y desbloqueada. Sin embargo, deberás ejecutar el siguiente procedimiento si se vuelve a bloquear la billetera:
cleos wallet open
La respuesta debería ser así:
Opened: default
- Desbloquea la billetera predeterminada usando el comando cleos wallet unlock y pasa la contraseña de la billetera almacenada en el archivo my_wallet_password:
cleos wallet unlock <my_wallet_password
La respuesta debería ser así:
password: Unlocked: default
- Usa el comando cleos wallet import para importar la clave privada de eosio,
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 a la billetera predeterminada:
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
La respuesta debería ser así:
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
Esta es la clave pública correspondiente a la clave privada importada. Ignora las advertencias relacionadas con el uso de una billetera predeterminada. En las implementaciones de producción, es posible que quieras asignarle a tu billetera un nombre diferente a default.
Haz clic en Revisar mi progreso para verificar el objetivo.
Agrega la clave privada de la cuenta del sistema eosio a la billetera
Tarea 5: Instala el kit de herramientas de desarrollo de contratos (CDT) de EOSIO
El kit de herramientas de desarrollo de contratos de EOSIO incluye el compilador C++ de CDT, que puedes usar para compilar los contratos del sistema y, luego, tus propios contratos inteligentes de C++. Los contratos del sistema son muy importantes, ya que habilitan la funcionalidad del software de segunda capa que permite agregar y admitir funciones adicionales.
- Primero, instala el paquete build-essential. Ese paquete contiene varias herramientas necesarias para compilar software en C/C++ en tu máquina Linux.
sudo apt install build-essential
- Obtén los archivos binarios de CDT de EOSIO:
curl -LO https://github.com/eosio/eosio.cdt/releases/download/v1.8.1/eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
- Instala los archivos binarios de CDT de EOSIO:
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
- Confirma que el compilador de CDT de EOSIO esté instalado:
eosio-cpp --version
La respuesta debería ser la versión del compilador de CDT de EOSIO:
eosio-cpp version 1.8.1
Haz clic en Revisar mi progreso para verificar el objetivo.
Instala el kit de herramientas de desarrollo de contratos de EOSIO
Tarea 6: Compila los contratos del sistema y eosio.boot
Para tener una cadena funcional de bloques de EOSIO de varios nodos, debes implementar los contratos del sistema EOSIO. Entre otros aspectos, los contratos del sistema proporcionan la funcionalidad de segunda capa necesaria para el consenso de EOSIO, la capacidad de inmovilizar tokens, votar, crear tus propios tokens, etc. También permiten que se admitan funciones nuevas.
- Instala CMake, una dependencia de software que usa la secuencia de comandos de compilación eosio.contracts:
sudo apt install cmake
- Descarga el sistema eosio.contracts más reciente:
git clone https://github.com/EOSIO/eosio.contracts.git \
--branch release/1.9.x --single-branch
- Compila el sistema eosio.contracts. En este paso, también debes pasar los directorios de instalación de eosio y eosio.cdt.
cd eosio.contracts
./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1
cd ~
Ignora las advertencias sobre los contratos ricardianos faltantes, si hay alguna. La respuesta debería ser similar a la siguiente (sin las advertencias):
Using EOSIO.CDT installation at: /usr/opt/eosio.cdt/1.8.1
=========== Building eosio.contracts ===========
...
-- Building eosio.contracts v1.9.2
...
-- Unit tests will not be built. To build tests, set BUILD_TESTS to true.
-- Configuring done
-- Generating done
-- Build files have been written to: ./eosio.contracts/build
[ 11%] Performing build step for 'contracts_project'
[ 18%] Built target eosio.bios
[ 18%] Built target eosio.msig
[ 36%] Built target powup.results
[ 36%] Built target rex.results
[ 54%] Built target eosio.token
[ 90%] Built target eosio.system
[100%] Built target eosio.wrap
[ 22%] No install step for 'contracts_project'
[ 33%] No test step for 'contracts_project'
[ 44%] Completed 'contracts_project'
[100%] Built target contracts_project`
Toma nota de la ubicación en la que se compilan los contratos del sistema EOSIO. La necesitarás más adelante cuando implementes contratos específicos del sistema: ~/eosio.contracts/build/contracts.
- Compila el contrato del sistema eosio.boot:
git clone https://github.com/EOSIO/eos.git \
--branch release/2.1.x --single-branch
cd eos/contracts/contracts/eosio.boot
cmake .
make
cd ~
Ignora las advertencias. La respuesta debería ser similar a la siguiente:
-- Configuring done
-- Generating done
-- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
- Anota la ubicación en la que se compila el contrato eosio.boot. Deberás implementarlo más adelante:
~/eos/contracts/contracts/eosio.boot.
Haz clic en Revisar mi progreso para verificar el objetivo.
Compila los contratos del sistema y eosio.boot
Tarea 7: Inicia el nodo de arranque y crea cuentas del sistema
En esta tarea, iniciarás el nodo genesis de arranque y crearás las cuentas del sistema. A diferencia de la creación de billeteras, debes enviar una transacción a la cadena de bloques para crear una cuenta.
Por lo tanto, al menos el nodo de arranque debe estar en ejecución. Para ello, primero debes crear el directorio de datos y el archivo genesis que usarán todos los nodos. En un entorno de producción, cada nodo se alojará en su propio servidor y usará sus propios recursos. Aquí, implementarás todos los nodos en la misma máquina.
- Crea un directorio nodes nuevo. Aquí se almacenarán la base de datos de la cadena de bloques, el archivo de registro y el archivo de configuración de cada nodo.
mkdir nodes
- Crea el archivo genesis.json predeterminado en el directorio nodes:
cat >nodes/genesis.json
- Copia y pega el siguiente contenido JSON en la terminal, presiona Intro y, luego, Ctrl + D para guardar el archivo genesis.json:
{
"initial_timestamp": "2018-06-01T12:00:00.000",
"initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 524288,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
"initial_key" indica la clave pública inicial de desarrollo que usa la cuenta eosio. Aquí puedes anularla con tu propia clave de desarrollo, si es necesario, lo que se recomienda para las implementaciones de producción. Esa clave debe existir en la billetera que usa la cuenta eosio. Importaste esa clave en una sección anterior.
- Verifica que se haya creado y propagado el archivo genesis.json correctamente:
cat nodes/genesis.json
Deberías ver el mismo contenido que en el paso anterior.
- Crea el directorio del nodo de arranque nodes/00-boot para almacenar todos los datos de la cadena de bloques relacionados con el nodo de arranque:
mkdir nodes/00-boot
- Para iniciar el nodo de arranque, inicia el daemon de servicio nodeos como una tarea en segundo plano y redirecciona stdout/stderr al archivo 00-boot/00.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name eosio \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/00-boot/blocks \
--config-dir ~/nodes/00-boot \
--data-dir ~/nodes/00-boot \
--http-server-address 127.0.0.1:8888 \
--p2p-listen-endpoint 127.0.0.1:9876 \
--signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
>>~/nodes/00-boot/00.log 2>&1 &
Esto iniciará el nodo de arranque con algunos complementos, el nombre del productor eosio, la escucha en el puerto HTTP 8888, el puerto P2P 9876 y el uso de las claves de desarrollo predeterminadas EOS6MRy…, 5KQwrP… para la firma de bloques. Si no se anula con --signature-provider, se usan las claves de desarrollo de eosio predeterminadas.
- Verifica que el nodo de arranque se esté ejecutando y esté produciendo bloques:
tail -f nodes/00-boot/00.log
El resultado se verá de la siguiente manera.
Resultado:
...
info 2021-03-08T02:44:11.900 nodeos producer_plugin.cpp:2333 produce_block ] Produced block e0dc6324ce3c8f35... #588 @ 2021-03-08T02:44:12.000 signed by eosio [trxs: 0, lib: 587, confirmed: 0]
En la última línea, se revela el último número de bloque producido y el último bloque irreversible (lib) actual, que marca el bloque final y el final de la cadena de bloques.
-
Presiona Ctrl + C para salir del programa tail.
-
Ahora que se está ejecutando el nodo de arranque, puedes obtener información sobre la cuenta eosio almacenada en la base de datos de la cadena:
cleos get account eosio
La respuesta debería ser así:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: unlimited used: 2.66 KiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
Recuerda que la cuenta eosio es una cuenta privilegiada, y las claves asociadas con los permisos owner y active son las mismas claves de desarrollo predeterminadas que se importaron a la billetera. Esto permitirá que la cuenta eosio autorice transacciones mientras se configura la cadena de bloques de varios nodos.
- Crea cuentas de sistema adicionales. Esas cuentas también se almacenarán en la base de datos de la cadena de bloques.
cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.vpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.rex EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
Asigna el mismo par de claves de desarrollo a todas las cuentas del sistema y a los permisos owner y active. En las implementaciones de producción, te recomendamos que asignes un par de claves diferente a cada permiso para mayor seguridad. También puedes usar claves diferentes para cada cuenta del sistema.
La respuesta a los comandos anteriores debería ser similar a la siguiente:
executed transaction: 98f22027c6703e554042b1d4a93beb70b1dc30be0fe65267932155c9d70e6493 200 bytes 153 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.bpay","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn...
warning: transaction executed locally, but may not be confirmed by the network yet ]
...
executed transaction: 2f0cb00110374976f3cd9195bccac81fe0ee330c515b4a656d6d41f6181f636d 200 bytes 189 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.rex","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnV...
warning: transaction executed locally, but may not be confirmed by the network yet ]
Ignora las advertencias. Usarás esas cuentas en las próximas tareas.
Haz clic en Revisar mi progreso para verificar el objetivo.
Compila los contratos del sistema y eosio.boot
Tarea 8: Implementa los contratos eosio.token y eosio.msig, y crea o emite el token SYS
En esta tarea, crearás y emitirás un token SYS ficticio. Para ello, también deberás implementar los contratos del sistema eosio.token y eosio.msig que se compilaron anteriormente.
- Implementa el contrato eosio.token. Este contrato te permite crear, emitir y transferir tokens nuevos o existentes.
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/
La respuesta debería ser similar a la siguiente:
Reading WASM from ~/eosio.contracts/build/contracts/eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: 11aca7fb68e0821cf8f74be0188741964787f830d0918abdfccae4a54c25e291 19360 bytes 4445 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000180022860000060037f7f7f01...
# eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e320008076163636f756e7400010762616c616e63...
- Implementa el contrato eosio.msig. Este contrato permite el proceso de firmas múltiples entre cuentas y simplifica la administración de permisos.
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/
La respuesta será similar a la siguiente:
Reading WASM from ~/eosio.contracts/build/contracts/eosio.msig/eosio.msig.wasm...
Publishing contract...
executed transaction: c2260b7d05bb38d2df097799baedd890ce7560bedbd1b79e7d07e4f6a5b25238 23256 bytes 3684 us
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001b8022f60000060037f7f7f017...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e32001006616374696f6e0004076163636f756e740...
- Crea el token SYS con una distribución total de 10,000 millones de tokens:
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token
El comando anterior envía una transacción con la acción create del contrato eosio.token, autorizada por el permiso activo de la cuenta eosio.token.
La respuesta debería ser similar a la siguiente:
executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
- Se emitirán 1,000 millones de tokens SYS de la reserva para su circulación:
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio
El comando anterior envía una transacción con la acción issue del contrato eosio.token, autorizada por el permiso activo de la cuenta eosio.
La respuesta será similar a la siguiente:
executed transaction: 4613fcff26bc6f96010273b475e839018f0afe2ef2af840d481070c9c54e36f1 128 bytes 405 us
# eosio.token <= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}
Haz clic en Revisar mi progreso para verificar el objetivo.
Crea e implementa los contratos eosio.token y eosio.msig, y el token SYS
Tarea 9: Activa las funciones del protocolo e implementa los contratos eosio.boot y eosio.system
Las funciones del protocolo aportan capacidades opcionales adicionales a las cadenas de bloques de EOSIO. En esta tarea, activarás algunas funciones del protocolo que se recomiendan para las cadenas de bloques de EOSIO. Para ello, primero implementarás el contrato eosio.boot y, luego, activarás las funciones. Por último, implementarás el contrato eosio.system para completar la segunda capa de la cadena de bloques de EOSIO.
Esto permite que se utilicen recursos del sistema (CPU, RAM, NET), que se inmovilicen y liberen tokens, que se compren recursos, que se registren productores potenciales y que se voten posteriormente, que se reclamen recompensas de los productores, que se definan privilegios y límites, etc. El consenso de EOSIO de una mayoría absoluta de productores activa las funciones del protocolo. En este caso, lo único que necesitas es el nodo de arranque en ejecución.
- Primero, instala la herramienta jq para analizar las cadenas JSON de una forma más legible:
sudo apt install jq
- Ahora verifiquemos qué funciones del protocolo son compatibles:
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more
El comando anterior envía una solicitud HTTP POST al extremo get_supported_protocol_features que proporciona el complemento de la API de Producer.
En la respuesta, se mostrarán todas las funciones del protocolo que admite la red EOSIO actual (que, hasta el momento, consta del nodo de arranque).
Verifica el resultado (presiona la barra espaciadora varias veces) hasta que vuelva a aparecer el prompt de la shell.
Resultado:
[{"feature_digest": "0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd", "subjective_restrictions": {"enabled": true, "preactivation_required": false, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "PREACTIVATE_FEATURE"}]},
...
{"feature_digest": "ded2e25adcd78cbb94fa7f63a8f80a9af2b1a905e551a6e124e7d7829da1ea02", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "72ec6337e369cbb33ef7716d3267db9d5678fe54555c25ca4c9f5b9dfb7739f3", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "SECURITY_GROUP"}]},
...
{"feature_digest": "f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "GET_SENDER"}]}]
- Activa la función PREACTIVATE_FEATURE, que permite habilitar otras funciones, incluidas las posibles actualizaciones del contrato eosio.system que podrían implementar funciones nuevas. También ten en cuenta que una función de protocolo se debe activar pasando un resumen de la función o un código hash de la función específica.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'
Ten en cuenta que el código hash del resumen de la función 0ec7e… se puede obtener del campo feature_digest que devolvió el extremo get_supported_protocol_features en el paso anterior. Si la activación se realiza correctamente, la respuesta debería ser la que se indica.
Resultado:
{"result": "ok"}
Si la función ya se activó, se devuelve la siguiente respuesta, que se puede ignorar sin problemas.
Resultado:
{"code": 500, "message": "Internal Service Error", "error": {"code": 3250000, "name": "protocol_feature_exception", "what": "Protocol feature exception", "details": [{"message": "protocol feature with digest '<hex-value>' has already been activated", "file": "controller.cpp", "line_number": 1650, "method": "check_protocol_features"}]}}
- Implementa el contrato eosio.boot:
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/
La respuesta debería ser similar a la siguiente:
Reading WASM from ~/eos/contracts/contracts/eosio.boot/eosio.boot.wasm...
Publishing contract...
executed transaction: a029c644104da357a201f75058fc6772cf63f5fdfa9135be2c3b7c498d81d46d 2752 bytes 852 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60000060027f7f0060017e0060...
# eosio <= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e32001008616374697661746500010e666561747572655f...
- Activa funciones adicionales del protocolo, como KV_DATABASE, ACTION_RETURN_VALUE, etc. Esto se puede realizar después de implementar el contrato eosio.boot.
# KV_DATABASE
cleos push action eosio activate '["825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16"]' -p eosio
# ACTION_RETURN_VALUE
cleos push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]' -p eosio
# CONFIGURABLE_WASM_LIMITS
cleos push action eosio activate '["bf61537fd21c61a60e542a5d66c3f6a78da0589336868307f94a82bccea84e88"]' -p eosio
# BLOCKCHAIN_PARAMETERS
cleos push action eosio activate '["5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4"]' -p eosio
# GET_SENDER
cleos push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio
# FORWARD_SETCODE
cleos push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio
# ONLY_BILL_FIRST_AUTHORIZER
cleos push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio
# RESTRICT_ACTION_TO_SELF
cleos push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio
# DISALLOW_EMPTY_PRODUCER_SCHEDULE
cleos push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio
# FIX_LINKAUTH_RESTRICTION
cleos push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio
# REPLACE_DEFERRED
cleos push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio
# NO_DUPLICATE_DEFERRED_ID
cleos push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio
# ONLY_LINK_TO_EXISTING_PERMISSION
cleos push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio
# RAM_RESTRICTIONS
cleos push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio
# WEBAUTHN_KEY
cleos push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio
# WTMSIG_BLOCK_SIGNATURES
cleos push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio
- Implementa el contrato eosio.system. Eso habilitará las funciones de segunda capa y permitirá la transición de una cadena de bloques de un solo nodo a una de varios nodos.
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/
Haz clic en Revisar mi progreso para verificar el objetivo.
Implementa los contratos eosio.boot y eosio.system
Tarea 10: Crea las cuentas de productores de bloques
En esta tarea, crearás las cuentas de productores que, en algún momento, se harán cargo de la cadena de bloques de EOSIO y producirán bloques. El primer paso es designar eosio.msig como una cuenta privilegiada para que pueda brindar autorizaciones en nombre de la cuenta eosio, que más adelante renunciará a su autoridad y permitirá que la cuenta eosio.prods, que representa al grupo de productores elegidos, asuma las responsabilidades de producción y validación de bloques.
- Establece eosio.msig como una cuenta privilegiada:
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio
La respuesta debería ser similar a la siguiente:
executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us
# eosio <= eosio::setpriv {"account":"eosio.msig","is_priv":1}
- Inicializa el token SYS en la versión 0 y asigna 4 decimales para mayor precisión:
cleos push action eosio init '["0", "4,SYS"]' -p eosio
La respuesta debería ser similar a la siguiente:
executed transaction: c537fbd77983104d8dcb1c58b09b433f68a2dd12c876a27b7556d4a722d42939 104 bytes 3467 us
# eosio <= eosio::init {"version":0,"core":"4,SYS"}
# eosio.token <= eosio.token::open {"owner":"eosio.rex","symbol":"4,SYS","ram_payer":"eosio"}
- Importa las claves que usarán los productores para firmar bloques. En las implementaciones de producción, se deben crear primero esas claves y, luego, importar.
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b
cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu
cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ
cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6
Importar las claves preexistentes simplificará la administración de recursos para este lab. Sin embargo, para las implementaciones de producción, se deben crear claves nuevas.
La respuesta para cada comando debería ser la siguiente:
imported private key for: EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
imported private key for: EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
imported private key for: EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
imported private key for: EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d
Si los nodos están distribuidos, cada par de claves se almacenará de forma independiente en la billetera de cada servidor. En este lab, los almacenarás en la misma billetera para simplificar el proceso.
- Crea las cuentas de productores de bloques con recursos iniciales y una clave pública:
cleos system newaccount --transfer eosio producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
El comando anterior creará las nuevas cuentas producer.one, producer.two, produc.three, produce.four y asociará cada clave importada en el paso anterior a cada una de las cuentas. También asignará y apostará 50 millones de SYS para NET y CPU, y 8,000 para RAM.
La respuesta debería ser similar a la siguiente (para cada cuenta nueva):
executed transaction: 6164d2741433c68edf426d430cb0986b198a6f4c63e7f7a46bcf8343562eacc0 336 bytes 1029 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"producer.one","owner":{"threshold":1,"keys":[{"key":"EOS8imf2TDq6FKtLZ8mv...
# eosio <= eosio::buyrambytes {"payer":"eosio","receiver":"producer.one","bytes":8388608}
# eosio <= eosio::delegatebw {"from":"eosio","receiver":"producer.one","stake_net_quantity":"50000000.0000 SYS","stake_cpu_quantity...
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.ram <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.ramfee <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio.stake <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
- Registra las cuentas nuevas como productores. Recuerda que cada comando también espera la URL web del productor. Las URLs ficticias se usan a modo de ejemplo.
cleos system regproducer producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
cleos system regproducer producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
cleos system regproducer produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
cleos system regproducer produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d
La respuesta a los comandos anteriores debería ser similar a la siguiente:
executed transaction: 28ced4a34abd64fb2fc11fbb51d3e4e18d2933a9ab2560fc1c6fb80b0cfc336d 216 bytes 753 us
# eosio <= eosio::regproducer {"producer":"producer.one","producer_key":"EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz","u...
executed transaction: 06b8be4187c5fbabc3197064ae4c6d55ba553fdbcc8a560f060078e59d5dfc5e 216 bytes 306 us
# eosio <= eosio::regproducer {"producer":"producer.two","producer_key":"EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","u...
executed transaction: c23a5164bf0cc1e35dfa3e55fed56e935ceb7d764dbe2e7a3bf4aee446e7d88d 216 bytes 270 us
# eosio <= eosio::regproducer {"producer":"produc.three","producer_key":"EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6","u...
executed transaction: 081aa8aca08b6d4e8e6bf576b2882f578faa7148e7c550196ff256ab0a9dcca3 216 bytes 224 us
# eosio <= eosio::regproducer {"producer":"produce.four","producer_key":"EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d","u...
- Enumera las cuentas de productores actuales. Debe haber cuatro en total.
cleos system listproducers
La respuesta debería ser así:
Producer Producer key Url Scaled votes`
**`produc.three`** `EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj` **`0.0000`**
**`produce.four`** `EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8` **`0.0000`**
**`producer.one`** `EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8` **`0.0000`**
**`producer.two`** `EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE` **`0.0000`**
Ten en cuenta que la cantidad de votos para cada productor sigue siendo cero, ya que aún ningún productor recibió votos.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crea las cuentas de productor de bloques
Tarea 11: Realiza la transición de un productor de un solo nodo a productores de varios nodos
En esta tarea, harás la transición de una cadena de bloques de un solo nodo a una de varios nodos. Actualmente, solo la cuenta eosio tiene privilegios y puede firmar bloques. El objetivo es crear una cadena de bloques de EOSIO administrada por una colección de productores elegidos en la que se alcance el consenso después de que una mayoría de 2/3 + 1 productores confirme un bloque. Luego, serán definitivas todas las transacciones dentro de ese bloque.
- Crea los directorios de nodos restantes nodes/01-node, nodes/02-node, nodes/03-node y nodes/04-node para almacenar todos los datos de la cadena de bloques relacionados con los nuevos nodos de producción 1, 2, 3 y 4:
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
- Para iniciar el nodo 1, inicia el daemon de servicio nodeos como una tarea en segundo plano y redirecciona stdout/stderr al archivo 01-node/01.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name producer.one \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/01-node/blocks \
--config-dir ~/nodes/01-node \
--data-dir ~/nodes/01-node \
--http-server-address 127.0.0.1:8889 \
--p2p-listen-endpoint 127.0.0.1:9877 \
--signature-provider EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz=KEY:5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b \
--p2p-peer-address 127.0.0.1:9876 \
>>~/nodes/01-node/01.log 2>&1 &
Esto iniciará el nodo 1 con algunos complementos, el nombre del productor producer.one, la escucha en el puerto http 8889, el puerto P2P 9877, el reemplazo de las claves de desarrollo predeterminadas con sus propias claves EOS8imf…. 5KLGj1… y la conexión al nodo P2P 9876 (nodo de arranque).
- Puedes inspeccionar el registro del nodo 1 para consultar los mensajes intercambiados con el nodo de inicio (nodo P2P 9876) ejecutando el siguiente comando:
cat nodes/01-node/01.log | grep :9876 -C 3
El resultado debería ser similar al siguiente:
Resultado:
info 2021-10-22T21:56:43.161 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block e79c2cc7df2bd7bc... #3040 @ 2021-10-22T21:56:41.500 signed by eosio [trxs: 0, lib: 3039, conf: 0, latency: 1661 ms]
...
info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1132 operator() ] Sending handshake generation 2 to 127.0.0.1:9876- 446609d, lib 3040, head 3041, id 5d69f1fa874933cf
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 3043, blk_num 3043, id b8f3389c52ff416c...
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 3043 target LIB = 3041 next_expected = 3042, id b8f3389c52ff416c..., peer 127.0.0.1:9876 - 446609d
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
info 2021-10-22T21:56:43.164 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 917275dee8c12e57... #3042 @ 2021-10-22T21:56:42.500 signed by eosio [trxs: 0, lib: 3041, conf: 0, latency: 664 ms]
...
Ten en cuenta que el nodo 1 aún no produce bloques, pero recibe bloques de otros nodos y los sincroniza, como el nodo de arranque, por el momento.
- Para iniciar el nodo 2, inicia el daemon de servicio nodeos como una tarea en segundo plano y redirecciona stdout/stderr al archivo 02-node/02.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name producer.two \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/02-node/blocks \
--config-dir ~/nodes/02-node \
--data-dir ~/nodes/02-node \
--http-server-address 127.0.0.1:8890 \
--p2p-listen-endpoint 127.0.0.1:9878 \
--signature-provider EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC=KEY:5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
>>~/nodes/02-node/02.log 2>&1 &
Esto iniciará el nodo 2 con algunos complementos, el nombre del productor producer.two, la escucha en el puerto HTTP 8890, el puerto P2P 9878 y el reemplazo de las claves de desarrollo predeterminadas con sus propias claves EOS8imf…. 5KLGj1… y la conexión al nodo P2P 9876 (nodo de arranque) y al nodo P2P 9877 (nodo 1).
- Puedes inspeccionar el registro del nodo 2 para consultar los mensajes intercambiados con el nodo 1 (nodo P2P 9877) ejecutando el siguiente comando:
cat nodes/02-node/02.log | grep :9877 -C 3
El resultado debería ser similar al siguiente:
Resultado:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9877 - 1a245d2
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9877- 1a245d2
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9877- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9877 - 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
Ten en cuenta que el nodo 2 aún no produce bloques, pero recibe bloques de otros nodos y los sincroniza, como el nodo de arranque y el nodo 1, por ahora.
- Para iniciar el nodo 3, inicia el daemon de servicio nodeos como una tarea en segundo plano y redirecciona stdout/stderr al archivo 03-node/03.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name produc.three \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/03-node/blocks \
--config-dir ~/nodes/03-node \
--data-dir ~/nodes/03-node \
--http-server-address 127.0.0.1:8891 \
--p2p-listen-endpoint 127.0.0.1:9879 \
--signature-provider EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6=KEY:5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
--p2p-peer-address 127.0.0.1:9878 \
>>~/nodes/03-node/03.log 2>&1 &
Esto iniciará el nodo 3 con algunos complementos, el nombre del productor produc.three, la escucha en el puerto HTTP 8891, el puerto P2P 9879 y el reemplazo de las claves de desarrollo predeterminadas con sus propias claves EOS5n44…. 5JCStv… y la conexión al nodo P2P 9876 (nodo de arranque), al nodo P2P 9877 (nodo 1) y al nodo P2P 9878 (nodo 2).
- Puedes inspeccionar el registro del nodo 3 para consultar los mensajes intercambiados con el nodo 2 (nodo P2P 9878) ejecutando el siguiente comando:
cat nodes/03-node/03.log | grep :9878 -C 3
El resultado debería ser similar al siguiente:
Resultado:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:`**`9878`** `- 1a245d2`
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:`**`9878`** `- 1a245d2`
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:`**`9878`** `- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:`**`9878`** `- 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
Ten en cuenta que el nodo 3 aún no produce bloques, pero recibe bloques de otros nodos y los sincroniza, como el nodo de arranque, el nodo 1 y el nodo 2, por ahora.
- Para iniciar el nodo 4, inicia el daemon de servicio nodeos como una tarea en segundo plano y redirecciona stdout/stderr al archivo 04-node/04.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name produce.four \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/04-node/blocks \
--config-dir ~/nodes/04-node \
--data-dir ~/nodes/04-node \
--http-server-address 127.0.0.1:8892 \
--p2p-listen-endpoint 127.0.0.1:9880 \
--signature-provider EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d=KEY:5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6 \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
--p2p-peer-address 127.0.0.1:9878 \
--p2p-peer-address 127.0.0.1:9879 \
>>~/nodes/04-node/04.log 2>&1 &
Esto iniciará el nodo 4 con algunos complementos, el nombre del productor produce.four, la escucha en el puerto HTTP 8892, el puerto P2P 9880 y el reemplazo de las claves de desarrollo predeterminadas con sus propias claves EOS5y3T…, 5JJjaK… y la conexión al nodo P2P 9876 (nodo de arranque), al nodo P2P 9877 (nodo 1), al nodo P2P 9878 (nodo 2) y al nodo P2P 9879 (nodo 3).
- Puedes inspeccionar el registro del nodo 4 para consultar los mensajes intercambiados con el nodo 3 (nodo P2P 9879) ejecutando el siguiente comando:
cat nodes/04-node/04.log | grep :9879 -C 3
La respuesta debería ser similar a la siguiente:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9879 - 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
Ten en cuenta que el nodo 4 aún no produce bloques, pero recibe bloques de otros nodos y los sincroniza, como el nodo de arranque y los nodos 1, 2 y 3, por ahora.
En este punto, se inician y conectan todos los nodos nuevos 1, 2, 3 y 4. Estos reciben y sincronizan bloques que produce el nodo de arranque, pero aún no los producen. Para ello, se deben elegir los nuevos productores. En una implementación de producción, los usuarios suelen votar por hasta 30 productores de un grupo de productores potenciales en el comando de votación. Los 21 productores principales son elegidos productores de bloques.
Aquí, usarás las cuentas de productores existentes para elegir a los únicos cuatro productores disponibles. Después de que se haya inmovilizado el 15% del suministro de tokens SYS, se proponen para producción los principales productores electos. Después de que se confirma y termina el bloque que contiene la lista de productores, los nuevos productores comienzan a producir bloques en la siguiente ronda programada.
- Usa el comando cleos system voteproducer prods para votar por productores específicos. La cuenta producer.one vota por sí misma y por los productores 2, 3 y 4. La cuenta producer.two vota por sí misma y por los productores 3 y 4. La cuenta produc.three vota por sí misma y por produce.four. La cuenta produce.four vota por sí misma.
cleos system voteproducer prods producer.one producer.one producer.two produc.three produce.four
cleos system voteproducer prods producer.two producer.two produc.three produce.four
cleos system voteproducer prods produc.three produc.three produce.four
cleos system voteproducer prods produce.four produce.four
La respuesta debería ser similar a la siguiente:
executed transaction: 833178bdc9d5b8c86778fa2b2c0f20e976f4c253cb6ebcaa6ade8eb8bf3d0a4f 144 bytes 861 us
# eosio <= eosio::voteproducer {"voter":"producer.one","proxy":"","producers":["produc.three","produce.four","producer.one","produc...
executed transaction: 9c4961678017bfc2a7fd1398a2e4b33e472a6cadc0340400ebe9207e188d7692 136 bytes 379 us
# eosio <= eosio::voteproducer {"voter":"producer.two","proxy":"","producers":["produc.three","produce.four","producer.two"]}
executed transaction: d3d23bae8730f18e82da53defaff7184c49b83181bb9b6fa32096684e61ed74d 128 bytes 371 us`
# eosio <= eosio::voteproducer {"voter":"produc.three","proxy":"","producers":["produc.three","produce.four"]}
executed transaction: 95f63d46554dd436388e36b017b8e350514ef5b407b1c33c5779dc29c862cdb6 120 bytes 304 us`
# eosio <= eosio::voteproducer {"voter":"produce.four","proxy":"","producers":["produce.four"]}
- Verifica el porcentaje de votos que emitió cada productor:
cleos system listproducers
La respuesta a los comandos anteriores debería ser la siguiente:
Producer Producer key Url Scaled votes
produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8 0.4000
produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj 0.3000
producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE 0.2000
producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8 0.1000
Ten en cuenta que el productor 1 obtuvo el 10% de los votos, luego el productor 2 obtuvo el 20%, el productor 3 obtuvo el 30% y, por último, el productor 4 obtuvo el 40%. Dado que la cantidad total de tokens SYS que inmovilizaron todos los productores es superior al 15% del suministro de tokens, se propondrán (de forma predeterminada) los 21 productores principales para la producción de bloques.
La producción en sí comenzará después de que se confirme como finalizado el bloque que contiene la lista de productores de bloques. Como solo hay cuatro productores, todos producirán, y se alcanzará una mayoría con tres de ellos.
- Verifica que los productores nuevos estén produciendo bloques:
tail -f nodes/01-node/01.log | grep Produced
El comando anterior debería mostrar los últimos bloques que produjo el productor 1. Si aún no ves ningún resultado, espera unos segundos. Hay cuatro productores que generan 12 bloques cada 6 segundos. Por lo tanto, debería haber 18 segundos entre el último bloque producido y el primero de la siguiente ronda.
La respuesta debería ser similar a la siguiente:
info 2021-10-28T15:31:47.904 nodeos producer_plugin.cpp:2333 produce_block ] Produced block adeb43a9249e0ef8...` **`#7035`** `@ 2021-10-28T15:31:48.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 36]
info 2021-10-28T15:31:48.400 nodeos producer_plugin.cpp:2333 produce_block ] Produced block 991c7f7addb6006e...` **`#7036`** `@ 2021-10-28T15:31:48.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]
...
info 2021-10-28T15:31:52.901 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c947dfab144600f7...` **`#7045`** `@ 2021-10-28T15:31:53.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]
info 2021-10-28T15:31:53.300 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c871f71b3ebe9151...` **`#7046`** `@ 2021-10-28T15:31:53.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]`
Si esperas 18 segundos más, deberías ver la siguiente ronda de 12 bloques producidos y así sucesivamente. También puedes verificar que los otros tres nodos produzcan bloques reemplazando los 01 del comando anterior por 02, 03 y 04.
-
Escribe Ctrl + C para salir del comando tail.
-
Verifica que el nodo de arranque haya dejado de producir bloques:
tail -f nodes/00-boot/00.log | grep Produced
Ten en cuenta que el comando anterior no debería producir ningún resultado, lo que demuestra que el nodo de arranque cedió la producción de bloques a los productores nuevos elegidos.
Ahora que tienes una cadena de bloques que funciona por completo con cuatro productores, debes quitarles a la cuenta predeterminada eosio y a la cuenta relacionada eosio.* todos los poderes para firmar transacciones y modificar el estado en la cadena de bloques. Para ello, debes volver a firmar las claves que usan las cuentas eosio y eosio.* restableciéndolas a null.
- Obtiene la información de la cuenta de eosio. Recuerda las claves asociadas con los permisos owner y active:
cleos get account eosio
La respuesta debería ser similar a la siguiente:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: unlimited used: 2.989 MiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
SYS balances:
liquid: 599999509.0258 SYS
staked: 0.0000 SYS
unstaking: 0.0000 SYS
total: 599999509.0258 SYS
- Vuelve a firmar las claves que usa la cuenta eosio y vincula sus permisos a la cuenta eosio.prods:
cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner
cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active
cleos get account eosio
La respuesta debería ser similar a la siguiente:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 eosio.prods@active
active 1: 1 eosio.prods@active
`memory:
quota: unlimited used: 2.989 MiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
SYS balances:
liquid: 599999509.0258 SYS
staked: 0.0000 SYS
unstaking: 0.0000 SYS
total: 599999509.0258 SYS
Recuerda que la cuenta eosio ya no tiene las claves de desarrollo predeterminadas asociadas con los permisos owner y active. Ahora son permisos secundarios del permiso principal eosio.prods@active. Este es el mismo grupo de cuentas que representa a todos los productores de bloques activos.
Por lo tanto, ahora la cuenta eosio está controlada esencialmente por la cuenta eosio.prods.
- Vuelve a firmar las claves que usan las cuentas de eosio* y vincula sus permisos a la cuenta de eosio:
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@owner
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@active
cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@owner
cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@active
cleos push action eosio updateauth '{"account": "eosio.names", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@owner
cleos push action eosio updateauth '{"account": "eosio.names", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@active
cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@owner
cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@active
cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@owner
cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@active
cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@owner
cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@active
cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@owner
cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@active
cleos push action eosio updateauth '{"account": "eosio.token", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@owner
cleos push action eosio updateauth '{"account": "eosio.token", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@active
cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@owner
cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@active
cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@owner
cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@active
Ahora las cuentas eosio.* ya no tienen las claves de desarrollo predeterminadas asociadas con los permisos owner y active. En cambio, los permisos son permisos secundarios del permiso principal eosio@active, que, a su vez, es un permiso secundario de la cuenta eosio.prods@active.
Por lo tanto, todas las cuentas del sistema, incluida eosio, están controladas esencialmente por la cuenta eosio.prods, que representa el grupo de cuentas de todos los productores de bloques activos. Ya creaste una cadena de bloques de EOSIO de varios nodos completamente operativa.
Haz clic en Revisar mi progreso para verificar el objetivo.
Realiza la transición de un productor de un solo nodo a productores de varios nodos
¡Felicitaciones!
En este lab, ampliaste la cadena de bloques de EOSIO de un solo nodo que se implementó anteriormente para crear una red de múltiples cadenas de bloques. También instalaste distintos componentes de software EOSIO para configurar tu cadena de bloques de EOSIO de varios nodos. Por último, realizaste algunas tareas de operador de nodo en tu nueva cadena de bloques de EOSIO.
Próximos pasos y más información
Capacitación y certificación de Google Cloud
Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.
Última actualización del manual: 12 de diciembre de 2024
Prueba más reciente del lab: 22 de octubre de 2024
Copyright 2026 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.