Mantén la clave de trading y los secretos de una aplicación fuera del disco del servidor

erpc worker guarda la clave de trading y los secretos de una aplicación en 1Password, tu llavero o un keystore cifrado, y se los entrega a la aplicación en memoria, nunca al disco del servidor.
Esta página describe ERPC CLI v0.1.0-rc.4, una versión preliminar.

Cómo llega la clave de trading a la aplicación

Una aplicación con una wallet recibe su clave por una tubería cuando se inicia. No hay wallet.json, ni .env, ni ninguna copia en el servidor. erpc no escribe la clave sin cifrar en ningún disco: el único archivo en el que la guarda es el del keystore, en tu máquina, cifrado con tu frase de contraseña.
  • Dónde se guarda: erpc worker key new crea la clave en 1Password cuando erpc login guarda allí la sesión; si no, en el llavero; y si no, en el keystore. erpc.toml registra la referencia de la clave y su clave pública.
  • En el servidor: el agente de erpc worker mantiene la clave solo en memoria. Se marca para que no se pueda volcar, bloquea su memoria y entrega la clave a la aplicación en un descriptor de archivo; la aplicación la borra después de leerla.
  • Tras un reinicio, el worker vuelve bloqueado: la aplicación no se ejecuta hasta que erpc worker start vuelve a enviar la clave. Si el agente falla o se termina a la fuerza, systemd lo vuelve a iniciar y el agente vuelve bloqueado del mismo modo.
  • Una actualización de paquetes no reinicia un worker. deploy indica a needrestart que deje en paz las unidades del worker: en su modo automático las aplaza, y cuando pregunta en un terminal, su respuesta por defecto para ellas es no, así que una actualización de seguridad desatendida no reinicia la aplicación. Cuando no se pudo escribir esa regla, el despliegue lo indica y continúa, y el worker se ejecuta entonces sin esta protección.
La clave de trading la indica [wallet] y nada más, y erpc solo la lee para una persona ante el terminal: no para una herramienta de IA ni con una cuenta de servicio de 1Password. Se rechaza una línea de [secrets] que indique la referencia de [wallet], o una cuenta keychain: o keystore: que termine en .wallet. En el keystore, una entrada guardada como clave no se abre como secreto. En 1Password, y con una cuenta del llavero de otro nombre, nada marca una clave: si un erpc.toml sin [wallet] indica un elemento así en [secrets], se lee como secreto.

Elegir dónde se guardan los valores

1Password es opcional. erpc worker key new y erpc worker secret put guardan lo que reciben en la primera de estas opciones que corresponda, salvo que --store indique una (--store 1password --vault <id>, --store keychain, --store keystore):
  1. 1Password, cuando erpc login guarda allí la sesión o se indica --vault.
  2. El llavero del SO, donde conserva un valor tras un reinicio: macOS, Windows y Linux con un keyring de escritorio en una sesión iniciada.
  3. El keystore de erpc, en una máquina Linux sin ese keyring: un servidor sin entorno gráfico, WSL, un inicio de sesión por SSH. --store keychain se rechaza en una máquina así.
En el llavero o en el keystore, la clave existe solo en esa máquina, sin copia y sin sincronización, y otra máquina no puede leer una referencia keychain: o keystore:.
Si la máquina se pierde o se borra, la wallet desaparece: guarda poco en ella, o usa 1Password, que puede leer cualquier máquina con la sesión iniciada en la bóveda. Inicia sesión en 1Password con erpc login --store 1password-desktop, o mediante op signin donde no haya aplicación de escritorio.
Una cuenta de servicio de 1Password puede guardar los secretos de una aplicación, pero erpc no lee una clave de trading con ella. Con 1Password, cada lectura puede mostrar una solicitud de aprobación en la aplicación de 1Password, y erpc muestra un indicador de espera mientras tanto.

Guardar un secreto

Los secretos, como los tokens de API y las claves RPC, se guardan del mismo modo, pero llegan a la aplicación como variables de entorno, no por una tubería. erpc worker secret put <NAME> guarda el valor, y [secrets] en erpc.toml contiene solo su referencia.
bash
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
  • --generate crea el valor: 32 bytes aleatorios, como 64 caracteres hexadecimales.
  • --from-account guarda la primera de las claves RPC de tu cuenta que acepta el RPC compartido. Las claves se prueban en orden, primero la principal, con un getHealth cada una y 8 segundos para responder. Una clave que recibe 401 o 403 se rechaza y se prueba la siguiente, y solo se guarda una clave que el RPC haya aceptado. El comando indica si es la clave principal de la cuenta u otra (account_key con --json).
  • Ninguno de los dos valores se imprime, tampoco con --json. El primer uso del keystore, o un keystore bloqueado, necesita una persona ante el terminal.
  • Las claves se prueban desde esta máquina, así que una clave limitada a la dirección del servidor se rechaza aquí aunque allí funcione. Cuando se rechazan todas las claves, --from-account no guarda nada, y guardas tú a mano la clave que quieras, escribiéndola sin que se vea o pasándola por una tubería. Cuando no se pudo consultar al RPC, no guarda nada y erpc.toml queda como estaba; vuelve a ejecutar el mismo comando.
Para guardar una clave a mano:
bash
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
  • --replace guarda un valor nuevo para un nombre que ya está definido. erpc worker secret list enumera los ajustes secretos por nombre y dónde se guarda cada uno.
  • Un ajuste que proporciona una línea de datos (GRPC_ENDPOINT, SHREDS_ENDPOINT, SOLANA_SEND_RPC_ENDPOINT) nunca es un secreto: lo fijan --grpc, --shreds y --unlimited.
Una referencia en [secrets] o [wallet] es una de estas:
ReferenciaDónde está el valor
op://<vault-id>/<item-id>/<field>1Password, por id de bóveda y de elemento
keychain:<service>/<account>El llavero del SO de la máquina que lo guardó
keystore:<service>/<account>El keystore de erpc en la máquina que lo guardó

El keystore

El keystore es el directorio ~/.erpc/keystore (keystore dentro de ERPC_HOME cuando está definido). En Linux y macOS sus directorios tienen 0700 y sus archivos 0600; en Windows, erpc no fija permisos propios.
  • master.json contiene una clave maestra aleatoria de 32 bytes, sellada con una clave que PBKDF2-HMAC-SHA256 (600.000 iteraciones) deriva de tu frase de contraseña. Cada entrada contiene un valor, sellado con ChaCha20-Poly1305 con una clave propia.
  • La frase de contraseña: el primer key new o secret put que usa el keystore te pide que la elijas, escribiéndola dos veces en un terminal, con 12 caracteres o más. erpc solo la toma de esa solicitud oculta, nunca de un argumento, una variable de entorno o una tubería.
  • Desbloqueo en Linux: una vez que la frase de contraseña ha abierto el keystore, el desbloqueo se guarda en el keyring persistente del kernel, en memoria, hasta que la máquina se reinicia, el keyring permanece sin usar durante su plazo de caducidad por inactividad (tres días, salvo que el sistema indique otra cosa) o se ejecuta erpc worker secret lock. erpc worker secret unlock pide la frase de contraseña por adelantado e indica hasta cuándo dura el desbloqueo. En un shell iniciado sin un inicio de sesión propio (su sin -, sudo -E), no se guarda ningún desbloqueo y cada comando la pide.
  • Sin nadie ante el terminal, un comando que necesita el keystore usa el desbloqueo cuando lo hay y, si no, falla e indica erpc worker secret unlock. Un keystore desbloqueado entrega secretos, no la clave de trading.
  • En macOS y Windows (--store keystore), no se guarda ningún desbloqueo: cada comando que necesita el keystore pide la frase de contraseña una vez y, por tanto, necesita un terminal.

Lo que el keystore protege y lo que no

  • Haz una copia de seguridad del directorio keystore y recuerda la frase de contraseña. erpc no puede recuperar ninguna de las dos, y si falta cualquiera de las dos, lo que contiene el keystore se pierde.
  • Quien tenga los archivos del keystore y la frase de contraseña tiene la clave. PBKDF2 hace lento cada intento, pero no hace segura una frase de contraseña fácil de adivinar.
  • Mientras el keystore está desbloqueado, cualquier programa que se ejecute como tú puede leer la clave maestra del keyring del kernel (uno cuya sesión no contenga tu keyring puede vincularlo) y abrir todas las entradas, también la de una clave. Las reglas propias de erpc (leer la clave indicada por [wallet] solo para una persona ante el terminal, nunca para una herramienta de IA; no abrir nunca como secreto una clave guardada en el keystore) son lo que hace erpc; no obligan a otros programas que se ejecuten como tú. Ejecuta erpc worker secret lock cuando termines.
  • Los nombres de las entradas no están ocultos, y el tamaño de una entrada muestra la longitud del valor.
  • Un archivo modificado no se abre; una copia anterior de la misma entrada puesta en su lugar, sí.
  • erpc worker secret rm elimina la entrada del keystore de un secreto junto con su línea en erpc.toml (salvo que otro ajuste de la aplicación indique la misma entrada), y deja donde está un valor en 1Password o en el llavero. No borra el disco de forma segura, y las copias que haya en tus copias de seguridad permanecen.
  • erpc nunca elimina ni sobrescribe la entrada de una clave de trading. Para sustituir una clave, mueve los fondos y después quita tú su archivo y [wallet].
  • Un ajuste no puede llamarse WALLET, sea cual sea la combinación de mayúsculas y minúsculas, en el keystore ni en el llavero; --store 1password acepta ese nombre.

Trabajar con la clave de trading

ComandoQué hace
erpc worker key newCrea la clave de trading e imprime la clave pública a la que añadir fondos
erpc worker key import <FILE>Mueve un archivo de clave a 1Password, el llavero o el keystore, y después ofrece borrar el archivo
erpc worker key showMuestra la clave pública de la clave y dónde se guarda
erpc worker key balanceMuestra el saldo de la clave, mediante el ajuste de RPC de la propia aplicación
erpc worker key send --to <ADDRESS> --sol <N>Firma una transferencia en memoria tras tu sí en un terminal. --all envía todo excepto la comisión
Cuando erpc termina sin saber si una transferencia se completó, consulta su firma antes de volver a enviar: un segundo envío es una segunda transferencia.