did:webvh implementation
A complete implementation of the did:webvh method in Rust. Supports version 1.0 spec.
A helpful implementation site is the webvh DID Method Information site
Change log
Features
- Create a did:webvh LogEntry and DID Document
- Resolve a did:webvh method
- Validate webvh LogEntries to v1.0 specification
- Update webvh DID
- Revoke webvh DID
- Witness webvh DID
- Migration of DID (portability)
- Validate witness information
- DID Query Parameters versionId, versionTime, and versionNumber implemented
- WebVH DID specification version support (v1.0 and pre-v1.0)
- Export WebVH to a did:web document
- Generate did:scid:vh alsoKnownAs alias from did:webvh DIDs
- URL validation rejects IP addresses per spec (domain names required)
- WASM friendly for inclusion in other projects
- WebVH DID Create routines to make it easier to create DIDs programmatically
Usage
Add this to your Cargo.toml:
[]
= "0.2.0"
Then:
use *;
let mut webvh = default;
// Load LogEntries from a file
webvh.load_log_entries_from_file?;
The prelude module re-exports the most commonly needed types:
DIDWebVHError, DIDWebVHState, LogEntryMethods, Parameters,
CreateDIDConfig, create_did, Witnesses, and WitnessProofCollection.
Feature Flags
- ssi
- Enables integration with the ssi crate
- This is useful when integrating into universal resolvers
- Enables integration with the ssi crate
Everyone likes a wizard
Getting started with webvh at first can be daunting given the complexity of the specification and supporting infrastructure such as witness and watcher nodes.
To help with getting started, a wizard for webvh has been created to help you.
To run this wizard, you need to have Rust installed on your machine.
WARNING: This wizard will generate secrets locally on your machine, and display the secret on the screen.
The wizard is meant for demonstration purposes only. Use in a production environment is not recommended.
Default Wizard Files
did.jsonl is the default WebVH LogEntry file that the wizard will create.
did-witness.json where Witness Proofs are saved.
did.jsonl-secrets is the default file containing key secrets
Is WebVH performant?
There is a lot going on with the WebVH DID method. A lot of keys, signing and validations
Depending on how often you are creating LogEntries, number of witnesses etc can have a big impact on performance.
To help with testing different usage scenario's, there is an example tool that can help you with testing real-world performance of the WebVH method.
To get options for the generate_history performance tool, run:
For example, to generate 200 LogEntries with 10 witnesses each, you can run:
This tool will save the output to
- did.jsonl (LogEntries)
- did-witness.json (Witness Proofs)
Criterion Benchmarks (stable Rust)
Run the full benchmark suite using Criterion:
Run a specific benchmark group or individual benchmark:
HTML reports are generated in target/criterion/.
Nightly Benchmarks
If you have the Rust nightly toolchain installed, you can also run the built-in
#[bench] benchmarks:
Benchmark Groups
| Group | Benchmarks | Description |
|---|---|---|
did_creation |
basic, with_aliases |
DID creation with minimal config and with alsoKnownAs aliases |
did_resolution |
single_entry, large_with_witnesses_120_entries |
File-based DID resolution with 1 and 120+ log entries |
validation |
single_entry, large_with_witnesses_120_entries |
Log entry and witness proof validation |
Creating a DID Programmatically
The create module provides a library API for creating a DID without any
interactive prompts. Use CreateDIDConfig::builder() to construct the
configuration:
use *;
use Secret;
use json;
use Arc;
// Generate or load a signing key
let signing_key = generate_ed25519;
// Build parameters with the signing key as an update key
let parameters = Parameters ;
// Build the DID document
let did_document = json!;
// Create the DID
let config = builder
.address
.authorization_key
.did_document
.parameters
.also_known_as_web
.also_known_as_scid
.build
.unwrap;
let result = create_did.unwrap;
// result.did — the resolved DID identifier (with SCID)
// result.log_entry — the signed first log entry (serialize to JSON for did.jsonl)
// result.witness_proofs — witness proofs (empty if no witnesses configured)
Witness Support
If your DID uses witnesses, provide the witness secrets via the builder:
// For each witness, add its DID and secret
let config = builder
.address
.authorization_key
.did_document
.parameters
.witness_secret
.build
.unwrap;
The sign_witness_proofs() function is also available separately if you need
to sign witness proofs outside of the full DID creation flow.
License
Licensed under:
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)