Transaction signing
Every transaction is signed by the originator’s Ed25519 key. The signature covers the canonicalised transaction envelope:jcsis JSON Canonicalisation Scheme (RFC 8785).tx_envelopeis the typed transaction payload with all fields populated.- The domain separator
sigil/tx/v1prevents cross-protocol signature reuse.
Envelope shape
sigil_sendTransaction with the signature attached:
- The signature matches the envelope under
blake3("sigil/tx/v1\n" || jcs(envelope)). - The public key resolves to the
fromDID via the OAS resolver. - The nonce matches the next expected nonce for the DID.
- The fee meets the local fee market for the transaction class.
- The
expires_at_heightis in the future and within the admission window.
Multi-human roots
Transactions originating fromdid:oas:sigil:mhr:... DIDs are signed with a FROST t-of-n threshold signature. The aggregated signature is verifiable as a standard Ed25519 signature against the group public key; the verifier does not need to know which signers participated.
The MHR registration transaction RegisterMhrRoot commits the group public key, the threshold, and the participant DIDs. Subsequent transactions reference the MHR DID and are verified against the registered group key.
JWT for premium RPC
Premium RPC tiers (higher rate limit, validator-internal methods, identity-bound subscriptions) require a Bearer JWT in theAuthorization header:
- Client requests a challenge:
POST /auth/challenge→ returns a 32-byte nonce. - Client signs the nonce with their DID’s Ed25519 key.
- Client exchanges the signed nonce:
POST /auth/exchange→ returns a JWT. - JWT is valid for 24 hours; refresh by repeating the flow.
Validator-internal methods
A small set of methods (block production, peer management, log inspection) is reachable only on the validator-internal port and requires a JWT issued by the validator’s own auth service. These methods are not exposed on public RPC and returnMethodNotFound from the public profile.
See WS private subscriptions for the identity-bound WebSocket variant.
Wallet signing patterns
| Wallet type | Signing flow |
|---|---|
| Browser extension | Signs in-extension under a user-confirmed prompt; never exports raw key. |
CLI (sigil-cli) | Decrypts encrypted keystore on demand; signs in-process. |
| Hardware wallet (Ledger) | App on the device signs the BLAKE3 digest; host never sees the seed. |
| Validator HSM | Signing API exposes only signature output; raw key isolated in the HSM. |
| FROST MHR | Each participant signs a share; the aggregator combines into the final signature. |
oas/oas-sdk-rust/src/sign.rs, compiled to WASM and linked from TypeScript, Go, Python, Swift, and Kotlin SDKs.