Existe un tipo de implementación de nodoos que es crucial para el funcionamiento de numerosos servicios principales de WAX, como Hyperion Full History y la API de Activos Atómicos, y ese es el servicio de Estado-Historial.
Esta guía te mostrará cómo construir, configurar y desplegar nodeos para proporcionar funcionalidad de Estado-Historial, también conocida como un nodo de Protocolo de Historial de Estado (SHIP).
Este artículo ha sido actualizado para incorporar el proceso de construcción de software_ Antelope.
Cómo configurar un nodo de Estado-Historial de WAX
El complemento de Estado-Historial es utilizado por nodeos para capturar datos históricos sobre el estado de la cadena de bloques (en este caso, WAX Mainnet) y almacenar estos datos en un formato de archivo plano legible externamente.
Este complemento abre una interfaz websocket que puede ser utilizada por múltiples servicios externos simultáneos, como Hyperion y Atomic, para leer estos datos de manera simple y efectiva.
Dado lo dependientes que son los servicios externos de los nodos SHIP, es crucial que un Gremio proporcione un servicio sólido y confiable que pueda escalar para satisfacer las demandas de los requisitos en expansión de WAX Mainnet.
Este artículo guiará a través de un ejemplo que es válido actualmente (septiembre de 2022) y que está en uso por el Gremio EOSphere, que está sirviendo múltiples conexiones websocket tanto para nuestros propios servicios como para servicios de otros Gremios.
Requisitos de la Mainnet
Hardware
- CPU de 4 núcleos / 4Ghz+
- (1) Disco de 256GB+ / SSD de calidad empresarial o NVMe (Requisito de Alta Resistencia)
- (2) Disco de 10TB+ / SAS o SATA son aceptables, sin embargo, se prefieren SSD o NVMe
Actualmente (septiembre de 2022), los directorios blocks
y state-history
ocupan poco menos de 8TB de espacio en disco.
2.1T ./blocks
5.7T ./state-history
7.8T .
- RAM de 128GB+
Sistema Operativo
- Ubuntu 18.04
- Ubuntu 20.04 (Recomendado)
- Ubuntu 22.04
Internet
- Conexión de banda ancha moderna / Fibra óptica (síncrona de 100Mb/s o superior)
Preparar el Entorno del Sistema Operativo
Antes de que se construya y configure el software de WAX, es necesario configurar el entorno del sistema operativo, en este caso Ubuntu 20.04, para el rendimiento y la carga que va a soportar.
Sistema de Archivos Zettabyte (ZFS)
Esta construcción de nodo utiliza 2 Discos SAS Discretos para equilibrar la E/S del disco y proporcionar una opción de almacenamiento más asequible para los directorios /blocks
y /state-history
, que actualmente son 8TB y están en crecimiento.
Disco 1 es el SSD o NVMe de grado empresarial de alta velocidad que será el disco del sistema operativo utilizado para el software de WAX, toda la configuración y los archivos de estado. Los archivos de estado son extremadamente intensivos en E/S, la vida útil de un SSD basado en consumidores será breve debido al alto número de escrituras, de ahí la necesidad de usar un SSD o NVMe de alta resistencia de grado empresarial.
Nota: Es necesario mencionar que existen mecanismos para ejecutar estos archivos de estado en memoria si se dispone de suficiente, este tema se tratará en un artículo futuro.
En este ejemplo, el Disco 1 ejecutará el sistema operativo predeterminado Ext4 File System que ya estará implementado durante la instalación de Ubuntu 20.04.
Disco 2 es el disco SATA o SAS de gran capacidad que alojará los directorios /blocks
y /state-history
. Las demandas de E/S en estos directorios son mucho más bajas que los archivos de estado y los discos basados en husillos de mayor capacidad y más lentos siguen siendo adecuados.
En este ejemplo, el Disco 2 ejecutará el Sistema de Archivos ZFS que nos proporcionará dos beneficios principales. ZFS nos permitirá usar la compresión LZ4 y mejorará la E/S del disco con Adaptive Replacement Cache (ARC). La compresión solo se utilizará para el directorio /blocks (que actualmente tiene una ganancia de 1.3x) ya que no hay beneficios en el archivo plano de state-history ya optimizado.
Implemente ZFS en el Disco 2 con la siguiente configuración:
# Instalar ZFS
> sudo apt-get install zfsutils-linux
# Localizar el nombre del dispositivo del Disco 2
> lsblk
# Crear un Pool ZFS llamado "datavolume" en el dispositivo "sdb"
> sudo zpool create datavolume /dev/sdb
# Habilitar la compresión LZ4
> sudo zfs set compression=lz4 datavolume
# Desactivar las actualizaciones de tiempo de acceso de ZFS
> sudo zfs set atime=off datavolume
# Establecer ARC para cachear solo metadatos
> sudo zfs set primarycache=all datavolume
# Establecer la ubicación del punto de montaje en su ubicación preferida
> sudo zfs set mountpoint=/home/eosphere/datavolume datavolume
# Crear las carpetas específicas para /blocks y /state-history
> mkdir /home/eosphere/datavolume/blocks
> mkdir /home/eosphere/datavolume/state-history
# Establecer un punto de montaje específico para /blocks y /state-history
> sudo zfs create -o mountpoint=/home/eosphere/datavolume/blocks datavolume/blocks
> sudo zfs create -o mountpoint=/home/eosphere/datavolume/state-history datavolume/state-history
# Desactivar la compresión lz4 en el punto de montaje state-history
> sudo zfs set compression=none datavolume/state-history
# Verificar la configuración de ZFS
> zfs get all
Protocolo de Tiempo de Red (NTP)
Es crucial para una cadena de bloques globalmente entrelazada tener tiempo sincronizado en todos los nodos.
Chrony es un excelente cliente NTP y es bastante adecuado para las necesidades de la WAX Mainnet.
Instale, configure y verifique como se muestra a continuación:
# Instalar Chrony
> sudo apt install chrony
# Si es necesario, agregue manualmente pares locales, estos son servidores AU
> sudo nano /etc/chrony/chrony.conf
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
# Reiniciar Chrony
> sudo /etc/init.d/chrony restart
# Verificar
> chronyc sources -v
> chronyc tracking
# Establecer su zona horaria local si es necesario
> sudo timedatectl set-timezone Australia/Perth
Límites de Pila y Archivos Abiertos
La dirección de memoria del software de WAX y el número de solicitudes de API que recibirá un Nodo Principal de Producción requieren que se aumenten los límites predeterminados de Pila y Número de Archivos Abiertos de Ubuntu 20.04.
Configure y verifique los límites aumentados de la siguiente manera:
> sudo nano /etc/systemd/system.conf
# Agregar la siguiente configuración
DefaultLimitNOFILE=64000
DefaultLimitSTACK=65536000
# Reiniciar el servidor y verificar
> ulimit -a
Compilar el Software
El software de WAX se deriva del software Antelope de código abierto, sin embargo, se ha modificado para adaptarse a las necesidades de la Red de Protocolo de WAX.
Actualmente, la versión y construcción de software de WAX Block Producer aceptada es `v3.
1.0wax01` creada por cc32d9, miembro del EOS Amsterdam Guild
La última etiqueta de construcción de wax
está disponible actualmente en cc32d9 Github
Proceso de Construcción
Este ejemplo utiliza Ubuntu Linux para compilar el software de WAX desde el origen siguiendo el proceso a continuación:
> cd ~
> sudo apt install -y file
> git clone https://github.com/cc32d9/wax-leap.git
> cd wax-leap
> git checkout v3.1.0.wax01
> git submodule update --init --recursive
> sudo bash scripts/install_deps.sh
> mkdir build
# Si es necesario, suplemente $(nproc) a continuación con el número de trabajos que su servidor puede soportar, sugiero 4GB de RAM requeridos / trabajo
> nice bash scripts/pinned_build.sh ~/wax-leap/build/leap-deps ~/wax-leap/build $(nproc)
# Los binarios están ubicados en ~/wax-leap/build/programs
Configuración
Ahora que se ha compilado una versión limpia del software de WAX, procedamos a configurar state-history para la operación de la WAX Mainnet.
Para configurar y iniciar el nodo se utilizará nodeos
, que es el daemon del servicio principal que se ejecuta en cada nodo de la Red de Protocolo de WAX.
nodeos
puede configurarse para procesar contratos inteligentes, validar transacciones, producir bloques que contienen transacciones válidas y confirmar bloques para registrarlos en la cadena de bloques.
Las funciones operativas principales de nodeos
son; ejecutarlo como Productor de Bloques, Punto Final de API de Red, Nodo Semilla P2P o Nodo de Estado-Historial. Típicamente, en una red concurrida como la WAX Mainnet, separaría estas funciones en servidores físicamente discretos.
En este ejemplo de la WAX Mainnet, hará que su nodo se conecte a otros pares de red y esté disponible para conexiones API y Websocket como un nodo de Estado-Historial (SHIP).
nodeos
requiere dos archivos para conectarse a pares y ejecutarse en la WAX Mainnet:
config.ini
Cree un config.ini
predeterminado ejecutando nodeos
sin configuración como se muestra a continuación:
> mkdir ~/waxdata
> cd ~/wax-leap/build/programs/nodeos
> ./nodeos --data-dir ~/waxdata --config-dir ~/waxdata
Luego podrá editar el config.ini
recién creado y ver todos los parámetros disponibles:
> cd ~/waxdata> nano config.ini
Ahora edite el config.ini
y agregue la siguiente configuración:
# la ubicación del directorio de bloques en el Disco 2
blocks-dir = /home/eosphere/datavolume/blocks
wasm-runtime = eos-vm-jit
chain-state-db-size-mb = 131072
chain-state-db-guard-size-mb = 1024
read-mode = head
http-server-address = 0.0.0.0:8888
access-control-allow-origin = *
access-control-allow-headers = Origin, X-Requested-With, Content-Type, Accept
http-max-response-time-ms = 100
verbose-http-errors = true
http-validate-host = false
p2p-listen-endpoint = 0.0.0.0:9876
# 3dkrenderwax: FI, wax-peer
p2p-peer-address = peer.3dkrender.com:9880
# 3dkrenderwax: FI, query
p2p-peer-address = query.3dkrender.com:9880
# amsterdamwax: NL, Amsterdam
p2p-peer-address = wax.eu.eosamsterdam.net:9101
# amsterdamwax: US, Washington, D.C.
p2p-peer-address = waxp2p.us.eosamsterdam.net:9101
# blokcrafters: CA, Montreal, Quebec
p2p-peer-address = wax-peer-ca.blokcrafters.io:9876
# blokcrafters: FI, Helsinki, Uusimaa
p2p-peer-address = wax-peer-eu.blokcrafters.io:9876
# bp.box: KY, Cayman Islands
p2p-peer-address = wax.defibox.xyz:9966
# bp.wecan: GB, London
p2p-peer-address = seed2-wax-mainnet.wecan.dev:14998
# bp.wecan: US, NewYork
p2p-peer-address = seed3-wax-mainnet.wecan.dev:14998
# cryptolions1: DE, Germany-Finland
p2p-peer-address = wax.cryptolions.io:9876
# dapplica: DE, Germany-Finland
p2p-peer-address = wax.dapplica.io:9876
# eosauthority: DE, Falkenstein
p2p-peer-address = node-wax.eosauthority.com:10301
# eosauthority: FI, Helsinki
p2p-peer-address = node-wax-p2p.eosauthority.com:10301
# eosdacserver: GB, United Kingdom
p2p-peer-address = wax-p2p.eosdac.io:29876
# eosdublinwow: FI, Finland
p2p-peer-address = wax.p2p.eosdublin.io:9876
# eoseouldotio: JP, Seoul
p2p-peer-address = p2p.wax.eoseoul.io:29876
# eosphereiobp: CA, Beauharnois
p2p-peer-address = peer1-wax.eosphere.io:9876
# eosphereiobp: CA, Beauharnois
p2p-peer-address = peer2-wax.eosphere.io:9876
# greeneosiobp: DE, Germany
p2p-peer-address = p2p1.wax.greeneosio.com:9876
# guild.nefty: DE, Germany
p2p-peer-address = p2p-node1.neftyblocks.com:9876
# guild.nefty: FI, Finland
p2p-peer-address = p2p-node2.neftyblocks.com:9876
# ledgerwiseio: FI, LB
p2p-peer-address = waxp2p.ledgerwise.io:21877
# nation.wax: CA, Canada
p2p-peer-address = wax.seed.eosnation.io:9876
# oneinacilian: GB, United Kingdom
p2p-peer-address = p2p.oiac.io:9876
# sentnlagents
: GB, United Kingdom
p2p-peer-address = waxp2p.sentnl.io:9876
# tokengamerio: DE, Germany
p2p-peer-address = peer2.wax.tgg.gg:9876
# waxhiveguild: FI, Finnland
p2p-peer-address = peer1.hivebp.io:9876
# waxhiveguild: DE, Germany
p2p-peer-address = peer2.hivebp.io:9876
# waxmadrid111: DE, SEED
p2p-peer-address = wax-seed.eosiomadrid.io:9876
# waxswedenorg: SE, Sweden
p2p-peer-address = p2p.waxsweden.org:35777
# Lista de Pares - https://validate.eosnation.io/wax/reports/config.html
agent-name = "<su nombre> Nodo de Estado-Historial WAX Mainnet"
sync-fetch-span = 500
state-history-dir = /home/eosphere/datavolume/state-history
trace-history = true
chain-state-history = true
state-history-endpoint = 0.0.0.0:8080
plugin = eosio::http_plugin
plugin = eosio::state_history_plugin
plugin = eosio::chain_plugin
plugin = eosio::chain_api_plugin
genesis.json
Estos son los parámetros de estado iniciales requeridos por cada nodo nuevo que comienza en la WAX Mainnet. Cree el archivo de la siguiente manera:
> cd ~/waxdata
> nano genesis.json
Agregue los siguientes parámetros al archivo genesis.json
para la WAX Public Mainnet:
{
"initial_timestamp": "2019-06-05T12:00:00.000",
"initial_key": "EOS8i2pkwtv2JmdYWNJdcy5BcJ7wCE5q6mpE1hwT25HdgHMzeRday",
"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": 500000,
"target_block_cpu_usage_pct": 2000,
"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": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}
Ejecutar Nodeos
Ahora que se ha configurado el config.ini
y se han creado los parámetros iniciales de la cadena de bloques de la WAX Mainnet en genesis.json
, ahora puede unirse a la red y sincronizar el nodo.
Use screen para mantener viva su sesión incluso cuando se desconecte, el uso es el siguiente:
# Crear una nueva sesión de screen
> screen -US wax
# Desconectar la sesión de screen
> ctrl-a+d
# Reconectar la sesión de screen
> screen -r wax
Ejecute nodeos
con punteros al archivo de configuración, directorio de datos y archivo de inicio de genesis:
> cd ~/wax-leap/build/programs/nodeos
> ./nodeos --data-dir ~/waxdata --config-dir ~/waxdata --genesis-json ~/waxdata/genesis.json --disable-replay-opts
Su nodo de la WAX Mainnet ahora comenzará a sincronizarse con los pares configurados y alcanzará el último bloque de la cadena de la WAX Mainnet.
En el momento de la escritura (septiembre de 2022), esto puede tomar hasta un mes para una sincronización completa de bloques desde el génesis. También puede ayudar si elige algunos pares ubicados cercanos para limitar la sobrecarga de los pares y garantizar una latencia baja.
A medida que su nodo sincroniza desde el inicio de la cadena, construirá los archivos de registro e índice en los directorios /blocks
y /state-history
.
Su nodo será accesible a través del puerto http 8888 para consultas y ws 8080 para state-history.
Estas Guías Técnicas para Desarrolladores de WAX se crean utilizando material fuente de la Serie Técnica de Cómo Hacer de EOSphere WAX
Asegúrese de hacer cualquier pregunta en el Telegram de EOSphere