Instalación Red Privada EOSIO
Tutorial de Configuración de una Red Privada
Se pueden diseñar varias topologías en el sentido de cantidad de nodos o redundancia de los datos, sin embargo, para la practicidad de este tutorial, se utiliza la siguiente topología como referencia principal:
Requisitos Previos de Software
A la hora de configurar una red privada EOSIO hay algunos requisitos de instalación de software:
- Instalación de los binarios precompilados de EOSIO
- Instalación de los binarios EOSIO.CDT
Además, estamos utilizando Ubuntu 18.04 LTS, pero si quieres utilizar macOS u otro sistema operativo compatible, echa un vistazo a EOSIO releases
Instalación de los Binarios Pre-compilados de EOSIO
Ejecute los siguientes comandos para instalar los binarios precompilados de EOSIO:
$ wget https://github.com/eosio/eos/releases/download/v2.0.9/eosio_2.0.9-1-ubuntu-18.04_amd64.deb
$ sudo apt install ./eosio_2.0.9-1-ubuntu-18.04_amd64.deb
Una vez instalados los binarios de EOSIO; nodeos, una configuración de blockchain desde cero e interacciones con redes P2P son algunas de las funcionalidades disponibles que ofrece el protocolo.
Para desinstalar EOSIO ejecute
$ sudo apt remove eosio
Instalación de los Binarios EOSIO.CDT (Contract Development Toolkit)
EOSIO.CDT es un kit de herramientas que facilita el desarrollo de contratos inteligentes en una red de blockchain EOSIO. Para instalar EOSIO.CDT v1.6.3 ejecute los siguientes comandos:
$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.6.3/eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.deb
$ sudo apt install ./eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.debConfiguración del Nodo Génesis
Antes de configurar el nodo génesis, es necesario crear un directorio llamado
~/biosboot/genesis
, esto debido a las particularidades del protocolo. Así que, para esto ejecute lo siguiente:$ mkdir ~/biosboot
$ mkdir ~/biosboot/genesisAhora, crea un archivo llamado
genesis.json
en el directorio~/biosboot/
, para ello ejecuta el siguiente comando para crear y editar el archivo:$ nano ~/biosboot/genesis.json
Copie y pegue el siguiente contenido en el archivo creado anteriormente:
{
"initial_timestamp": "2018-12-05T08:55:11.000",
"initial_key": "EOS_PUB_DEV_KEY",
"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": 100000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 50000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}Esto puede ser cambiado más adelante utilizando la función privilegiada
set_param
. Puedes ver más en nuestras guías Funciones Importantes en EOSIO
Iniciar el Servicio nodeos
Antes de iniciar el servicio nodeos, es necesario crear el archivo genesis_start.sh
. Para ello, ejecute los siguientes comandos:
Cree el archivo
$ cd ~/biosboot/genesis
$ nano genesis_start.shPegue el siguiente contenido en el archivo
genesis_start.sh
:#!/bin/bash
DATADIR="./blockchain"
if [ ! -d $DATADIR ]; then mkdir -p $DATADIR;
fi
nodeos \
--genesis-json $DATADIR"/../../genesis.json" \
--signature-provider EOS_PUB_DEV_KEY=KEY:EOS_PRIV_DEV_KEY \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_api_plugin \
--plugin eosio::history_plugin \
--data-dir $DATADIR"/data" \
--blocks-dir $DATADIR"/blocks" \
--config-dir $DATADIR"/config" \
--producer-name eosio \
--http-server-address IP_NODO_GENESIS:8888 \
--p2p-listen-endpoint IP_NODO_GENESIS:9010 \
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--p2p-peer-address IP_PRODUCTOR1:9011 \
--p2p-peer-address IP_PRODUCTOR2:9012 \
--p2p-peer-address IP_PRODUCTOR2:9013 \
>> $DATADIR"/nodeos.log" 2>&1 & \
echo $! > $DATADIR"/eosd.pid"Recuerde reemplazar
EOS_PUB_DEV_KEY
yEOS_PRIV_DEV_KEY
con el par de claves generado anteriormente.Por último, asigne permiso de ejecución al script:
$ cd ~/biosboot/genesis/
$ chmod 755 genesis_start.sh
$ ./genesis_start.shUna vez ejecutado el comando anterior, el nodo génesis que llevará eosio como nombre podrá:
Producir bloques
Escuchar peticiones HTTP en
IP_NODO_GENESIS:8888
.Escuchar solicitudes de conexión con otros nodos en
IP_NODO_GENESIS:9010
.Imprimir la salida de los contratos inteligentes en el terminal
Registros del Servicio nodeos
Puedes inspeccionar los registros de servicios de nodeos con los siguientes comandos:
$ cd ~/biosboot/genesis/
$ tail -f ./blockchain/nodeos.log
Para salir del modo de impresión de registros, pulse CTRL+C.
Configuración y Compilación de eosio.contracts
Es necesario instalar la última versión de eosio.contracts
junto con la versión v1.8.0. Para facilitar la comprensión de los pasos aquí descritos, la última versión será referida como EOSIO_CONTRACTS_DIRECTORY
y la v1.8.0
como EOSIO_OLD_CONTRACTS_DIRECTORY
.
Los siguientes pasos de instalación deben seguirse en el orden en que aparecen.
- Clone y compile los
eosio.contracts
:$ cd ~
$ git clone https://github.com/EOSIO/eosio.contracts.git
$ cd ./eosio.contracts/
$ ./build.sh
$ cd ./build/contracts/ - Clone e instale
eosio.cdt
v1.6.3
:$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.6.3/eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.deb
$ sudo apt install ./eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.deb - Clone y compile
eosio.contracts
v1.8.0
:$ cd ~
$ git clone https://github.com/EOSIO/eosio.contracts.git eosio.contracts-1.8.x
$ cd ./eosio.contracts-1.8.x/
$ git checkout release/1.8.x
$ ./build.sh
$ cd ./build/contracts/
Despliegue del Contrato eosio.bios
Activar PREACTIVATE_FEATURE
Debido a las actualizaciones introducidas en la v1.8 y v2.0, es necesario activar una característica del protocolo llamada PREACTIVATE_FEATURE. Para activar esta característica, ejecute el siguiente comando:
$ curl --request POST \
--url http://IP_NODO_GENESIS:8888/v1/producer/schedule_protocol_feature_activations \
-d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'
Despliegue de la Versión Antigua de los Contratos
Ahora es necesario desplegar la versión antigua de los contratos inteligentes (EOSIO_OLD_CONTRACTS_DIRECTORY
), para ello ejecuta el siguiente comando:
$ cleos set contract eosio EOSIO_OLD_CONTRACTS_DIRECTORY/eosio.bios/
Salida de consola esperada
Reading WAST/WASM from /users/documents/eos/build/contracts/eosio.bios/eosio.bios.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 2150ed87e4564cd3fe98ccdea841dc9ff67351f9315b6384084e8572a35887cc 39968 bytes 4395 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001be023060027f7e0060067f7e7e7f7f...
# eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"buyrambytes","base":"","fields":[{"name":"p...
Ahora que se ha desplegado la versión antigua de los contratos, también es necesario activar las características especiales que se recomiendan para las redes basadas en el protocolo EOSIO. Para activar estas características, ejecute los siguientes comandos:
# 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
Desplegar la Última Versión de los Contratos
Una vez desplegada la versión antigua de los contratos y activadas las características, se procede a desplegar la versión reciente de los contratos:
$ cleos -U http://IP_NODO_GENESIS:8888 set contract eosio.bios EOSIO_CONTRACTS_DIRECTORY/eosio.bios/
Salida esperada de consola:
Reading WAST/WASM from ·/users/documents/eos/contracts/eosio.bios/eosio.bios.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 17fa4e06ed0b2f52cadae2cd61dee8fb3d89d3e46d5b133333816a04d23ba991 8024 bytes 974 us
# eosio <= eosio::setcode {"account":"eosio.bios","vmtype":0,"vmversion":0,"code":"0061736d01000000017f1560037f7e7f0060057f7e...
# eosio <= eosio::setabi {"account":"eosio.bios","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name"...
Nodos Productores de Bloques: Configuración y Ejecución
Debemos crear los archivos de configuración para cada productor de bloques en cada servidor. Dado que en la topología se han concebido tres productores de bloques, vamos a proceder a crear sus archivos correspondientes. Para ello, ejecute los siguientes comandos:
$ cd ~
$ mkdir productor1
$ touch ~/productor1/config.ini
$ touch ~/productor1/genesis.json
$ touch ~/productor1/start.sh
Una vez creados los archivos, copie el contenido del fragmento de código en cada archivo correspondiente y repita el proceso para cada directorio en cada servidor (cambie el nombre del directorio según el nodo):
config.ini
agent-name = productor1 # CAMBIAR ESTO DE ACUERDO AL NOMBRE DEL NODO
# PLUGINS
plugin = eosio::chain_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
plugin = eosio::producer_plugin
plugin = eosio::producer_api_plugin
# CHAIN
chain-state-db-size-mb = 16384
reversible-blocks-db-size-mb = 512
contracts-console = true
abi-serializer-max-time-ms = 2000
wasm-runtime = wabt
enable-stale-production = false
pause-on-startup = false
max-irreversible-block-age = -1
txn-reference-block-lag = 0
# BLOCK PRODUCER
producer-name = productor1 # CAMBIAR ESTO DE ACUERDO AL SERVIDOR
# PEERING NETWORK
p2p-server-address = IP_PRODUCTOR1:9876 # CAMBIAR ESTO DE ACUERDO A LA IP DEL SERVIDOR
p2p-listen-endpoint = 0.0.0.0:9876
p2p-max-nodes-per-host = 150
max-clients = 150
connection-cleanup-period = 30
sync-fetch-span = 2000
allowed-connection = any
p2p-peer-address = IP_NODO_SEMILLA:PUERTO_NODO_SEMILLA
p2p-peer-address = IP_PRODUCTOR2:PUERTO_PRODUCTOR2 # CAMBIAR ESTO DE ACUERDO AL NODO
p2p-peer-address = IP_PRODUCTOR3:PUERTO_PRODUCTOR3 # CAMBIAR ESTO DE ACUERDO AL NODO
p2p-peer-address = IP_NODO_API:PUERTO_NODO_API
genesis.json
{
"initial_timestamp": "2018-12-05T08:55:11.000",
"initial_key": "EOS_PUB_DEV_KEY",
"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": 100000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 50000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
start.sh
#!/usr/bin/env bash
DATA_DIR="blockchain"
CONFIG_DIR="./blockchain/config"
EOS_PUB_KEY=EOS_PUB_PRODUCER1_KEY # CAMBIAR ESTO DE ACUERDO AL NODO
EOS_PRIV_KEY=EOS_PRIV_PRODUCER1_KEY # CAMBIAR ESTO DE ACUERDO AL NODO
echo "Starting VALIDATOR Node...";
set -e;
ulimit -n 65535
ulimit -s 64000
mkdir -p $CONFIG_DIR
cp ./config.ini $CONFIG_DIR/config.ini
pid=0;
nodeos=$"nodeos \
--config-dir $CONFIG_DIR \
--data-dir $DATA_DIR \
--blocks-dir $DATA_DIR/blocks \
--signature-provider $EOS_PUB_KEY=KEY:$EOS_PRIV_KEY" ;
term_handler() {
if [ $pid -ne 0 ]; then
kill -SIGTERM "$pid";
wait "$pid";
fi
exit 0;
}
start_nodeos() {
$nodeos &
sleep 10;
if [ -z "$(pidof nodeos)" ]; then
$nodeos --hard-replay-blockchain &
fi
}
start_fresh_nodeos() {
echo 'Starting new chain from genesis JSON'
$nodeos --delete-all-blocks --genesis-json genesis.json &
}
trap 'echo "Shutdown of EOSIO service...";kill ${!}; term_handler' 2 15;
if [ ! -d $DATA_DIR/blocks ]; then
start_fresh_nodeos &
elif [ -d $DATA_DIR/blocks ]; then
start_nodeos &
fi
pid="$(pidof nodeos)"
while true
do
tail -f /dev/null & wait ${!}
done
Para ejecutar cada nodo es necesario entrar en el directorio, asignar permisos y ejecutar cada archivo start.sh
:
$ chmod 755 start.sh # asigna permisos de ejecución
$ ./start.sh
Crear Cuentas de Productores de Bloques
$ cleos -u http://IP_NODO_GENESIS:8888 create account eosio producer1 EOS_PUB_PRODUCER1_KEY
$ cleos -u http://IP_NODO_GENESIS:8888 create account eosio producer2 EOS_PUB_PRODUCER2_KEY
$ cleos -u http://IP_NODO_GENESIS:8888 create account eosio producer3 EOS_PUB_PRODUCER3_KEY
Configurar el Schedule de los Productores
Crea el archivo producers.json
y pega el siguiente contenido en él:
{"schedule":
[
{
"producer_name": "productor1",
"authority": [
"block_signing_authority_v0",
{
"threshold": 1,
"keys": [
{
"key":"EOS_PUB_PRODUCER1_KEY",
"weight":1
}
]
}
]
},
{
"producer_name":"productor2",
"authority": [
"block_signing_authority_v0",
{
"threshold":1,
"keys": [
{
"key":"EOS_PUB_PRODUCER2_KEY",
"weight":1
}
]
}
]
},
{
"producer_name":"productor3",
"authority": [
"block_signing_authority_v0",
{
"threshold":1,
"keys": [
{
"key":"EOS_PUB_PRODUCER3_KEY",
"weight":1
}
]
}
]
}
]
}
Ahora, ejecute el siguiente comando para establecer el schedule:
$ cleos -u http://IP_NODO_GENESIS:8888 push action eosio setprods "producers.json" -p eosio@active
Nodo API: Configuración y Ejecución
$ cd ~
$ mkdir nodo-api
$ cd nodo-api
$ touch config.ini
$ touch genesis.json
$ touch start.sh
Ahora copie el contenido del fragmento de código en el archivo correspondiente:
config.ini
agent-name = nodo-api
# PLUGINS
plugin = eosio::chain_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
plugin = eosio::producer_plugin
plugin = eosio::producer_api_plugin
# HTTP
access-control-allow-origin = *
http-validate-host = false
verbose-http-errors = true
http-server-address = 0.0.0.0:80
# SSL
#https-server-address = 0.0.0.0:443
#https-certificate-chain-file = ./ssl/domain.crt
#https-private-key-file = ./ssl/domain.priv.key
# CHAIN
chain-state-db-size-mb = 16384
reversible-blocks-db-size-mb = 512
abi-serializer-max-time-ms = 2000
contracts-console = true
# PEERING NETWORK
p2p-listen-endpoint = 0.0.0.0:9876
p2p-server-address = IP_NODO_API:9876
p2p-max-nodes-per-host = 150
max-clients = 150
sync-fetch-span = 2000
p2p-peer-address = IP_PRODUCTOR1:PUERTO_PRODUCTOR1
p2p-peer-address = IP_PRODUCTOR2:PUERTO_PRODUCTOR2
p2p-peer-address = IP_PRODUCTOR3:PUERTO_PRODUCTOR3
p2p-peer-address = IP_NODO_SEMILLA:PUERTO_NODO_SEMILLA
genesis.json
{
"initial_timestamp": "2018-12-05T08:55:11.000",
"initial_key": "EOS_PUB_DEV_KEY",
"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": 100000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 50000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
start.sh
#!/usr/bin/env bash
DATA_DIR="blockchain"
CONFIG_DIR="./blockchain/config"
echo "Starting API Node...";
set -e;
ulimit -n 65535
ulimit -s 64000
mkdir -p $CONFIG_DIR
cp ./config.ini $CONFIG_DIR/config.ini
pid=0;
nodeos=$"nodeos \
--config-dir $CONFIG_DIR \
--data-dir $DATA_DIR \
--blocks-dir $DATA_DIR/blocks" ;
term_handler() {
if [ $pid -ne 0 ]; then
kill -SIGTERM "$pid";
wait "$pid";
fi
exit 0;
}
start_nodeos() {
$nodeos &
sleep 10;
if [ -z "$(pidof nodeos)" ]; then
$nodeos --hard-replay-blockchain &
fi
}
start_fresh_nodeos() {
echo 'Starting new chain from genesis JSON'
$nodeos --delete-all-blocks --genesis-json genesis.json &
}
trap 'echo "Shutdown of EOSIO service...";kill ${!}; term_handler' 2 15;
if [ ! -d $DATA_DIR/blocks ]; then
start_fresh_nodeos &
elif [ -d $DATA_DIR/blocks ]; then
start_nodeos &
fi
pid="$(pidof nodeos)"
while true
do
tail -f /dev/null & wait ${!}
done
Para iniciar el nodo, asigne permisos de ejecución a start.sh
y ejecútelo:
$ chmod 755 start.sh
$ ./start.sh
Nodo Semilla: Configuración y Ejecución
$ cd ~
$ mkdir nodo-semilla
$ touch config.ini
$ touch genesis.json
$ touch start.sh
Ahora copie el contenido del fragmento de código en el archivo correspondiente:
config.ini
# EOSIO Testnet SEED NODE Config file
# https://eoscostarica.io
agent-name = nodo-semilla
# PLUGINS
plugin = eosio::chain_plugin
# CHAIN
chain-state-db-size-mb = 16384
reversible-blocks-db-size-mb = 512
contracts-console = true
abi-serializer-max-time-ms = 2000
# PEERING NETWORK
p2p-listen-endpoint = 0.0.0.0:9876
p2p-server-address = IP_NODO_SEMILLA:9876
p2p-peer-address = IP_PRODUCTOR1:PUERTO_PRODUCTOR1
p2p-peer-address = IP_PRODUCTOR2:PUERTO_PRODUCTOR2
p2p-peer-address = IP_PRODUCTOR3:PUERTO_PRODUCTOR3
p2p-peer-address = IP_NODO_API:PUERTO_NODO_API
genesis.json
{
"initial_timestamp": "2018-12-05T08:55:11.000",
"initial_key": "EOS_PUB_DEV_KEY",
"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": 100000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 50000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
start.sh
#!/usr/bin/env bash
echo "Starting SEED Node...";
set -e;
ulimit -n 65535
ulimit -s 64000
mkdir -p $CONFIG_DIR
cp $WORK_DIR/config.ini $CONFIG_DIR/config.ini
pid=0;
nodeos=$"nodeos \
--config-dir $CONFIG_DIR \
--data-dir $DATA_DIR \
--blocks-dir $DATA_DIR/blocks" ;
term_handler() {
if [ $pid -ne 0 ]; then
kill -SIGTERM "$pid";
wait "$pid";
fi
exit 0;
}
start_nodeos() {
$nodeos &
sleep 10;
if [ -z "$(pidof nodeos)" ]; then
$nodeos --hard-replay-blockchain &
fi
}
start_fresh_nodeos() {
echo 'Starting new chain from genesis JSON'
$nodeos --delete-all-blocks --genesis-json $WORK_DIR/genesis.json &
}
trap 'echo "Shutdown of EOSIO service...";kill ${!}; term_handler' 2 15;
if [ ! -d $DATA_DIR/blocks ]; then
start_fresh_nodeos &
elif [ -d $DATA_DIR/blocks ]; then
start_nodeos &
fi
pid="$(pidof nodeos)"
while true
do
tail -f /dev/null & wait ${!}
done
Para iniciar el nodo semilla, simplemente asigne permisos de ejecución al archivo start.sh
y ejecútelo:
$ chmod 755 start.sh
$ ./start.sh
Detener el Servicio nodeos
Crea el archivo stop.sh
en el directorio ~/biosboot/genesis/
y copia el siguiente contenido:
#!/bin/bash
DATADIR="./blockchain/"
if [ -f $DATADIR"/eosd.pid" ]; then
pid=`cat $DATADIR"/eosd.pid"`
echo $pid
kill $pid
rm -r $DATADIR"/eosd.pid"
echo -ne "Stopping Node"
while true; do
[ ! -d "/proc/$pid/fd" ] && break
echo -ne "."
sleep 1
done
echo -ne "\rNode Stopped. \n"
fi
Ahora puede ejecutar el archivo stop.sh
:
$ chmod 755 stop.sh
$ ./stop.sh
Reiniciar el Servicio nodeos
Es importante tener en cuenta que una vez que el nodo está produciendo bloques no es posible reiniciar el servicio nodeos utilizando el mismo script creado en la sección Iniciar el servicio nodeos, ya que la base de datos del blockchain ya contiene información de la ejecución inicial. Por eso se recomienda crear un nuevo script con el nombre start.sh
. Este archivo puede seguir utilizándose para futuros reinicios del nodo una vez que el proceso se haya detenido.
Copie y pegue el siguiente contenido en el archivo start.sh
:
#!/bin/bash
DATADIR="./blockchain"
EOS_PUB_KEY=EOS_PUB_KEY_HERE
EOS_PRIV_KEY=EOS_PRIV_KEY_HERE
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;
fi
nodeos \
--signature-provider EOS_PUB_KEY=KEY:EOS_PRIV_KEY \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_api_plugin \
--plugin eosio::history_plugin \
--data-dir "blockchain/data" \
--blocks-dir $DATADIR"/data/blockchain/blocks" \
--config-dir $DATADIR"/config" \
--producer-name eosio \
--http-server-address IP_NODO_GENESIS:8888 \ # configurable
--p2p-listen-endpoint IP_NODO_GENESIS:9010 \ # configurable
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--p2p-peer-address IP_PRODUCTOR1:PUERTO_PRODUCTOR1 \
--p2p-peer-address IP_PRODUCTOR2:PUERTO_PRODUCTOR2 \
--p2p-peer-address IP_PRODUCTOR3:PUERTO_PRODUCTOR3 \
>> $DATADIR"/nodeos.log" 2>&1 & \
echo $! > $DATADIR"/eosd.pid"
Ahora, asigna permisos de ejecución al archivo start.sh
y ejecútalo:
$ chmod 755 start.sh
$ ./start.sh
El siguiente fragmento de código corresponde al script hard_replay.sh
con la bandera --hard-replay-blockchain
:
DATADIR="./blockchain"
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;
fi
nodeos \
--signature-provider EOS_PUB_DEV_KEY=KEY:EOS_PRIV_DEV_KEY \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_api_plugin \
--plugin eosio::history_plugin \
--data-dir $DATADIR"/data" \
--blocks-dir $DATADIR"/blocks" \
--config-dir $DATADIR"/config" \
--producer-name eosio \
--http-server-address IP_NODO_GENESIS:8888 \ # configurable
--p2p-listen-endpoint IP_NODO_GENESIS:9010 \ # configurable
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--p2p-peer-address IP_PRODUCTOR1:PUERTO_PRODUCTOR1 \
--p2p-peer-address IP_PRODUCTOR2:PUERTO_PRODUCTOR2 \
--p2p-peer-address IP_PRODUCTOR3:PUERTO_PRODUCTOR3 \
--hard-replay-blockchain \
>> $DATADIR"/nodeos.log" 2>&1 & \
echo $! > $DATADIR"/eosd.pid"
"perhaps we need to replay": este error puede producirse al reiniciar nodeos debido a que falta la bandera
--hard-replay-blockchain
(parámetro que reproduce todas las transacciones del nodo génesis). Para solucionar este error, ejecute el scripthard_replay.sh
.
Reiniciar nodeos desde Cero
Para reiniciar el servicio nodeos desde cero, crea el script clean.sh
, copia el siguiente contenido y dale permisos de ejecución (chmod 755 clean.sh
):
#!/bin/bash
rm -fr blockchain
ls -al
Si desea eliminar la configuración actual, los datos de la cadena de bloques y los archivos de registro, ejecute los siguientes comandos en el orden en que aparecen:
$ cd ~/biosboot/genesis/
$ ./stop.sh
$ ./clean.sh
$ ./genesis_start.sh
Interactuar con la Red
En este punto, la red es capaz de albergar cualquier contrato. Supongamos que quieres desplegar un contrato como easycontract el repo de ejemplo de EOS Costa Rica. Después de seguir las instrucciones especificadas allí, puede llamar a la acción save
de easycontract de la siguiente manera:
cleos -u URL_NODO_AQUI push action easycontract save '{"date":"2021/01/10 21:01:35","filename":"ejemplo.pdf","path":"/var/www/docs"}' -p easycontract@active
Tras la ejecución, obtendrá una salida en el terminal.
Obtener Datos Almacenados
cleos -u URL_NODO_AQUI get transaction ID_TRANSACCION_AQUI