Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TDX test network chainspec #1204

Merged
merged 6 commits into from
Dec 11, 2024
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ runtime
- Protocol message versioning ([#1140](https://github.com/entropyxyz/entropy-core/pull/1140))
- CLI command to get oracle headings ([#1170](https://github.com/entropyxyz/entropy-core/pull/1170))
- Add TSS endpoint to get TDX quote ([#1173](https://github.com/entropyxyz/entropy-core/pull/1173))
- Add TDX test network chainspec ([#1204](https://github.com/entropyxyz/entropy-core/pull/1204))
- Test CLI command to retrieve quote and change endpoint / TSS account in one command ([#1198](https://github.com/entropyxyz/entropy-core/pull/1198))

### Changed
Expand Down
11 changes: 8 additions & 3 deletions node/cli/src/chain_spec/dev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use crate::chain_spec::{get_account_id_from_seed, provisioning_certification_key, ChainSpec};
use crate::chain_spec::{
get_account_id_from_seed, provisioning_certification_key, ChainSpec, MrtdValues,
};
use crate::endowed_accounts::endowed_accounts_dev;

use entropy_runtime::{
Expand Down Expand Up @@ -123,6 +125,7 @@ pub fn development_config() -> ChainSpec {
vec![],
get_account_id_from_seed::<sr25519::Public>("Alice"),
devnet_four_node_initial_tss_servers(),
None,
))
.build()
}
Expand All @@ -148,6 +151,7 @@ pub fn devnet_local_four_node_config() -> crate::chain_spec::ChainSpec {
vec![],
get_account_id_from_seed::<sr25519::Public>("Alice"),
devnet_local_docker_four_node_initial_tss_servers(),
None,
))
.build()
}
Expand All @@ -169,6 +173,7 @@ pub fn development_genesis_config(
String,
BoundedVecEncodedVerifyingKey,
)>,
accepted_mrtd_values: Option<MrtdValues>,
) -> serde_json::Value {
// Note that any endowed_accounts added here will be included in the `elections` and
// `technical_committee` genesis configs. If you don't want that, don't push those accounts to
Expand Down Expand Up @@ -283,10 +288,10 @@ pub fn development_genesis_config(
max_instructions_per_programs: INITIAL_MAX_INSTRUCTIONS_PER_PROGRAM,
total_signers: TOTAL_SIGNERS,
threshold: SIGNER_THRESHOLD,
accepted_mrtd_values: vec![
accepted_mrtd_values: accepted_mrtd_values.unwrap_or(vec![
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Since in most cases we use the mock values, i've made this an option which if not given will use the mock values.

BoundedVec::try_from([0; 48].to_vec()).unwrap(),
BoundedVec::try_from([1; 48].to_vec()).unwrap(),
],
]),
..Default::default()
},
"programs": ProgramsConfig {
Expand Down
9 changes: 8 additions & 1 deletion node/cli/src/chain_spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

pub mod dev;
pub mod integration_tests;
pub mod tdx_testnet;
pub mod testnet;

pub use entropy_runtime::{AccountId, RuntimeGenesisConfig, Signature};
Expand All @@ -47,7 +48,10 @@ use serde_json::json;
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
use sp_consensus_babe::AuthorityId as BabeId;
use sp_core::{sr25519, Pair, Public};
use sp_runtime::traits::{IdentifyAccount, Verify};
use sp_runtime::{
traits::{ConstU32, IdentifyAccount, Verify},
BoundedVec,
};

type AccountPublic = <Signature as Verify>::Signer;

Expand Down Expand Up @@ -215,3 +219,6 @@ pub fn authority_keys_from_seed(
get_from_seed::<AuthorityDiscoveryId>(seed),
)
}

/// Accepted build time measurement values for TDX attestation
pub type MrtdValues = Vec<BoundedVec<u8, ConstU32<48>>>;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This type alias is already present in the parameters pallet, so possibly we could avoid duplicating it by having that as a dependency, or putting it in entropy-shared.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I'd say it's fine for now, if we use it more then we can move it somewhere better

98 changes: 98 additions & 0 deletions node/cli/src/chain_spec/tdx_testnet.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright (C) 2023 Entropy Cryptography Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use crate::chain_spec::{dev::development_genesis_config, get_account_id_from_seed, ChainSpec};

use entropy_runtime::wasm_binary_unwrap;
use entropy_shared::{BoundedVecEncodedVerifyingKey, X25519PublicKey as TssX25519PublicKey};
use sc_service::ChainType;
use sp_core::sr25519;
use sp_runtime::BoundedVec;

/// The build time measurement value from the current entropy-tss VM images
const ACCEPTED_MRTD: [u8; 48] = [
145, 235, 43, 68, 209, 65, 212, 236, 224, 159, 12, 117, 194, 197, 61, 36, 122, 60, 104, 237,
215, 250, 254, 138, 53, 32, 201, 66, 166, 4, 164, 7, 222, 3, 174, 109, 197, 248, 127, 39, 66,
139, 37, 56, 135, 49, 24, 183,
];

lazy_static::lazy_static! {
Copy link
Collaborator

Choose a reason for hiding this comment

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

A comment explaining how to generate this would be helpful

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is specific to our current box so probably this also should be read in from an environment variable or file no i think about it - but for now i will just put a comment explaining what it is.

/// This is the PCK from the certificates of the current TDX machine we are using for testing
pub static ref PCK: BoundedVecEncodedVerifyingKey = vec![
2, 166, 103, 136, 58, 157, 155, 124, 186, 75, 81, 133, 87, 255, 233, 182, 192, 125, 235, 230,
121, 173, 147, 108, 47, 190, 240, 181, 75, 181, 31, 148, 128,
].try_into().unwrap();
}

fn tdx_devnet_four_node_initial_tss_servers(
) -> Vec<(sp_runtime::AccountId32, TssX25519PublicKey, String, BoundedVecEncodedVerifyingKey)> {
let tss_ip = std::env::var("ENTROPY_TESTNET_TSS_IP")
.expect("ENTROPY_TESTNET_TSS_IP environment variable to be set");
Comment on lines +41 to +42
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why panic here instead of having a fallback to a default IP?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm not sure what default IP we can fallback to. localhost wont work because these are the IPs which the TSS nodes use to communicate with each other, and from the CVM point of view localhost is not the same as localhost on the host. I don't really want to hardcode the public IP of our current box.


let alice = (
crate::chain_spec::tss_account_id::ALICE.clone(),
crate::chain_spec::tss_x25519_public_key::ALICE,
format!("{tss_ip}:3001"),
PCK.clone(),
);

let bob = (
crate::chain_spec::tss_account_id::BOB.clone(),
crate::chain_spec::tss_x25519_public_key::BOB,
format!("{tss_ip}:3002"),
PCK.clone(),
);

let charlie = (
crate::chain_spec::tss_account_id::CHARLIE.clone(),
crate::chain_spec::tss_x25519_public_key::CHARLIE,
format!("{tss_ip}:3003"),
PCK.clone(),
);

let dave = (
crate::chain_spec::tss_account_id::DAVE.clone(),
crate::chain_spec::tss_x25519_public_key::DAVE,
format!("{tss_ip}:3004"),
PCK.clone(),
);

vec![alice, bob, charlie, dave]
}

/// The configuration used for the TDX testnet.
///
/// Since Entropy requires at two-of-three threshold setup, and requires an additional relayer node,
/// we spin up four validators: Alice, Bob, Charlie and Dave.
pub fn tdx_testnet_config() -> ChainSpec {
ChainSpec::builder(wasm_binary_unwrap(), Default::default())
.with_name("TDX-testnet")
.with_id("tdx")
.with_chain_type(ChainType::Development)
.with_properties(crate::chain_spec::entropy_properties())
.with_genesis_config_patch(development_genesis_config(
vec![
crate::chain_spec::authority_keys_from_seed("Alice"),
crate::chain_spec::authority_keys_from_seed("Bob"),
crate::chain_spec::authority_keys_from_seed("Charlie"),
crate::chain_spec::authority_keys_from_seed("Dave"),
],
vec![],
get_account_id_from_seed::<sr25519::Public>("Alice"),
tdx_devnet_four_node_initial_tss_servers(),
Some(vec![BoundedVec::try_from(ACCEPTED_MRTD.to_vec()).unwrap()]),
))
.build()
}
2 changes: 2 additions & 0 deletions node/cli/src/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ impl SubstrateCli for Cli {
// | integration-tests | Two nodes, Four threshold servers, Alice and Bob, Development Configuration |
// | testnet-local | Two Nodes, Two threshold servers, Alice and Bob, Testnet Configuration, Docker Compatible |
// | testnet | Four nodes, Two threshold servers, Own Seed, Testnet Configuration |
// | tdx-testnet | Four nodes, Four threshold servers, Alice Bob Chalie and Dave, Development Configuration adapted for TDX testnet |
fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
Ok(match id {
"" | "dev" => Box::new(chain_spec::dev::development_config()),
Expand All @@ -88,6 +89,7 @@ impl SubstrateCli for Cli {
},
"testnet-local" => Box::new(chain_spec::testnet::testnet_local_config()),
"testnet" => Box::new(chain_spec::testnet::testnet_config()),
"tdx-testnet" => Box::new(chain_spec::tdx_testnet::tdx_testnet_config()),
path => {
Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?)
},
Expand Down
Loading