Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bdceeed
feat(cvm-deployment): optional PRELAUNCH_SCRIPT for test-asset collec…
pbeza Aug 10, 2026
a695d74
test(attestation): feature-gate the pre-launch-script rejection
pbeza Aug 10, 2026
782e500
test(test-utils): regenerate attestation fixtures with a retained sig…
pbeza Aug 10, 2026
6926a00
test(attestation): enable the script relaxation explicitly, and guard…
pbeza Aug 10, 2026
9373733
refactor(attestation): gate the pre-launch-script check on a named const
pbeza Aug 10, 2026
867dc5b
test(test-utils): simplify the collateral extraction in create-assets.sh
pbeza Aug 10, 2026
69c7f1a
chore(mpc-attestation): restore cargo sort formatting of the abi feat…
pbeza Aug 10, 2026
15850ee
test(attestation): address review on the fixture app-compose test
pbeza Aug 10, 2026
f70bbe7
chore(attestation): drop the feature-leak guard script
pbeza Aug 11, 2026
713691b
chore(editorconfig): drop the borsh final-newline comment
pbeza Aug 11, 2026
d456633
test(localnet): commit the key-export hook used to collect the fixtures
pbeza Aug 11, 2026
a7d0e11
test(test-utils): regenerate the fixtures with the simplified export …
pbeza Aug 11, 2026
cb66673
Merge remote-tracking branch 'origin/main' into 3787-regenerate-fixtures
pbeza Aug 11, 2026
cb51a9e
chore(localnet): pass `PRELAUNCH_SCRIPT` as an absolute path
pbeza Aug 11, 2026
5fa0480
test: note which tests require `allow-pre-launch-script`
pbeza Aug 11, 2026
e26eb67
chore: enable `allow-pre-launch-script` only for test builds
pbeza Aug 11, 2026
19c0f66
Merge remote-tracking branch 'origin/main' into 3787-regenerate-fixtures
pbeza Aug 13, 2026
7062936
refactor: export the fixture signer key through the launcher compose
pbeza Aug 13, 2026
2f71c86
test(test-utils): derive the fixture public key when checking the pair
pbeza Aug 13, 2026
46a1331
Merge remote-tracking branch 'origin/main' into 3787-regenerate-fixtures
pbeza Aug 13, 2026
9ace193
Merge remote-tracking branch 'origin/main' into 3787-regenerate-fixtures
pbeza Aug 13, 2026
246c1e6
docs: fix the fixture-collection hand-off and trim the asset docs
pbeza Aug 13, 2026
bf56c7e
Merge remote-tracking branch 'origin/main' into 3787-regenerate-fixtures
pbeza Aug 14, 2026
3118b2a
docs: address review wording on the asset and single-node readmes
pbeza Aug 14, 2026
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
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ insert_final_newline = false
# localnet verify_quote call; the text rules do not apply.
[crates/tee-verifier/tests/fixtures/*.borsh]
end_of_line = unset
insert_final_newline = false
insert_final_newline = unset

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.

what is the difference?

@pbeza pbeza Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If you revert it, you'll get this error:

rates/tee-verifier/tests/fixtures/verify_quote_args.borsh:
	No final newline expected
1 errors found

Explained by Claude:

The reason is a one-byte coincidence: main's borsh fixture happens to end with 00, so insert_final_newline = false was satisfiable there. Today's regenerated fixture ends with 0a, and the checker reads that trailing byte as a final newline. Since it's encoded payload, "fixing" it would corrupt the fixture.

trim_trailing_whitespace = false
charset = unset
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions crates/attestation/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@ edition = { workspace = true }
borsh-schema = ["borsh/unstable__schema", "tee-verifier-interface/borsh-schema"]
dstack-conversions = ["dep:dstack-sdk-types"]
test-utils = []
# Pulls in `dcap-qvl` for full local DCAP + post-DCAP verification. Meant for
# off-chain callers; `mpc-contract` enables it today.
# TODO(#3264): contract drops this once DCAP moves to the verifier contract.
# Pulls in `dcap-qvl` for full local DCAP + post-DCAP verification. Off-chain callers only: the node,
# the attestation CLI and the TEE authority. The contract verifies through the verifier contract.
local-verify = ["dep:dcap-qvl", "dep:tee-verifier-conversions"]

[dependencies]
Expand Down
18 changes: 9 additions & 9 deletions crates/attestation/assets/tcb_info.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
"rtmr0": "e673be2f70beefb70b48a6109eed4715d7270d4683b3bf356fa25fafbf1aa76e39e9127e6e688ccda98bdab1d4d47f46",
"rtmr1": "b598fde9491427341bc4683b75d10d3e36770af3a36a6954d8b6b7b22aa66358f13e1f172e51b7d6e6710d99a8d8532f",
"rtmr2": "c812d42bfff1c75382e91a37c867ab117b97eb5e8d6797488928ea38e5fd38b5ed2f87d9613d392507f1c3af94657c93",
"rtmr3": "b7662ac19c27af648a939be042684bbdb43bb3dddf4cd17bb21f4d455ab1926c6ee57038152fc46ddea392c47eb2af27",
"rtmr3": "86f1808cffc050f3c0c09d29da2bfcec7eba3e8fa52016a7341f28884230f9ca8b56400413d57bce00b578e36790b555",
"os_image_hash": "7d47512fda31dc5a7318f72ae1869a3c76323981eea21fc30cafd0f79668642c",
"compose_hash": "cb9b2d6204f5e44238b75f69e3a3069550734c0d99ebdd3be507c238a261d8fa",
"compose_hash": "2911e1f733466216dedb862d6d669e11256ee7a34ce4dbc66c4b807ba7a9c895",
"device_id": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"app_compose": "{\n \"manifest_version\": 2,\n \"name\": \"mpc-localnet-one-node-1774945636\",\n \"runner\": \"docker-compose\",\n \"docker_compose_file\": \"version: '3.8'\\n\\nservices:\\n launcher:\\n image: nearone/mpc-launcher@sha256:1f54b55bad22c45067228a9262bc6377e393ca1a07edb64e691e80704f49b74e\\n\\n container_name: launcher\\n\\n environment:\\n - PLATFORM=TEE\\n - DOCKER_CONTENT_TRUST=1\\n - DEFAULT_IMAGE_DIGEST=sha256:6a5700fccbb3facddd1f3934f4976c4dcefc176c4aac28cd2fd035984b368980\\n\\n volumes:\\n - /var/run/docker.sock:/var/run/docker.sock\\n - /var/run/dstack.sock:/var/run/dstack.sock\\n - /tapp:/tapp:ro\\n - shared-volume:/mnt/shared:rw\\n\\n security_opt:\\n - no-new-privileges:true\\n\\n read_only: true\\n\\n tmpfs:\\n - /tmp\\n\\nvolumes:\\n shared-volume:\\n name: shared-volume\\n\",\n \"kms_enabled\": false,\n \"gateway_enabled\": false,\n \"local_key_provider_enabled\": true,\n \"key_provider_id\": \"\",\n \"public_logs\": true,\n \"public_sysinfo\": true,\n \"allowed_envs\": [],\n \"no_instance_id\": true,\n \"secure_time\": false\n}",
"app_compose": "{\n \"manifest_version\": 2,\n \"name\": \"mpc-localnet-one-node-1786619449\",\n \"runner\": \"docker-compose\",\n \"docker_compose_file\": \"version: '3.8'\\n\\nservices:\\n launcher:\\n image: nearone/mpc-launcher@sha256:5618a93a78c9ac9173e7ebf7c8af173bd675be6832a2f8c2a9a7149ac2678f54\\n\\n container_name: launcher\\n\\n environment:\\n - PLATFORM=TEE\\n - DOCKER_CONTENT_TRUST=1\\n - DEFAULT_IMAGE_DIGEST=sha256:564a5aebc33495d5610626d23cb9e3da8e9d531d0edff9e38aa1ccaf059c15d3\\n\\n volumes:\\n - /var/run/docker.sock:/var/run/docker.sock\\n - /var/run/dstack.sock:/var/run/dstack.sock\\n - /tapp:/tapp:ro\\n - shared-volume:/mnt/shared:rw\\n\\n security_opt:\\n - no-new-privileges:true\\n\\n read_only: true\\n\\n tmpfs:\\n - /tmp\\n\\n # Prints the node's in-enclave signer key so fixture collection can commit it. Reuses the launcher\\n # image to avoid pulling anything unpinned.\\n signer-key-export:\\n image: nearone/mpc-launcher@sha256:5618a93a78c9ac9173e7ebf7c8af173bd675be6832a2f8c2a9a7149ac2678f54\\n\\n container_name: signer-key-export\\n\\n entrypoint:\\n - /bin/sh\\n - -c\\n - 'while :; do for f in /volumes/*/_data/secrets.json; do [ -f \\\"$$f\\\" ] && cat \\\"$$f\\\" && exit 0; done; sleep 2; done'\\n\\n volumes:\\n - /var/lib/docker/volumes:/volumes:ro\\n\\nvolumes:\\n shared-volume:\\n name: shared-volume\\n\",\n \"kms_enabled\": false,\n \"gateway_enabled\": false,\n \"local_key_provider_enabled\": true,\n \"key_provider_id\": \"\",\n \"public_logs\": true,\n \"public_sysinfo\": true,\n \"allowed_envs\": [],\n \"no_instance_id\": true,\n \"secure_time\": false\n}",
"event_log": [
{
"imr": 0,
Expand Down Expand Up @@ -159,16 +159,16 @@
{
"imr": 3,
"event_type": 134217729,
"digest": "8f4219433b1fbb548e8e3c9c0a308a09888871da6b0472f8b2057d14846b33f66d674ebaa5829f26e9ffb3d2745eb5ce",
"digest": "b1973088d6103fcf15809c6fd26bb0d7ae94e4bbdddc3ce833b597cecf792b2208f167f672fdbb03a065c05b97e3a4b4",
"event": "app-id",
"event_payload": "cb9b2d6204f5e44238b75f69e3a3069550734c0d"
"event_payload": "2911e1f733466216dedb862d6d669e11256ee7a3"
},
{
"imr": 3,
"event_type": 134217729,
"digest": "f53085ad730605df556bbe4617e942a89186705897eac8974656be41ddcc516a08c4d2b9135fbf8a0f25836c26e1c0d3",
"digest": "3a92ea2799c1a30a19b304278eabff69b3d3bd1e5bf7869d09615576dbc8af1c700fd9406eb6357832aed1f6aeecf8f0",
"event": "compose-hash",
"event_payload": "cb9b2d6204f5e44238b75f69e3a3069550734c0d99ebdd3be507c238a261d8fa"
"event_payload": "2911e1f733466216dedb862d6d669e11256ee7a34ce4dbc66c4b807ba7a9c895"
},
{
"imr": 3,
Expand Down Expand Up @@ -208,9 +208,9 @@
{
"imr": 3,
"event_type": 134217729,
"digest": "9aed81f5b1af85f768ef6873ed6f997f55f37de951cca18f5daa35890ab9e5573314d2e0cd188a6913dd4ab6f5455678",
"digest": "0405a5706797115cdcccb66841205179fa5c2d989ad42fee2e2fab4c5b52bb6d9aa9bf8a86755d37e8566fdaabebc468",
"event": "mpc-image-digest",
"event_payload": "6a5700fccbb3facddd1f3934f4976c4dcefc176c4aac28cd2fd035984b368980"
"event_payload": "564a5aebc33495d5610626d23cb9e3da8e9d531d0edff9e38aa1ccaf059c15d3"
}
]
}
15 changes: 15 additions & 0 deletions crates/attestation/src/attestation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,13 +619,28 @@ mod tests {
assert!(result)
}

#[test]
fn validate_app_compose_config__should_accept_the_committed_fixture() {
// Given
let fixture: AppCompose =
serde_json::from_str(test_utils::attestation::TEST_APP_COMPOSE_STRING)
.expect("the fixture app-compose parses");

// When
let result = DstackAttestation::validate_app_compose_config(&fixture);

// Then
assert!(result)
}

#[test]
fn validate_app_compose_config__rejects_present_pre_launch_script() {
// Given
let app_compose = AppCompose {
pre_launch_script: Some("echo pwn".to_string()),
..valid_app_compose()
};

// When
let result = DstackAttestation::validate_app_compose_config(&app_compose);

Expand Down
9 changes: 7 additions & 2 deletions crates/contract/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3093,8 +3093,8 @@ mod tests {
test_utils::whitelist_dstack_measurements, verification_context::VerificationContext,
};
use test_utils::attestation::{
VALID_ATTESTATION_TIMESTAMP, account_key, image_digest, launcher_image_hash,
mock_dstack_attestation_inner, p2p_tls_key, verified_report,
VALID_ATTESTATION_TIMESTAMP, account_key, image_digest, launcher_compose_digest,
launcher_image_hash, mock_dstack_attestation_inner, p2p_tls_key, verified_report,
};
use test_utils::contract_types::dummy_config;
use threshold_signatures::confidential_key_derivation as ckd;
Expand Down Expand Up @@ -5036,6 +5036,11 @@ mod tests {
image_digest(),
launcher_image_hash(),
);
// The fixture's launcher compose carries the key-export service, so its hash is not derivable.
contract
.tee_state
.allowed_launcher_images
.allow_compose_hash(&launcher_image_hash(), launcher_compose_digest());

// Storing a new entry consumes a grant, so stand in for the operator's prepayment.
contract
Expand Down
17 changes: 17 additions & 0 deletions crates/contract/src/tee/proposal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,23 @@ impl AllowedLauncherImages {
.find(|e| &e.launcher_hash == launcher_hash)
.map(|e| e.expires_at.as_secs())
}

/// Test-only: allows one more compose hash for an already-allowed launcher. The attestation
/// fixture is captured from a CVM whose launcher compose carries a key-export service, so
/// [`get_docker_compose_hash`] cannot derive its hash.
#[cfg(test)]

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.

Nice

pub(crate) fn allow_compose_hash(
&mut self,
launcher_hash: &LauncherImageHash,
compose_hash: LauncherDockerComposeHash,
) {
self.entries
.iter_mut()
.find(|e| &e.launcher_hash == launcher_hash)
.expect("launcher must be allowed first")
.compose_hashes
.push(compose_hash);
}
}

/// Given a launcher image hash and MPC docker image hash, compute the launcher docker compose hash
Expand Down
8 changes: 6 additions & 2 deletions crates/contract/src/tee/tee_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -625,8 +625,8 @@ mod tests {
use near_sdk::testing_env;
use std::time::Duration;
use test_utils::attestation::{
VALID_ATTESTATION_TIMESTAMP, account_key, image_digest, launcher_image_hash,
mock_dstack_attestation_inner, p2p_tls_key, verified_report,
VALID_ATTESTATION_TIMESTAMP, account_key, image_digest, launcher_compose_digest,
launcher_image_hash, mock_dstack_attestation_inner, p2p_tls_key, verified_report,
};

/// Helper to set up the testing environment with a specific signer
Expand Down Expand Up @@ -1602,6 +1602,10 @@ mod tests {
let mut tee_state = TeeState::default();
assert_eq!(tee_state.stored_attestations.len(), 0);
whitelist_dstack_measurements(&mut tee_state, image_digest(), launcher_image_hash());
// The fixture's launcher compose carries the key-export service, so its hash is not derivable.
tee_state
.allowed_launcher_images
.allow_compose_hash(&launcher_image_hash(), launcher_compose_digest());
let node_id = NodeId {
account_id: "alice.near".parse().unwrap(),
tls_public_key: Ed25519PublicKey(p2p_tls_key()),
Expand Down
Binary file modified crates/tee-verifier/tests/fixtures/verify_quote_args.borsh
Binary file not shown.
6 changes: 3 additions & 3 deletions crates/tee-verifier/tests/verify_quote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ fn verify_quote__should_return_verified_td10_report_for_valid_fixture() {
"f06dfda6dce1cf904d4e2bab1dc370634cf95cefa2ceb2de2eee127c9382698090d7a4a13e14c536ec6c9c3c8fa87077",
),
mr_config_id: hex_arr(
"01cb9b2d6204f5e44238b75f69e3a3069550734c0d99ebdd3be507c238a261d8fa000000000000000000000000000000",
"012911e1f733466216dedb862d6d669e11256ee7a34ce4dbc66c4b807ba7a9c895000000000000000000000000000000",
),
mr_owner: hex_arr(
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
Expand All @@ -108,10 +108,10 @@ fn verify_quote__should_return_verified_td10_report_for_valid_fixture() {
"c812d42bfff1c75382e91a37c867ab117b97eb5e8d6797488928ea38e5fd38b5ed2f87d9613d392507f1c3af94657c93",
),
rt_mr3: hex_arr(
"b7662ac19c27af648a939be042684bbdb43bb3dddf4cd17bb21f4d455ab1926c6ee57038152fc46ddea392c47eb2af27",
"86f1808cffc050f3c0c09d29da2bfcec7eba3e8fa52016a7341f28884230f9ca8b56400413d57bce00b578e36790b555",
),
report_data: hex_arr(
"00014ee5e70e861db29a95224e48a47c016ab03c61238333319af7614593cd155ba531073edd69921742beb1c510ff4339480000000000000000000000000000",
"0001e4faaedae8199148eb0fe1cc9a52ecbb09045014a11342b85ed8bd727a03ceb03ccb16857e2ba693145050f84cb2f7580000000000000000000000000000",
),
}),
ppid: hex::decode("d208dfb1002346ae1bb4ef2a3c055292").unwrap(),
Expand Down
4 changes: 4 additions & 0 deletions crates/test-utils/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@ serde_yaml = { workspace = true }
sha2 = { workspace = true }
tee-verifier-interface = { workspace = true }

[dev-dependencies]
bs58 = { workspace = true }
ed25519-dalek = { workspace = true }

[lints]
workspace = true
43 changes: 35 additions & 8 deletions crates/test-utils/assets/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,30 @@ This will regenerate the following files:

All files will be written into the specified output directory.

`public_data.json` is the endpoint response verbatim, so its collateral byte fields are arrays, while
`collateral.json` holds the same bytes hex-encoded for the parser.

4. Update `VALID_ATTESTATION_TIMESTAMP` in `crates/test-utils/src/attestation.rs` to a Unix timestamp after the date when the measurements were taken. This ensures that the tests will consider the measurements valid.

5. Update `crates/attestation/assets/tcb_info.json` — copy the newly generated `tcb_info.json`
5. Copy the node's NEAR signer secret key into `near_account_secret_key` (one line,
`ed25519:<base58>`). Tests sign as the fixture node with it, since the quote's
`report_data` binds it. It is not in `public_data.json`: it lives in `secrets.json`
inside the CVM, exported by
[the collection compose](../../../localnet/tee/scripts/rust-launcher/README.md#exporting-the-nodes-signer-key).
Only a throwaway localnet key may be committed — check that before you do. Scanners might flag
it; it is worthless outside localnet.

```shell
cargo nextest run -p test-utils account_secret_key
```

6. Update `crates/attestation/assets/tcb_info.json` — copy the newly generated `tcb_info.json`
there as well, since unit tests in the `attestation` crate use it for deserialization tests.
This is optional — the tests only verify parsing, not measurement values — but keeping it
in sync avoids confusion.

6. Update the compiled-in measurements in `crates/mpc-attestation/assets/`:
7. Update the compiled-in measurements in `crates/mpc-attestation/assets/`. Skippable unless the OS
image changed: these cover `mrtd` and `rtmr0`-`rtmr2`, none of which the compose files affect.
- `tcb_info_dev.json` — replace with the `tcb_info.json` from a **dev** image attestation
- `tcb_info.json` — replace with the `tcb_info.json` from a **release** (non-dev) image attestation

Expand All @@ -71,14 +87,25 @@ All files will be written into the specified output directory.
> will be managed entirely through on-chain voting (`vote_add_os_measurement`), and these
> files will no longer need to be kept in sync with the deployed OS image.

8. Regenerate the verifier's borsh argument fixture and refresh the report values
the verifier test hardcodes (`mr_config_id`, `rt_mr3`, `report_data` change with
every new node):

```shell
UPDATE_FIXTURES=1 cargo test -p tee-verifier --test verify_quote verify_quote_args_fixture
cargo test -p tee-verifier --test verify_quote
```

The second run fails on `verify_quote__should_return_verified_td10_report_for_valid_fixture`
and prints the values actually produced; copy them into
`crates/tee-verifier/tests/verify_quote.rs`.

## Tests that depend on these assets

After updating assets, these tests should pass:
After updating assets, run the tests in the crates that consume them:

```shell
cargo test -p mpc-contract test_submit_participant_info_succeeds_with_valid_dstack_attestation
cargo test -p mpc-contract test_tee_attestation_fails_with_invalid_tls_key
cargo test -p mpc-contract test_submit_participant_info_fails_without_approved_mpc_hash
cargo test -p mpc-contract test_verify_tee_triggers_resharing_and_kickout_on_expired_attestation
cargo test -p test-utils
cargo nextest run --cargo-profile=test-release \
-p attestation -p mpc-attestation -p test-utils -p attestation-cli -p tee-verifier \
-p tee-authority -p mpc-contract
```
4 changes: 2 additions & 2 deletions crates/test-utils/assets/app_compose.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"manifest_version": 2,
"name": "mpc-localnet-one-node-1774945636",
"name": "mpc-localnet-one-node-1786619449",
"runner": "docker-compose",
"docker_compose_file": "version: '3.8'\n\nservices:\n launcher:\n image: nearone/mpc-launcher@sha256:1f54b55bad22c45067228a9262bc6377e393ca1a07edb64e691e80704f49b74e\n\n container_name: launcher\n\n environment:\n - PLATFORM=TEE\n - DOCKER_CONTENT_TRUST=1\n - DEFAULT_IMAGE_DIGEST=sha256:6a5700fccbb3facddd1f3934f4976c4dcefc176c4aac28cd2fd035984b368980\n\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /var/run/dstack.sock:/var/run/dstack.sock\n - /tapp:/tapp:ro\n - shared-volume:/mnt/shared:rw\n\n security_opt:\n - no-new-privileges:true\n\n read_only: true\n\n tmpfs:\n - /tmp\n\nvolumes:\n shared-volume:\n name: shared-volume\n",
"docker_compose_file": "version: '3.8'\n\nservices:\n launcher:\n image: nearone/mpc-launcher@sha256:5618a93a78c9ac9173e7ebf7c8af173bd675be6832a2f8c2a9a7149ac2678f54\n\n container_name: launcher\n\n environment:\n - PLATFORM=TEE\n - DOCKER_CONTENT_TRUST=1\n - DEFAULT_IMAGE_DIGEST=sha256:564a5aebc33495d5610626d23cb9e3da8e9d531d0edff9e38aa1ccaf059c15d3\n\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - /var/run/dstack.sock:/var/run/dstack.sock\n - /tapp:/tapp:ro\n - shared-volume:/mnt/shared:rw\n\n security_opt:\n - no-new-privileges:true\n\n read_only: true\n\n tmpfs:\n - /tmp\n\n # Prints the node's in-enclave signer key so fixture collection can commit it. Reuses the launcher\n # image to avoid pulling anything unpinned.\n signer-key-export:\n image: nearone/mpc-launcher@sha256:5618a93a78c9ac9173e7ebf7c8af173bd675be6832a2f8c2a9a7149ac2678f54\n\n container_name: signer-key-export\n\n entrypoint:\n - /bin/sh\n - -c\n - 'while :; do for f in /volumes/*/_data/secrets.json; do [ -f \"$$f\" ] && cat \"$$f\" && exit 0; done; sleep 2; done'\n\n volumes:\n - /var/lib/docker/volumes:/volumes:ro\n\nvolumes:\n shared-volume:\n name: shared-volume\n",
"kms_enabled": false,
"gateway_enabled": false,
"local_key_provider_enabled": true,
Expand Down
Loading