geth/README.md

161 lines
5.3 KiB
Markdown
Raw Normal View History

2026-05-15 15:08:20 +02:00
# geth
`geth` is a personal, local-first mesh runtime for scripts, devices, databases,
documents, blobs, pipes, and future multi-user collaboration.
This project is not the Ethereum `geth` client. The project and executable are
still named `geth`.
## One Binary
There is one executable: `geth`.
It has daemon mode and control mode:
```sh
geth init
geth daemon run
geth daemon service install
2026-05-15 15:08:20 +02:00
geth status
geth node id
geth resource list
geth cas add ./file
```
2026-05-16 03:17:45 +02:00
The daemon owns local identity, the Iroh endpoint, trust state, resource
2026-05-15 15:08:20 +02:00
registry, module router, local metadata store, and synchronized data structures.
Most non-daemon commands talk to the daemon through a local Unix socket at
`$GETH_HOME/run/geth.sock`.
The daemon can also install itself as a user service:
```sh
geth daemon service install
geth daemon service status
geth daemon service uninstall
```
The bootstrap service managers are systemd user units on Linux, launchd user
agents on macOS, and per-user scheduled tasks on Windows. These are user-level
services, not system services.
2026-05-15 15:08:20 +02:00
## Transport And SSH
All remote node-to-node geth communication is designed to happen over Iroh only.
SSH is not a geth transport backend, and there is no SSH fallback transport.
2026-05-16 03:17:45 +02:00
The default node config uses Iroh's default relay policy for practical
connectivity; set `[iroh].relay_mode = "disabled"` for local-only/offline
2026-05-16 14:28:38 +02:00
development. Named custom relay maps can be selected with
2026-05-16 14:33:45 +02:00
`relay_mode = "custom"` and `relay_map = "<name>"`. Iroh local-network
discovery is enabled by default with `[iroh].local_discovery = true`.
2026-05-15 15:08:20 +02:00
SSH keys are used as admin trust anchors and ecosystem integration points.
OpenSSH, FIDO, and YubiKey-backed keys can sign geth trust objects through
canonical geth envelopes with explicit namespaces such as
`geth.keychain.v1@geth.local`. Future SSH proxying may carry SSH protocol bytes
over authorized Iroh streams, but the geth transport remains Iroh.
2026-05-15 15:08:20 +02:00
SSH certificate request and renewal flows are managed as geth metadata. A node
can create a certificate request, another machine can approve it and receive an
explicit `ssh-keygen -s ...` command suitable for a CA key or YubiKey-backed CA,
and the resulting `-cert.pub` can be imported for distribution. Certificate and
key revocation entries are tracked locally and can be exported as JSONL for
distribution. Future Iroh replication will distribute these records between
authorized nodes.
2026-05-15 15:08:20 +02:00
## MVP Features
The bootstrap implementation provides:
- `geth init`
- `geth daemon run`
- `geth daemon service install|uninstall|start|stop|status|print`
2026-05-15 15:08:20 +02:00
- `geth status`
- `geth node id`
- `geth resource list`
- `geth resource create <kind> <name>`
- `geth keychain init [--admin-key <path>]`
2026-05-15 15:08:20 +02:00
- `geth keychain status`
- `geth auth explain <subject> <resource> <capability>`
2026-05-16 16:32:03 +02:00
- `geth auth grant <subject> <resource> <capability> [--grant-id <id>]`
- `geth auth revoke <resource> <grant-id>`
2026-05-16 16:36:35 +02:00
- local filesystem CAS commands: `add`, `get`, `hash`, `has`, `pin`, `unpin`,
2026-05-16 21:10:25 +02:00
`cleanup`, `list`
2026-05-16 21:13:33 +02:00
- local DB resource registration: `geth db add <name> <path>` and
`geth db status <name>`
2026-05-16 21:52:35 +02:00
- local SQLite-backed KV commands: `geth kv create/set/get`
- SSH certificate flow metadata:
- `geth ssh cert request --public-key <path> --principal <name>`
- `geth ssh cert requests`
- `geth ssh cert approve <request-id> --ca-key <path>`
- `geth ssh cert import <request-id> --cert <path>`
- `geth ssh cert list`
- `geth ssh revocation add <kind> <target>`
- `geth ssh revocation list`
- `geth ssh revocation export --out <path>`
2026-05-15 15:08:20 +02:00
2026-05-16 21:52:35 +02:00
Other command groups exist as explicit stubs: `pipe`, `document`, `pubsub`,
`secret`, and `ssh`.
2026-05-15 15:08:20 +02:00
## Resource Modules
Everything meaningful is modeled as a resource. Planned resource kinds are:
- `db`: SQLite/cr-sqlite synchronization
- `kv`: Iroh Documents backed key-value stores
- `pipe`: dumbpipe-like byte streams over Iroh
- `document`: Automerge documents over Iroh streams
- `pubsub`: lossy notifications, not authoritative storage
- `cas`: content-addressed blob storage and distribution
- `ssh-proxy`: authorized SSH proxy/admin access over Iroh
Authorization is resource-scoped and capability-based. Bearer secrets may grant
specific resource capabilities but do not create trusted node identity.
## Local State
If `GETH_HOME` is set, geth uses it. Otherwise it uses an OS-specific data
directory. The bootstrap layout is:
```text
$GETH_HOME/
geth.sqlite
config.toml
identity/agent.ed25519
2026-05-16 03:17:45 +02:00
identity/iroh.ed25519
2026-05-15 15:08:20 +02:00
cas/blobs/
run/geth.sock
```
## Quick Start
In one shell:
```sh
export GETH_HOME="$(mktemp -d)"
cargo run -p geth -- init
cargo run -p geth -- daemon run
```
In another shell:
```sh
export GETH_HOME="<same dir>"
cargo run -p geth -- status
cargo run -p geth -- node id
echo "hello geth" > /tmp/hello-geth.txt
cargo run -p geth -- cas add /tmp/hello-geth.txt
cargo run -p geth -- cas list
```
## Authorization Direction
The MVP defines the split between:
- keychain: SSH-rooted users, devices, nodes, agents, and endpoint bindings
- auth: resource-local signed authorization operations and capability grants
- secrets: resource master secrets, epochs, envelopes, and bearer access
The current code does not implement Keyhive, BeeKEM, strong forward secrecy, or
post-compromise security. It leaves room for future local-first, replicated auth
logs and BeeKEM/CGKA-style group key evolution.