Garder la clé de trading et les secrets d'une application hors du disque du serveur

erpc worker conserve la clé de trading et les secrets d'une application dans 1Password, votre trousseau ou un keystore chiffré, et les transmet à l'application en mémoire, jamais sur le disque du serveur.
Cette page décrit ERPC CLI v0.1.0-rc.4, une préversion.

Comment la clé de trading parvient à l'application

Une application dotée d'un wallet reçoit sa clé par un pipe à son démarrage. Il n'y a ni wallet.json, ni .env, ni copie sur le serveur. erpc n'écrit la clé en clair sur aucun disque : le seul fichier où il la place est celui du keystore, sur votre machine, chiffré avec votre phrase de passe.
  • Où elle est conservée : erpc worker key new crée la clé dans 1Password lorsque erpc login y conserve la session, sinon dans le trousseau, sinon dans le keystore. erpc.toml contient la référence de la clé et sa clé publique.
  • Sur le serveur : l'agent d'erpc worker ne garde la clé qu'en mémoire. Il se rend non dumpable, verrouille sa mémoire et transmet la clé à l'application sur un descripteur de fichier ; l'application l'efface après l'avoir lue.
  • Après un redémarrage, le worker revient verrouillé : l'application ne s'exécute pas tant que erpc worker start n'a pas renvoyé la clé. Un agent qui échoue ou est tué est redémarré par systemd et revient verrouillé de la même façon.
  • Une mise à jour de paquet ne redémarre pas un worker. deploy indique à needrestart de ne pas toucher aux unités du worker : en mode automatique, il les reporte, et, lorsqu'il est interrogé dans un terminal, sa réponse par défaut pour elles est non ; une mise à jour de sécurité sans surveillance ne redémarre donc pas l'application. Lorsque cette règle n'a pas pu être écrite, le déploiement le signale et continue, et le worker fonctionne alors sans cette protection.
La clé de trading est désignée par [wallet] et par rien d'autre, et erpc ne la lit que pour une personne devant le terminal : ni pour un outil d'IA, ni avec un compte de service 1Password. Une ligne [secrets] qui nomme la référence de [wallet], ou un compte keychain: ou keystore: se terminant par .wallet, est refusée. Dans le keystore, une entrée conservée comme clé ne s'ouvre pas comme secret. Dans 1Password, et sous un compte de trousseau d'un autre nom, rien ne distingue une clé : si un erpc.toml sans [wallet] nomme un tel élément sous [secrets], celui-ci est lu comme un secret.

Choisir où conserver les valeurs

1Password est facultatif. erpc worker key new et erpc worker secret put conservent ce qu'on leur donne dans le premier des emplacements suivants qui s'applique, sauf si --store en désigne un (--store 1password --vault <id>, --store keychain, --store keystore) :
  1. 1Password, lorsque erpc login y conserve la session ou que --vault est indiqué.
  2. Le trousseau de l'OS, là où il conserve une valeur au-delà d'un redémarrage : macOS, Windows, et Linux avec un keyring de bureau dans une session ouverte.
  3. Le keystore d'erpc, sur une machine Linux sans un tel keyring : un serveur headless, WSL, une connexion SSH. --store keychain est refusé sur une telle machine.
Dans le trousseau ou le keystore, la clé n'existe que sur cette seule machine, sans copie ni synchronisation, et une autre machine ne peut pas lire une référence keychain: ou keystore:.
Une machine perdue ou effacée signifie que le wallet est perdu : gardez-y peu de fonds, ou utilisez 1Password, que toute machine connectée au coffre peut lire. Connectez-vous à 1Password avec erpc login --store 1password-desktop, ou via op signin là où il n'y a pas d'application de bureau.
Un compte de service 1Password peut contenir les secrets d'une application, mais erpc ne lit pas de clé de trading avec un tel compte. Avec 1Password, chaque lecture peut afficher une demande d'accord dans l'application, et erpc affiche un indicateur d'attente pendant ce temps.

Conserver un secret

Les secrets, comme les tokens d'API et les clés RPC, sont conservés de la même façon, mais parviennent à l'application sous forme de variables d'environnement, et non par un pipe. erpc worker secret put <NAME> conserve la valeur, et [secrets] dans erpc.toml ne contient que sa référence.
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 crée la valeur : 32 octets aléatoires, sous forme de 64 caractères hexadécimaux.
  • --from-account conserve la première des clés RPC de votre compte que le RPC partagé accepte. Les clés sont essayées dans l'ordre, la clé principale en premier, avec un getHealth chacune et 8 secondes pour répondre. Une clé qui reçoit la réponse 401 ou 403 est refusée et la suivante est essayée, et seule une clé que le RPC a acceptée est conservée. La commande indique s'il s'agit de la clé principale du compte ou d'une autre (account_key avec --json).
  • Aucune des deux valeurs n'est affichée, pas même avec --json. La première utilisation du keystore, ou un keystore verrouillé, nécessite une personne devant le terminal.
  • Les clés sont essayées depuis cette machine : une clé limitée à l'adresse du serveur est donc refusée ici, bien qu'elle fonctionne là-bas. Lorsque toutes les clés sont refusées, --from-account ne conserve rien, et vous conservez vous-même la clé voulue, saisie sans affichage ou transmise par un pipe. Lorsque le RPC n'a pas pu être interrogé, rien n'est conservé et erpc.toml reste tel quel ; relancez la même commande.
Pour conserver une clé à la main :
bash
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
  • --replace conserve une nouvelle valeur pour un nom déjà défini. erpc worker secret list liste les paramètres secrets par nom, avec l'endroit où chacun est conservé.
  • Un paramètre que fournit une ligne de données (GRPC_ENDPOINT, SHREDS_ENDPOINT, SOLANA_SEND_RPC_ENDPOINT) n'est jamais un secret : --grpc, --shreds et --unlimited le définissent.
Une référence dans [secrets] ou [wallet] prend l'une des formes suivantes :
RéférenceOù se trouve la valeur
op://<vault-id>/<item-id>/<field>1Password, par identifiant de coffre et d'élément
keychain:<service>/<account>Le trousseau de l'OS de la machine qui l'a conservée
keystore:<service>/<account>Le keystore d'erpc sur la machine qui l'a conservée

Le keystore

Le keystore est le répertoire ~/.erpc/keystore (keystore sous ERPC_HOME lorsque celle-ci est définie). Sous Linux et macOS, ses répertoires sont en 0700 et ses fichiers en 0600 ; sous Windows, erpc ne définit aucune permission propre.
  • master.json contient une clé maîtresse aléatoire de 32 octets, scellée sous une clé que PBKDF2-HMAC-SHA256 (600 000 itérations) dérive de votre phrase de passe. Chaque entrée contient une valeur, scellée avec ChaCha20-Poly1305 sous une clé qui lui est propre.
  • La phrase de passe : le premier key new ou secret put qui utilise le keystore vous la fait choisir, saisie deux fois dans un terminal, de 12 caractères ou plus. erpc ne la prend que depuis cette invite masquée, jamais depuis un argument, une variable d'environnement ou un pipe.
  • Déverrouillage sous Linux : une fois que la phrase de passe a ouvert le keystore, le déverrouillage est conservé dans le keyring persistant du noyau, en mémoire, jusqu'au redémarrage de la machine, jusqu'à ce que le keyring reste inutilisé pendant son délai d'expiration d'inactivité (trois jours, sauf si le système en décide autrement), ou jusqu'à erpc worker secret lock. erpc worker secret unlock demande la phrase de passe à l'avance et indique jusqu'à quand. Dans un shell lancé sans connexion propre (su sans -, sudo -E), aucun déverrouillage n'est conservé et chaque commande demande la phrase de passe.
  • Sans personne devant le terminal, une commande qui a besoin du keystore utilise le déverrouillage s'il en existe un, et échoue sinon, en indiquant erpc worker secret unlock. Un keystore déverrouillé transmet les secrets, pas la clé de trading.
  • Sous macOS et Windows (--store keystore), aucun déverrouillage n'est conservé : chaque commande qui a besoin du keystore demande la phrase de passe une fois, et nécessite donc un terminal.

Ce que le keystore protège, et ce qu'il ne protège pas

  • Sauvegardez le répertoire keystore et retenez la phrase de passe. erpc ne peut récupérer ni l'un ni l'autre, et s'il manque l'un ou l'autre, ce que contient le keystore est perdu.
  • Quiconque possède les fichiers du keystore et la phrase de passe possède la clé. PBKDF2 ralentit chaque tentative, mais ne rend pas sûre une phrase de passe devinable.
  • Tant que le keystore est déverrouillé, tout programme qui s'exécute sous votre utilisateur peut lire la clé maîtresse dans le keyring du noyau (un programme dont la session ne contient pas votre keyring peut l'y rattacher) et ouvrir chaque entrée, y compris celle d'une clé. Les règles propres à erpc (ne lire la clé désignée par [wallet] que pour une personne devant le terminal, jamais pour un outil d'IA ; ne jamais ouvrir comme secret une clé conservée dans le keystore) décrivent ce que fait erpc ; elles ne s'imposent pas aux autres programmes qui s'exécutent sous votre utilisateur. Exécutez erpc worker secret lock lorsque vous avez terminé.
  • Les noms des entrées ne sont pas masqués, et la taille d'une entrée révèle la longueur de la valeur.
  • Un fichier modifié ne s'ouvre pas ; une copie plus ancienne de la même entrée remise à sa place s'ouvre, elle.
  • erpc worker secret rm supprime l'entrée de keystore d'un secret ainsi que sa ligne dans erpc.toml (sauf si un autre paramètre de l'application nomme la même entrée), et laisse en place une valeur stockée dans 1Password ou le trousseau. Il n'écrase pas les données sur le disque, et les copies présentes dans vos sauvegardes subsistent.
  • erpc ne supprime ni n'écrase jamais l'entrée d'une clé de trading. Pour remplacer une clé, transférez les fonds, puis retirez vous-même son fichier et [wallet].
  • Un paramètre ne peut pas s'appeler WALLET, quelle que soit la casse, dans le keystore ou le trousseau ; --store 1password accepte ce nom.

Utiliser la clé de trading

CommandeCe qu'elle fait
erpc worker key newCrée la clé de trading et affiche la clé publique à approvisionner
erpc worker key import <FILE>Déplace un fichier de clé dans 1Password, le trousseau ou le keystore, puis propose d'effacer le fichier
erpc worker key showAffiche la clé publique de la clé et l'endroit où elle est conservée
erpc worker key balanceAffiche le solde de la clé, via le paramètre RPC propre à l'application
erpc worker key send --to <ADDRESS> --sol <N>Signe un transfert en mémoire après votre oui dans un terminal. --all envoie tout sauf les frais
Lorsqu'erpc se termine sans savoir si un transfert a abouti, recherchez sa signature avant de renvoyer : un second envoi est un second transfert.