Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions examples/basic_bls_signing/rust/backend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ async fn get_my_verification_key() -> VetKeyPublicKey {
context: context(&ic_cdk::api::msg_caller()),
key_id: key_id(),
};

// In production systems it would make sense to use the offline derivation
// support available in ic_vetkeys, eg DerivedPublicKey::derive_sub_key
// since this avoids the cycles and time overhead of a management canister call
Comment on lines +100 to +102
Copy link
Copy Markdown
Contributor

@fspreiss fspreiss Jan 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here the key is fetched every time anew. Some examples (like examples/basic_timelock_ibe/backend/src/lib.rs) use caching, so they fetch the public key only once. This makes this already much better. We could at least do the caching-based approach in all examples.

Another idea is to detect in which environment we are (mainnet vs pocket-ic) from the key ID: the key ID is passed to the init method and the init-args are defined in the dfx.json.

Ideally we can find a way to automate this (not necessarily in this PR), because this would help developers.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking about it more, detecting the environment would be nice, but it's not needed for the time being.

Adding the caching-based approach would already go a long way, and we can extend the hint that the caching could additionally also be done in the frontend, and that frontends could also use the Typescript-based offline key derivation if the caching is not possible (e.g., because there is no fixed context/input).

let result = ic_cdk::management_canister::vetkd_public_key(&request)
.await
.expect("call to vetkd_public_key failed");
Expand Down
3 changes: 3 additions & 0 deletions examples/basic_ibe/rust/backend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ async fn get_ibe_public_key() -> VetKeyPublicKey {
key_id: key_id(),
};

// In production systems it would make sense to use the offline derivation
// support available in ic_vetkeys, eg DerivedPublicKey::derive_sub_key
// since this avoids the cycles and time overhead of a management canister call
let result = ic_cdk::management_canister::vetkd_public_key(&request)
.await
.expect("call to vetkd_public_key failed");
Expand Down
3 changes: 3 additions & 0 deletions examples/basic_timelock_ibe/backend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ async fn get_ibe_public_key() -> VetKeyPublicKey {
key_id: key_id(),
};

// In production systems it would make sense to use the offline derivation
// support available in ic_vetkeys, eg DerivedPublicKey::derive_sub_key
// since this avoids the cycles and time overhead of a management canister call
let result = ic_cdk::management_canister::vetkd_public_key(&request)
.await
.expect("call to vetkd_public_key failed");
Expand Down
3 changes: 3 additions & 0 deletions examples/encrypted_notes_dapp_vetkd/rust/backend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,9 @@ async fn symmetric_key_verification_key_for_note() -> String {
key_id: key_id(),
};

// In production systems it would make sense to use the offline derivation
// support available in ic_vetkeys, eg DerivedPublicKey::derive_sub_key
// since this avoids the cycles and time overhead of a management canister call
let response: VetKDPublicKeyResult = ic_cdk::management_canister::vetkd_public_key(&request)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is now also the encrypted_chat example, so maybe put the hint also there.

.await
.expect("call to vetkd_public_key failed");
Expand Down