What a node does
- Takes part in key ceremonies. It deals, checks and finalizes a share with the other nodes. See Guardian key operations.
- Holds a sealed share. The share is encrypted on disk with a key that only this node can get.
- Answers permit requests. The revoker asks for a permit. The node checks the request and returns a partial decryption in the reply.
- Stays reachable. The other nodes and the revoker must be able to call it.
Secrets
Rules:
- Make every secret fresh for the network you run. Never reuse a test network key.
- Generate secrets on the host or in the secret store, and move them from machine to machine. Never send a secret in chat, a ticket or an email.
- The master key must be different on every node. One shared master key, together with the sealed share files, would rebuild the group key and undo the threshold.
- Fetch secrets at start and keep them in memory. Do not write them to disk or put them in a compose file.
Configure the node
A node is configured with environment variables.
If
ADMIN_ADDRESSES is not set, anyone who can reach the node can start a ceremony. The node writes a warning. Use that only for local tests.
The node needs an RPC that can read past logs. Keep the RPC key on the server. Do not put it in client code. The node’s code and image are at github.com/veilnyx/decom.
Network access
- Open the node’s port only to the other nodes and to the revoker host. Do not make it public.
- Restrict ceremony triggers to the admin host. Add mutual TLS where you can.
- Keep SSH closed to the world. Allow it from admin addresses only, or use a session manager and close it.
Routes
Every message between nodes is signed with the sender’s node key. A node accepts a message only if it is fresh, comes from a registered node and has not been seen before. It drops junk before it does any costly work.
What a node checks on a permit request
When the revoker calls/permit, the node checks four things.
- The request is fresh, no older than 60 seconds.
- The request exists in the request contract and names the transaction. The node reads this itself from the network, not from an index.
- The signer is the registered revoker for the group.
- The group is active.
Check that it works
- Call
GET /identityon every node. Each should answer with its address. - Read
GET /ceremony/shareson each node. Each should list the group, the epoch and the threshold. - Read the revoker’s
GET /health. It should show the expected revoker public key and the threshold, which is discovered from the guardians. - Run one real de-anonymization end to end before you open the group to users.
Backups and recovery
If a node is lost, the group recovers with a ceremony that moves the shares to a replacement node. It needs at least the threshold of the other nodes to be up. See Guardian key operations. No secret leaves the nodes. If you also back up sealed shares:- Back up after every ceremony. A share changes with every refresh, and an old backup does not combine with newer shares.
- Keep each node’s backups in a separate store with a separate key. No one account should be able to open
tor more shares. - Test the restore before you need it.
Checklist
- No test network secret is reused.
- Every node has its own node key and its own master key.
- Secrets are fetched at start and never written to disk.
-
ADMIN_ADDRESSESis set on every node. - Node ports are closed to the public.
- One real de-anonymization was run end to end.