Agregar un Nodo al Conjunto de Validadores
Introducción
La Red Primaria es inherente a la plataforma Avalanche y valida las blockchains incorporadas en Avalanche. En este tutorial, agregaremos un nodo a la Red Primaria en Avalanche.
La P-Chain gestiona metadatos en Avalanche. Esto incluye hacer un seguimiento de qué nodos están en qué Subnets, qué blockchains existen y qué Subnets están validando qué blockchains. Para agregar un validador, emitiremos transacciones a la P-Chain.
Ten en cuenta que una vez que emites la transacción para agregar un nodo como validador, no hay forma de cambiar los parámetros. No puedes eliminar tu participación temprano o cambiar la cantidad de participación, el ID del nodo o la dirección de recompensa. Asegúrate de usar los valores correctos en las llamadas de API a continuación. Si no estás seguro, no dudes en unirte a nuestro Discord para hacer preguntas.
Requisitos
Has completado Ejecutar un nodo Avalanche y estás familiarizado con la arquitectura de Avalanche. En este tutorial, usamos AvalancheJS y la colección de Postman de Avalanche para ayudarnos a realizar llamadas de API.
Para asegurarte de que tu nodo esté bien conectado, asegúrate de que tu nodo pueda
recibir y enviar tráfico TCP en el puerto de participación (9651
de forma predeterminada) y que tu nodo
tenga una dirección IP pública (es opcional establecer --public-ip=[LA IP PÚBLICA DE TU NODO AQUÍ]
cuando ejecutes el binario AvalancheGo, ya que de forma predeterminada, el nodo intentará realizar
traversal NAT para obtener la IP del nodo según su enrutador). No hacer ninguna de
estas cosas puede poner en peligro tu recompensa de participación.
Agregar un validador con Avalanche Wallet
Primero, te mostramos cómo agregar tu nodo como validador usando Avalanche Wallet.
Obtener el ID del Nodo
Obtén el ID de tu nodo llamando a info.getNodeID
:
curl -X POST --data '{
"jsonrpc":"2.0",
"id" :1,
"method" :"info.getNodeID"
}' -H 'content-type:application/json' 127.0.0.1:9650/ext/info
La respuesta tiene el ID de tu nodo:
{
"jsonrpc": "2.0",
"result": {
"nodeID": "NodeID-5mb46qkSBj81k9g9e4VFjGGSbaaSLFRzD"
},
"id": 1
}
Agregar como validador
Abre la billetera, y ve a la pestaña Earn
(Ganar). Elige
Add Validator
(Agregar validador) bajo la sección Validate
(Validar).
Completa los parámetros de staking. Se explican con más detalle en este documento. Cuando hayas completado todos los parámetros de participación
y los hayas verificado, haz clic en Confirm
(Confirmar). Asegúrate de que el período de participación sea de al
menos 2 semanas, la tasa de tarifa de delegación sea de al menos 2% y estés haciendo stake de al
menos 2,000 AVAX en Mainnet (1 AVAX en Fuji Testnet).
Deberías ver un mensaje de éxito y tu saldo debería actualizarse.
Llamar a
platform.getPendingValidators
verifica que tu transacción haya sido aceptada. Ten en cuenta que esta llamada de API debe hacerse
antes de la hora de inicio de validación de tu nodo, de lo contrario, el retorno no incluirá
el ID de tu nodo ya que ya no está pendiente.
Vuelve a la pestaña Earn
(Ganar) y haz clic en Estimated Rewards
(Recompensas estimadas).
Una vez que haya pasado la hora de inicio de tu validador, verás las recompensas que puede ganar, así como su hora de inicio, hora de finalización y el porcentaje de su período de validación que ha pasado.
También puedes llamar a
platform.getCurrentValidators
para verificar que el ID de tu nodo esté incluido en la respuesta.
¡Eso es todo!
Agregar un validador con AvalancheJS
También podemos agregar un nodo al conjunto de validadores usando AvalancheJS.
Instalar AvalancheJS
Para usar AvalancheJS, puedes clonar el repositorio:
git clone https://github.com/ava-labs/avalanchejs.git
El método de clonación del repositorio utilizado es HTTPS, pero también se puede usar SSH:
git clone [email protected]:ava-labs/avalanchejs.git
Puedes encontrar más información sobre SSH y cómo usarlo aquí.
o agregarlo a un proyecto existente:
yarn add @avalabs/avalanchejs
Para este tutorial, usaremos ts-node
para ejecutar los scripts de ejemplo directamente desde un directorio AvalancheJS.
Flujo de trabajo de Fuji
En esta sección, usaremos la Testnet Fuji para mostrar cómo agregar un nodo al conjunto de validadores.
Abre tu directorio AvalancheJS y selecciona la carpeta
examples/platformvm
para ver el código fuente de los scripts de ejemplo.
Usaremos el script
buildAddValidatorTx.ts
para agregar un validador. Para obtener más información sobre la API buildAddValidatorTx
,
haz clic
aquí.
Clave privada
Localiza esta línea en el archivo
const privKey: string = `${PrivateKeyPrefix}${DefaultLocalGenesisPrivateKey}`;
y reemplázala con una clave privada que controles. Puedes usar este código para generar una nueva clave.
const privKey: string = "<TU-CLAVE-PRIVADA-AQUÍ>";
Configuración de red
La siguiente configuración funciona cuando se usa un nodo local iniciado con --network-id=fuji
:
const ip: string = "localhost";
const port: number = 9650;
const protocol: string = "http";
const networkID: number = 5;
Sin embargo, para conectarse directamente al servidor de la API de Avalanche Fuji Testnet, se necesitan los siguientes cambios:
const ip: string = "api.avax-test.network";
const port: number = 443;
const protocol: string = "https";
const networkID: number = 5;
Dependiendo de la networkID pasada al instanciar un objeto Avalanche
en el código, las direcciones codificadas utilizadas tendrán una Parte Legible por Humanos (HRP) distintiva por red.
Ejemplo de dirección: 5 - X-fuji
19rknw8l0grnfunjrzwxlxync6zrlu33yxqzg0h
Para Fuji Testnet, 5 es el valor correcto a usar.
Para obtener más información sobre las direcciones codificadas, haz clic aquí.
Configuración para la validación
A continuación, necesitamos especificar el período de validación y la tarifa de delegación del nodo.
const nodeID: string = "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg";
const startTime: BN = UnixNow().add(new BN(60 * 1));
const endTime: BN = startTime.add(new BN(26300000));
const delegationFee: number = 10;
ID del nodo
Esta es la ID del nodo del validador que se está agregando. Consulta la sección anterior sobre cómo recuperar la ID del nodo usando la API info.getNodeID
.
Período de staking
startTime
y endTime
son necesarios para especificar el momento de inicio/fin de la validación. La duración mínima en la que se puede validar la Red Primaria es de 2 semanas, y la duración máxima es de un año. Se puede iniciar una nueva validación en la Red Primaria después de terminar una, simplemente que la duración máxima continua es de un año. startTime
y endTime
son los tiempos Unix en los que tu validador comenzará y dejará de validar la Red Primaria, respectivamente. startTime
debe estar en el futuro en relación con el momento en que se emite la transacción.
El código de ejemplo usa const startTime: BN = UnixNow().add(new BN(60 * 1))
y const endTime: BN = startTime.add(new BN(26300000))
para calcular el tiempo Unix 1 minuto y 304 días en el futuro (en el momento en que se escribió este artículo) para usar como valores de startTime
y endTime
, respectivamente.
Puedes crear tu propio timestamp Unix aquí o usando el método UnixNow()
Para crear tus propios tiempos de inicio, sigue los pasos a continuación:
Localiza esta línea en el archivo
const startTime: BN = UnixNow().add(new BN(60 * 1));
const endTime: BN = startTime.add(new BN(26300000));
Cambia startTime
y endTime
por nuevos valores de BN
, por ejemplo:
const startTime: BN = new BN(1654656829); // Mié Jun 08 2022 02:53:49 GMT+0000
const endTime: BN = new BN(1662602029); // Jue Sep 08 2022 01:53:49 GMT+0000
Tarifa de delegación
Avalanche permite la delegación de stake. Este parámetro es la tarifa porcentual que cobra este validador cuando otros delegan stake en él. Por ejemplo, si la tarifa de delegación es 10
y alguien delega en este validador, entonces cuando el período de delegación haya terminado, el 10% de la recompensa va al validador y el resto va al delegador, si este nodo cumple con los requisitos de recompensa de validación.
Cantidad de stake
Establece la cantidad adecuada de stake al llamar a pchain.buildAddValidatorTx
reemplazando stakeAmount.minValidatorStake
con un número en la unidad de gwei, por ejemplo, BN(1e12)
que son 10,000 AVAX.
Direcciones
Por defecto, el ejemplo usa la variable pAddressStrings
para definir toAddresses
, fromAddresses
, changeAddresses
y rewardAddresses
:
const pAddressStrings: string[] = pchain.keyChain().getAddressStrings();
Esto recupera las direcciones de la P-Chain que pertenecen a la clave privada
que aparece antes en el ejemplo.
No se necesita ningún cambio en las direcciones para la acción predeterminada.
Ejecutar el código
Ahora que hemos realizado todos los cambios necesarios en el script de ejemplo, es hora de agregar un validador a la Red Fuji.
Ejecuta el comando:
ts-node examples/platformvm/buildAddValidatorTx.ts
La respuesta tiene el ID de transacción.
¡Éxito! TXID: 2ftDVwmss5eJk8HFsNVi6a3vWK9s3szZFhEeSY2HCS8xDb8Cra
Podemos verificar el estado de la transacción ejecutando el script de ejemplo: getTxStatus.ts
siguiendo los pasos a continuación:
-
Asegúrate de que tu configuración de red sea correcta antes de ejecutar el script.
-
Localiza esta línea en el archivo
const main = async (): Promise<any> => {
const txID: string = "x1NLb9JaHkKTXvSRReVSsFwQ38mY7bfD1Ky1BPv721VhrpuSE"
...
}
y reemplázala con el TXID de buildAddValidator
const main = async (): Promise<any> => {
const txID: string = "2ftDVwmss5eJk8HFsNVi6a3vWK9s3szZFhEeSY2HCS8xDb8Cra"
...
}
Ejecuta el comando:
ts-node examples/platformvm/getTxStatus.ts
Esto devuelve:
{ status: 'Committed' }
El estado debería ser Committed
, lo que significa que la transacción fue exitosa.
Podemos ver si el nodo est á ahora en el conjunto de validadores pendientes para la red Fuji usando el ejemplo: getPendingValidators.ts
. Simplemente cambia la configuración de red para cumplir con los requisitos de Fuji y luego ejecuta el script:
ts-node examples/platformvm/getPendingValidators.ts
La respuesta debería incluir el nodo que acabamos de agregar:
{
"validators": [
{
"nodeID": "NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg",
"startTime": "1654656829",
"endtime": "1662602029",
"stakeAmount": "1000000000"
}
],
"delegators": []
}
Cuando el tiempo alcance 1654656829
(Mié Jun 08 2022 02:53:49 GMT+0000), este nodo comenzará a validar la Red Primaria. Cuando alcance 1662602029
(Jue Sep 08 2022 01:53:49 GMT+0000), este nodo dejará de validar la Red Primaria. El AVAX con stake y las recompensas, si las hay, se devolverán a pAddressStrings
.
Personalización de direcciones
Hay 4 direcciones que se necesitan al llamar a pchain.buildAddValidatorTx
. Solo 2 de ellas se pueden cambiar: toAddresses
y rewardAddresses
. Por razones de compatibilidad con versiones anteriores, fromAddresses
y changeAddresses
son solo marcadores de posición y se ignoran.
toAddresses
Un arreglo de direcciones que reciben los tokens con stake al final del período de staking.
rewardAddresses
Cuando un validador deja de validar la Red Primaria, recibirá una recompensa si es suficientemente receptivo y correcto mientras validaba la Red Primaria. Estos tokens se envían a rewardAddresses
. La apuesta original se enviará de vuelta a las direcciones definidas en toAddresses
.
La apuesta de un validador nunca se reduce, sin importar su comportamiento, siempre recibirán su apuesta de vuelta cuando terminen de validar.
Localiza esta parte del código
let privKey: string = `${PrivateKeyPrefix}${DefaultLocalGenesisPrivateKey}`;
pKeychain.importKey(privKey);
y reemplaza privKey
con claves privadas que controlas. Para generar un nuevo par de claves, podemos usar el script de ejemplo createKeypair.ts
junto con la Configuración de la Red Fuji.
let privKey: string =
"PrivateKey-PY2dvfxzvBAe1a5nn7x23wmZMgAYJaS3XAZXzdUa22JtzUvKM";
pKeychain.importKey(privKey);
privKey = "PrivateKey-2Y3Vg9LShMJyUDBHzQqv5WtKDJ8yAVHyM3H5CNCBBmtg3pQEQG";
pKeychain.importKey(privKey);
privKey = "PrivateKey-NaV16owRSfa5TAtxtoU1BPUoM2y1ohttRbwKJG1j7onE4Ge1s";
pKeychain.importKey(privKey);
priKey = "PrivateKey-26JMUsR5RCkf5k9ME8WxKCWEuCK5s2SrALUn7vEa2urwyDDc91";
pKeychain.importKey(privKey);
const pAddressStrings: string[] = pchain.keyChain().getAddressStrings();
Este ejemplo crearía un keychain con 4 direcciones:
"P-fuji1jx644d9y00y5q4hz8cq4wr75a2erne2y4e32xc", // pAddressStrings[0]
"P-fuji1wchdgdp94j8tszlpsp56qvgkvdn20svpmnm8qk", // pAddressStrings[1]
"P-fuji1f36kkpy6yzd7ayrywxvvprns7qlrcu3hwqdya8", // pAddressStrings[2]
"P-fuji1qw7yt3fp43kuwsufff4vhezs2yl00slr09vmh5", // pAddressStrings[3]
Ahora podemos pasar cada dirección según su posición en el arreglo pAddressStrings
:
const unsignedTx: UnsignedTx = await pchain.buildAddValidatorTx(
utxoSet,
[pAddressStrings[0], pAddressStrings[1]], // toAddresses, una o más direcciones
[pAddressStrings[0]], // fromAddresses, requerido para compatibilidad hacia atr ás
[pAddressStrings[0]], // changeAddresses, requerido para compatibilidad hacia atrás
nodeID,
startTime,
endTime,
stakeAmount.minValidatorStake,
[pAddressStrings[2], pAddressStrings[3]], //rewardAddresses, una o más direcciones
delegationFee,
locktime,
threshold,
memo,
asOf
);
Flujo de trabajo en Mainnet
El flujo de trabajo en Fuji se puede adaptar a Mainnet con las siguientes modificaciones:
- La clave privada correcta.
- La configuración de red debe ser para un nodo de Mainnet, ya sea un nodo local en Mainnet o un servidor de API de Avalanche Mainnet donde se debe usar
api.avax.network
para laip
. const networkID: number = 1
basado en esto.- Establecer la cantidad correcta para hacer staking.