Note: The public NeoPRISM instances below are personal deployments by the project author, intended for quick evaluation and testing. Please do not use them for production purposes.
Note: During development and testing, NeoPRISM typically uses between 10–100 MB of memory. No special hardware requirements are expected.
NeoPRISM also supports advanced deployment modes and Cardano data sources (such as DB Sync and testnet environments). For details on advanced configurations, see the relevant documentation pages.
Note: The example above demonstrates one way to run NeoPRISM using Docker. You can find additional deployment examples and configurations in the docker directory of the repository.
If you are deploying NeoPRISM in a production environment, please take extra care to harden your setup according to your organization’s security requirements.
NeoPRISM supports multiple roles within its system architecture:
Indexer: Reads, validates, and indexes DID operations from the Cardano blockchain.
Submitter: Batches and submits signed DID operations to the Cardano blockchain.
Standalone: Runs both indexer and submitter in a single process for simple deployments.
NeoPRISM acts as an indexer by reading DID operations from the Cardano blockchain, validating them, and storing them in a local PostgreSQL database.
It organizes these operations using keys such as DIDs or storage hashes.
When a user requests the current state of a DID, NeoPRISM replays the relevant operations to reconstruct and return the latest state via its REST API.
In its role as a submitter, NeoPRISM receives signed DID operations and batches them into Cardano transaction metadata.
It does not manage private keys for either DID operations or Cardano wallets.
The metadata is sent to the wallet component (currently supporting only cardano-wallet) for publishing.
This process is stateless and requires the wallet passphrase, along with other related wallet configurations, which are provided through CLI options or environment variables.
In this mode, both the indexer and submitter run in the same process, which is suitable for a small and simple deployment setup.
You may also add a reverse proxy to handle authentication and routing for the submitter API paths.
In this deployment mode, the indexer and submitter run as separate processes, which may be hosted on different machines. This separation allows for independent scaling of each component; for example, multiple indexer instances can be deployed to support high read volume.
The indexer process reads, validates, and indexes DID operations from the Cardano blockchain, storing them in a shared PostgreSQL database.
The submitter process is stateless and receives signed DID operations, batching and submitting them to the Cardano blockchain via the wallet component. It does not use the database.
A reverse proxy is recommended to route requests to the appropriate service, handling authentication and API path routing for both the indexer and submitter.
DID controllerVerifierCardano relay nodeIndexer DeploymentSubmitter DeploymentNeoPRISM IndexerPostgreSQLNeoPRISM SubmitterCardano HTTP walletCardano block-producer noderead / write indexed operationsstream operations using Ouraresolve DID documentscreate transactionssubmit transactionssubmit signed PRISM operationspropagate blocks
NeoPRISM also supports deploying only a subset of its components, depending on your use case and requirements:
Indexer-only deployment:
Only the indexer process is deployed. This setup allows you to read, validate, and index DID operations from the Cardano blockchain, and serve DID resolution requests via the REST API. No submission of new DID operations to the blockchain is possible in this mode.
Submitter-only deployment:
Only the submitter process is deployed. This setup allows you to batch and submit signed DID operations to the Cardano blockchain via the wallet component. DID resolution and indexing are not available in this mode.
These deployment options provide flexibility for scenarios where you may only need to resolve DIDs (indexer-only) or only need to submit new DID operations (submitter-only), without running the full NeoPRISM stack.
Note: These modes are subsets of the closed-loop indexer–submitter deployment, and can be scaled or combined as needed.
NeoPRISM nodes offer flexible configuration to suit various deployment scenarios.
This section explains the key configuration options.
For a complete list of available options, see CLI Options.
To start NeoPRISM node in each mode, use one of the following subcommands:
Usage: neoprism-node <COMMAND>
Commands:
indexer Start the node in indexer mode
submitter Start the node in submitter mode
standalone Start the node in standalone mode
generate-openapi Generate OpenAPI specification for the API
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
The standalone mode combines both indexer and submitter functionalities.
You can refer to the configuration options for each mode and apply them together when using standalone.
The Indexer node monitors the Cardano blockchain for PRISM DID operations, validates and indexes them, and enables efficient lookup of DID Documents.
It is typically used for DID resolution and verification services.
Oura works by performing a chainsync protocol with a Cardano relay node.
This setup is quite lean, as you can connect to any available public relay.
The downside is that sync progress can be slow, since it performs a full sync from the blockchain.
If possible, connect to a Cardano node close to your location, as syncing across different geographic regions can be very slow.
The initial sync may take multiple days. The best option is to connect to your own Cardano node within the same network for optimal performance.
DB Sync
DBSync is a service that syncs the Cardano blockchain and writes the data to a PostgreSQL database.
DBSync is known to be resource-heavy and requires significant disk space.
The advantage is that sync speed is very fast, since NeoPRISM only needs to read the database tables and parse the operations.
If you can afford to run DBSync, it is recommended to use this option, as the initial sync is much faster compared to Oura.
NeoPRISM streams blocks from the Cardano blockchain and extracts PRISM metadata, which is then persisted to the database. These operations are initially stored as raw, unindexed data. At every configured interval (set by the index interval option), NeoPRISM wakes up and picks up unindexed operations from the database. It then runs the indexing logic, which extracts, validates, and transforms each raw operation into an efficient lookup data structure.
A faster index interval reduces the lag between when an operation is streamed and when it becomes indexed and available for fast lookup. However, setting a very short interval can put additional pressure on the database due to more frequent indexing cycles. NeoPRISM comes with a sensible default value for the index interval to balance performance and resource usage.
Choose the DLT source and interval settings that best fit your infrastructure and performance needs.
Next Steps:
CLI Options: Full list of flags and environment variables.
The Submitter node currently supports Cardano wallet integration as its DLT sink:
Cardano Wallet:
Uses a Cardano wallet to sign and submit transactions containing DID operations.
Key options:
Wallet base URL: --wallet-base-url or NPRISM_WALLET_BASE_URL
Wallet ID: --wallet-id or NPRISM_WALLET_ID
Passphrase: --wallet-passphrase or NPRISM_WALLET_PASSPHRASE
Payment address: --payment-address or NPRISM_PAYMENT_ADDRESS
Important:
When the submitter publishes a DID operation, it creates a transaction from the configured wallet to the specified payment address.
Make sure you use your own payment address. Using an incorrect or third-party address may result in permanent loss of funds.
Configure the wallet integration to match your operational and security requirements.
Next Steps:
CLI Options: Full list of flags and environment variables.
NeoPRISM uses structured logging to help you diagnose issues and monitor node activity.
Logging is powered by the tracing crate, and log verbosity is controlled via the standard RUST_LOG environment variable.
By default, NeoPRISM outputs all logs to stdout.
NeoPRISM uses the standard tracing environment variables to control log verbosity and filtering, including RUST_LOG. For more details on how RUST_LOG works and advanced usage, see the tracing-subscriber EnvFilter documentation.
The prism-test suite provides conformance tests for PRISM node implementations. These tests help developers verify that their NeoPRISM or PRISM node changes adhere to the PRISM specification.
The tests are located in the tests/prism-test directory. They cover key PRISM features such as DID creation, update, deactivation, and storage operations, ensuring your node implementation behaves as expected.
Navigate to the docker/prism-test directory and start the required services using Docker Compose:
cd docker/prism-test
docker-compose up
Note:
If you are testing changes to a PRISM node implementation locally, you may need to adjust the compose.yml or docker-compose.yml file (depending on which is present in your project) to use your locally built Docker image instead of the default image.
For example, update the image: field or use the build: directive to point to your local source.
This will launch all necessary dependencies for the test suite.
To include a new PRISM node implementation in the test suite:
Edit MainSpec.scala:
Go to MainSpec.scala and add your new node to the test suite by providing the appropriate layer and configuration.
Implement NodeClient Interface (if needed):
If your node uses a different RPC or API, you may need to implement the NodeClient interface in NodeClient.scala to adapt the test suite to your node’s communication protocol.
This allows you to run the conformance tests against your custom PRISM node implementation and verify its compliance with the PRISM specification.
Usage: neoprism-node <COMMAND>
Commands:
indexer Start the node in indexer mode
submitter Start the node in submitter mode
standalone Start the node in standalone mode
generate-openapi Generate OpenAPI specification for the API
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
Start the node in indexer mode
Usage: neoprism-node indexer [OPTIONS] --db-url <DB_URL>
Options:
--address <ADDRESS>
Node HTTP server binding address [env: NPRISM_ADDRESS=] [default: 0.0.0.0]
-p, --port <PORT>
Node HTTP server listening port [env: NPRISM_PORT=] [default: 8080]
--assets-path <ASSETS_PATH>
The directory containing the web UI assets (CSS, JavaScript files) [env: NPRISM_ASSETS_PATH=] [default: ./bin/neoprism-node/assets]
--cors-enabled
Enable permissive CORS (https://docs.rs/tower-http/latest/tower_http/cors/struct.CorsLayer.html#method.permissive) [env: NPRISM_CORS_ENABLED=]
--db-url <DB_URL>
Database URL (e.g. postgres://user:pass@host:5432/db) [env: NPRISM_DB_URL=]
--skip-migration
Skip database migration on node startup [env: NPRISM_SKIP_MIGRATION=]
--cardano-network <CARDANO_NETWORK>
The Cardano network the node is syncing from [env: NPRISM_CARDANO_NETWORK=] [default: mainnet] [possible values: mainnet, preprod, preview]
--cardano-relay-addr <CARDANO_RELAY_ADDR>
Address of the Cardano relay node to sync from. If provided, the node will sync events from the Cardano relay node. (e.g. backbone.mainnet.cardanofoundation.org:3001) [env: NPRISM_CARDANO_RELAY_ADDR=]
--cardano-dbsync-url <CARDANO_DBSYNC_URL>
DB-Sync url. If provided, the node will sync events from DB Sync. (e.g. postgres://user:pass@host:5432/db) [env: NPRISM_CARDANO_DBSYNC_URL=]
--cardano-dbsync-poll-interval <CARDANO_DBSYNC_POLL_INTERVAL>
Number of seconds to wait before polling DB Sync for the next update [env: NPRISM_CARDANO_DBSYNC_POLL_INTERVAL=] [default: 10]
--index-interval <INDEX_INTERVAL>
Number of seconds to wait before checking for unindexed operations [env: NPRISM_INDEX_INTERVAL=] [default: 10]
--confirmation-blocks <CONFIRMATION_BLOCKS>
Number of confirmation blocks to wait before considering the block valid [env: NPRISM_CONFIRMATION_BLOCKS=] [default: 112]
-h, --help
Print help
Start the node in standalone mode
Usage: neoprism-node standalone [OPTIONS] --db-url <DB_URL> --cardano-wallet-base-url <CARDANO_WALLET_BASE_URL> --cardano-wallet-wallet-id <CARDANO_WALLET_WALLET_ID> --cardano-wallet-passphrase <CARDANO_WALLET_PASSPHRASE> --cardano-wallet-payment-addr <CARDANO_WALLET_PAYMENT_ADDR>
Options:
--address <ADDRESS>
Node HTTP server binding address [env: NPRISM_ADDRESS=] [default: 0.0.0.0]
-p, --port <PORT>
Node HTTP server listening port [env: NPRISM_PORT=] [default: 8080]
--assets-path <ASSETS_PATH>
The directory containing the web UI assets (CSS, JavaScript files) [env: NPRISM_ASSETS_PATH=] [default: ./bin/neoprism-node/assets]
--cors-enabled
Enable permissive CORS (https://docs.rs/tower-http/latest/tower_http/cors/struct.CorsLayer.html#method.permissive) [env: NPRISM_CORS_ENABLED=]
--db-url <DB_URL>
Database URL (e.g. postgres://user:pass@host:5432/db) [env: NPRISM_DB_URL=]
--skip-migration
Skip database migration on node startup [env: NPRISM_SKIP_MIGRATION=]
--cardano-network <CARDANO_NETWORK>
The Cardano network the node is syncing from [env: NPRISM_CARDANO_NETWORK=] [default: mainnet] [possible values: mainnet, preprod, preview]
--cardano-relay-addr <CARDANO_RELAY_ADDR>
Address of the Cardano relay node to sync from. If provided, the node will sync events from the Cardano relay node. (e.g. backbone.mainnet.cardanofoundation.org:3001) [env: NPRISM_CARDANO_RELAY_ADDR=]
--cardano-dbsync-url <CARDANO_DBSYNC_URL>
DB-Sync url. If provided, the node will sync events from DB Sync. (e.g. postgres://user:pass@host:5432/db) [env: NPRISM_CARDANO_DBSYNC_URL=]
--cardano-dbsync-poll-interval <CARDANO_DBSYNC_POLL_INTERVAL>
Number of seconds to wait before polling DB Sync for the next update [env: NPRISM_CARDANO_DBSYNC_POLL_INTERVAL=] [default: 10]
--index-interval <INDEX_INTERVAL>
Number of seconds to wait before checking for unindexed operations [env: NPRISM_INDEX_INTERVAL=] [default: 10]
--confirmation-blocks <CONFIRMATION_BLOCKS>
Number of confirmation blocks to wait before considering the block valid [env: NPRISM_CONFIRMATION_BLOCKS=] [default: 112]
--cardano-wallet-base-url <CARDANO_WALLET_BASE_URL>
Base url of cardano wallet [env: NPRISM_CARDANO_WALLET_BASE_URL=]
--cardano-wallet-wallet-id <CARDANO_WALLET_WALLET_ID>
Wallet ID to use for making transactions [env: NPRISM_CARDANO_WALLET_WALLET_ID=]
--cardano-wallet-passphrase <CARDANO_WALLET_PASSPHRASE>
Passphrase for the wallet [env: NPRISM_CARDANO_WALLET_PASSPHRASE=]
--cardano-wallet-payment-addr <CARDANO_WALLET_PAYMENT_ADDR>
Payment address for making transactions [env: NPRISM_CARDANO_WALLET_PAYMENT_ADDR=]
-h, --help
Print help
Generate OpenAPI specification for the API
Usage: neoprism-node generate-openapi [OPTIONS]
Options:
--output <OUTPUT> Output file for the OpenAPI spec (stdout if not provided)
-h, --help Print help