Generación y Firma de Mensajes de Salida
Almacenamiento de Claves o Dirk
Si tus claves de firma de validador están en keystores o en un gestor de claves remoto como Dirk, el método más sencillo es utilizar ethdo.
Para Keystores:
- Crear una billetera ethdo
- Importar keystores
- Generar un retiro
- Borrar la billetera si ya no es necesaria
Crear una nueva billetera:
./ethdo --base-dir=./temp wallet create --wallet=wallet
Agregar una clave desde un keystore:
./ethdo --base-dir=./temp account import --account=wallet/account --keystore=./ethdo/keystore.json --keystore-passphrase=12345678 --passphrase=pass
Generar y firmar un mensaje de salida:
./ethdo --base-dir=./temp validator exit --account=wallet/account --passphrase=pass --json --connection=http://consensus_node:5052
ethdo imprimirá el mensaje de salida en la salida estándar. Puedes guardar el archivo ethdo ... > 0x123.json
.
Una vez finalizado, borrar la billetera:
./ethdo --base-dir=./temp wallet delete --wallet=wallet
Si buscas automatizar el proceso, revisa este ejemplo.
Aunque los keystores están encriptados, se recomienda interactuar con ellos en un entorno seguro sin acceso a internet.
ethdo te permite preparar todo lo necesario para la generación offline de mensajes de salida en un archivo conveniente. Para ello, en una máquina con acceso a un Nodo de Consenso ejecuta:
./ethdo validator exit --prepare-offline --connection=http://consensus_node:5052 --timeout=300s
Este comando obtendrá la información de los validadores, versiones de forks, epoch actual y otros datos de la cadena para la generación offline de mensajes de salida, guardando todo en offline-preparation.json
en el directorio ethdo
.
Este archivo puede ser transferido luego a una máquina segura junto con el binario de ethdo
, por ejemplo en una unidad USB encriptada.
En la máquina segura, coloca offline-preparation.json
en el directorio desde donde se ejecuta ethdo
, utiliza el argumento --offline
para el comando validator exit
y elimina --connection
:
./ethdo --base-dir=./temp validator exit --account=wallet/account --passphrase=pass --json --offline
Para Dirk:
./ethdo --remote=server.example.com:9091 --client-cert=client.crt --client-key=client.key --server-ca-cert=dirk_authority.crt validator exit --account=Validators/1 --json --connection=http://127.0.0.1:5051
Para Web3Signer u Otros Firmadores Propietarios
Si estás utilizando el endpoint /api/v1/modules/{module_id}/validators/generate-unsigned-exit-messages/{operator_id}
de KAPI, puedes omitir obtener el epoch y construir un mensaje de salida no firmado en el siguiente ejemplo.
Obtener el epoch actual:
const blockReq = await fetch(CONSENSUS_BLOCK_ENDPOINT)
const blockRes = await blockReq.json()
const blockNumber = blockRes.data.message.slot
const currentEpoch = Math.floor(blockNumber / 32)
Obtener parámetros del fork:
const forkReq = await fetch(CONSENSUS_FORK_ENDPOINT)
const forkRes = await forkReq.json()
const fork = forkRes.data
Obtener parámetros de genesis:
const genesisReq = await fetch(CONSENSUS_GENESIS_ENDPOINT)
const genesisRes = await genesisReq.json()
const genesis_validators_root = genesisRes.data.genesis_validators_root
Construir un mensaje de salida:
const voluntaryExit = {
epoch: String(currentEpoch),
validator_index: String(VALIDATOR_INDEX),
}
Preparar una solicitud de firma:
const body = {
type: 'VOLUNTARY_EXIT',
fork_info: {
fork,
genesis_validators_root,
},
voluntary_exit: voluntaryExit,
}
Enviar la solicitud:
const signerReq = await fetch(WEB3SIGNER_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify(body),
})
const signature = await signerReq.text()
Finalmente, construir un mensaje de salida firmado:
const signedMessage = {
message: voluntaryExit,
signature,
}
Se recomienda preparar todos los parámetros necesarios (forks, epoch, etc.) con anticipación y comunicarse con Web3Signer de manera segura, por ejemplo, a través de una red segura sin otro acceso a internet.