Hi everyone,
We’re building a governance dApp (DAOs, proposals, voting) on Canton MainNet with a self-hosted participant (web34ever::12205...). Go backend talks to the participant via gRPC Ledger API.
We’re adding private contracts where the operator party is excluded from observers:
template DAO with
admin : Party
members : [Party]
visibility : DAOVisibility
where
signatory admin
observer case visibility of
Public -> [operator] <> members
Private -> members -- operator excluded
From researching this forum (thanks WallaceKelly & bernhard — your posts on JWT authorization, actAs/readAs semantics, and PQS vs JSON API were exactly what we needed), we understand that:
- Per-party JWT with
actAs=[memberParty]is required to query private contracts — operator readAs won’t work actAsimpliesreadAs, so a single right grant is sufficient- JSON API is fine for our scale (~50-200 DAOs), no need for PQS yet
- Ledger API User creation via
/v2/users+/v2/users/{id}/rightsis the right pattern
Two remaining questions:
1. Adding auth-services to an already-running MainNet participant
We did not configure ledger-api.auth-services when we initially set up our participant. We plan to add:
canton.participants.web34ever {
ledger-api {
auth-services = [{
type = jwt-rs-256-crt
certificate = "/path/to/our-public.crt"
}]
}
}
Our backend would sign JWTs with the corresponding private key, including actAs=[partyId] claims for each user.
Are there any gotchas with enabling auth on a participant that already has existing contracts and allocated parties? Does a restart with auth-services added require any migration, or is it purely additive?
2. Coexistence with Splice validator stack
We’re also preparing for Splice validator onboarding (splice-validator-app + splice-wallet-app). Does the Splice stack configure its own auth on the participant (e.g. Keycloak)? If so, can multiple auth-services entries coexist — ours (cert-based) alongside Splice’s (JWKS)?
auth-services = [
{ type = jwt-rs-256-crt, certificate = "our-key.crt" }, # our backend
{ type = jwt-jwks, url = "http://keycloak:8080/.../jwks" } # splice stack
]
Or would we need to consolidate into a single auth provider?
Any pointers appreciated. Happy to share more about our contract model if helpful.
Thanks!