From 8386e4f1fa3117ed104931dba58ed3e42b36e223 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Sep 2022 11:40:56 +0200 Subject: [PATCH 1/5] Initialise a secp256k1 account with ICP --- e2e/assets/nns/ident-1/identity.pem | 5 ++++ e2e/tests-dfx/nns.bash | 13 +++++++++ src/dfx/src/lib/nns/install_nns.rs | 10 +++++-- src/dfx/src/lib/nns/install_nns/canisters.rs | 29 +++++++++++++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 e2e/assets/nns/ident-1/identity.pem diff --git a/e2e/assets/nns/ident-1/identity.pem b/e2e/assets/nns/ident-1/identity.pem new file mode 100644 index 0000000000..0b3a1f3bc5 --- /dev/null +++ b/e2e/assets/nns/ident-1/identity.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHQCAQEEICJxApEbuZznKFpV+VKACRK30i6+7u5Z13/DOl18cIC+oAcGBSuBBAAK +oUQDQgAEPas6Iag4TUx+Uop+3NhE6s3FlayFtbwdhRVjvOar0kPTfE/N8N6btRnd +74ly5xXEBNSXiENyxhEuzOZrIWMCNQ== +-----END EC PRIVATE KEY----- diff --git a/e2e/tests-dfx/nns.bash b/e2e/tests-dfx/nns.bash index 037e250f46..c76c30ac49 100755 --- a/e2e/tests-dfx/nns.bash +++ b/e2e/tests-dfx/nns.bash @@ -144,6 +144,19 @@ assert_nns_canister_id_matches() { wasm_matches internet_identity internet_identity_dev.wasm wasm_matches nns-dapp nns-dapp_local.wasm + account_has_funds() { + assert_command dfx ledger balance "$1" + assert_eq "1000000000.00000000 ICP" + } + SECP256K1_ACCOUNT_ID="2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138" + ED25519_ACCOUNT_ID="5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087" + account_has_funds "$SECP256K1_ACCOUNT_ID" + account_has_funds "$ED25519_ACCOUNT_ID" + install_asset ident-1 + dfx identity import ident-1 ident-1/identity.pem + assert_command dfx ledger account-id --identity indent-1 + assert_eq "$SECP256K1_ACCOUNT_ID" + echo Stopping dfx... dfx stop } diff --git a/src/dfx/src/lib/nns/install_nns.rs b/src/dfx/src/lib/nns/install_nns.rs index 5e05bf5189..b0d485bdf3 100644 --- a/src/dfx/src/lib/nns/install_nns.rs +++ b/src/dfx/src/lib/nns/install_nns.rs @@ -75,7 +75,7 @@ pub async fn install_nns( let ic_nns_init_opts = IcNnsInitOpts { wasm_dir: nns_wasm_dir(env), nns_url: nns_url.to_string(), - test_accounts: Some(canisters::TEST_ACCOUNT.to_string()), + test_accounts: vec![canisters::ED25519_TEST_ACCOUNT.to_string(), canisters::SECP256K1_TEST_ACCOUNT.to_string()], sns_subnets: Some(subnet_id.to_string()), }; ic_nns_init(ic_nns_init_path, &ic_nns_init_opts).await?; @@ -450,7 +450,7 @@ pub struct IcNnsInitOpts { wasm_dir: PathBuf, /// The ID of a test account that ic-nns-init will create and to initialise with tokens. /// Note: At present only one test account is supported. - test_accounts: Option, + test_accounts: Vec, /// A subnet for SNS canisters. /// Note: In this context we support at most one subnet. sns_subnets: Option, @@ -477,6 +477,12 @@ pub async fn ic_nns_init(ic_nns_init_path: &Path, opts: &IcNnsInitOpts) -> anyho cmd.arg("--sns-subnet"); cmd.arg(subnet); }); + let args: Vec<_> = cmd + .get_args() + .into_iter() + .map(OsStr::to_string_lossy) + .collect(); + println!("ic-nns-init {args}"); cmd.stdout(std::process::Stdio::inherit()); cmd.stderr(std::process::Stdio::inherit()); let output = cmd diff --git a/src/dfx/src/lib/nns/install_nns/canisters.rs b/src/dfx/src/lib/nns/install_nns/canisters.rs index 539e1c1bd8..41c6245b53 100644 --- a/src/dfx/src/lib/nns/install_nns/canisters.rs +++ b/src/dfx/src/lib/nns/install_nns/canisters.rs @@ -179,4 +179,31 @@ pub const SNS_CANISTERS: [&SnsCanisterInstallation; 5] = [ ]; /// Test account with well known public & private keys, used in NNS_LEDGER, NNS_DAPP and third party projects. -pub const TEST_ACCOUNT: &str = "5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087"; +/// The keys use the ED25519 curve, used for BasicIdentity on th eInternet Computer. +/// The keys are as follows, in the tweetnacl format used by agent-js: +/// ``` +/// const publicKey = "Uu8wv55BKmk9ZErr6OIt5XR1kpEGXcOSOC1OYzrAwuk="; +/// const privateKey = +/// "N3HB8Hh2PrWqhWH2Qqgr1vbU9T3gb1zgdBD8ZOdlQnVS7zC/nkEqaT1kSuvo4i3ldHWSkQZdw5I4LU5jOsDC6Q=="; +/// const identity = Ed25519KeyIdentity.fromKeyPair( +/// base64ToUInt8Array(publicKey), +/// base64ToUInt8Array(privateKey) +/// ); +/// ``` +pub const ED25519_TEST_ACCOUNT: &str = "5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087"; + +/// Test account for command line usage. The test account is typically called ident-1 +/// The keys use the secp256k1 curve. To use: +/// ``` +/// $ cat ~/.config/dfx/identity/ident-1/identity.pem +/// -----BEGIN EC PRIVATE KEY----- +/// MHQCAQEEICJxApEbuZznKFpV+VKACRK30i6+7u5Z13/DOl18cIC+oAcGBSuBBAAK +/// oUQDQgAEPas6Iag4TUx+Uop+3NhE6s3FlayFtbwdhRVjvOar0kPTfE/N8N6btRnd +/// 74ly5xXEBNSXiENyxhEuzOZrIWMCNQ== +/// -----END EC PRIVATE KEY----- +/// ``` +/// The test account should match the output of: +/// ``` +/// $ dfx --identity ident-1 ledger account-id +/// ``` +pub const SECP256K1_TEST_ACCOUNT: &str = "2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138"; \ No newline at end of file From 724ed4bfc5b9ba26f486408549da55c3062a2726 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Sep 2022 12:41:08 +0200 Subject: [PATCH 2/5] fmt --- src/dfx/src/lib/nns/install_nns.rs | 16 ++++++++++------ src/dfx/src/lib/nns/install_nns/canisters.rs | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/dfx/src/lib/nns/install_nns.rs b/src/dfx/src/lib/nns/install_nns.rs index b0d485bdf3..fbbb11c6ac 100644 --- a/src/dfx/src/lib/nns/install_nns.rs +++ b/src/dfx/src/lib/nns/install_nns.rs @@ -26,6 +26,7 @@ use ic_agent::Agent; use ic_utils::interfaces::management_canister::builders::InstallMode; use ic_utils::interfaces::ManagementCanister; use reqwest::Url; +use std::ffi::OsStr; use std::fs; use std::io::Write; use std::path::Component; @@ -75,7 +76,10 @@ pub async fn install_nns( let ic_nns_init_opts = IcNnsInitOpts { wasm_dir: nns_wasm_dir(env), nns_url: nns_url.to_string(), - test_accounts: vec![canisters::ED25519_TEST_ACCOUNT.to_string(), canisters::SECP256K1_TEST_ACCOUNT.to_string()], + test_accounts: vec![ + canisters::ED25519_TEST_ACCOUNT.to_string(), + canisters::SECP256K1_TEST_ACCOUNT.to_string(), + ], sns_subnets: Some(subnet_id.to_string()), }; ic_nns_init(ic_nns_init_path, &ic_nns_init_opts).await?; @@ -478,11 +482,11 @@ pub async fn ic_nns_init(ic_nns_init_path: &Path, opts: &IcNnsInitOpts) -> anyho cmd.arg(subnet); }); let args: Vec<_> = cmd - .get_args() - .into_iter() - .map(OsStr::to_string_lossy) - .collect(); - println!("ic-nns-init {args}"); + .get_args() + .into_iter() + .map(OsStr::to_string_lossy) + .collect(); + println!("ic-nns-init {}", args.join(" ")); cmd.stdout(std::process::Stdio::inherit()); cmd.stderr(std::process::Stdio::inherit()); let output = cmd diff --git a/src/dfx/src/lib/nns/install_nns/canisters.rs b/src/dfx/src/lib/nns/install_nns/canisters.rs index 41c6245b53..5d26e0dc25 100644 --- a/src/dfx/src/lib/nns/install_nns/canisters.rs +++ b/src/dfx/src/lib/nns/install_nns/canisters.rs @@ -190,7 +190,8 @@ pub const SNS_CANISTERS: [&SnsCanisterInstallation; 5] = [ /// base64ToUInt8Array(privateKey) /// ); /// ``` -pub const ED25519_TEST_ACCOUNT: &str = "5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087"; +pub const ED25519_TEST_ACCOUNT: &str = + "5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087"; /// Test account for command line usage. The test account is typically called ident-1 /// The keys use the secp256k1 curve. To use: @@ -206,4 +207,5 @@ pub const ED25519_TEST_ACCOUNT: &str = "5b315d2f6702cb3a27d826161797d7b2c2e131cd /// ``` /// $ dfx --identity ident-1 ledger account-id /// ``` -pub const SECP256K1_TEST_ACCOUNT: &str = "2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138"; \ No newline at end of file +pub const SECP256K1_TEST_ACCOUNT: &str = + "2b8fbde99de881f695f279d2a892b1137bfe81a42d7694e064b1be58701e1138"; From ff1faf63886c6b59261e2e44f555024a91b657a5 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Sep 2022 12:50:15 +0200 Subject: [PATCH 3/5] changelog++ --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e730e004fe..4cf756a64b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## DFX +### feat: Initialise the nns with an account controlled by a secp256k1 key + +This enables easy access to toy ICP using command line tools. + ### feat: default to run ic-wasm shrink when build canisters This behavior applies to Motoko, Rust and Custom canisters. If you want to disable this behavior, you can config it in dfx.json: From d1cf191bff98e73a7a39f974d9226f8d06db1ec9 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 26 Sep 2022 13:01:30 +0200 Subject: [PATCH 4/5] Fix identity import --- e2e/tests-dfx/nns.bash | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/e2e/tests-dfx/nns.bash b/e2e/tests-dfx/nns.bash index c76c30ac49..84892277e7 100755 --- a/e2e/tests-dfx/nns.bash +++ b/e2e/tests-dfx/nns.bash @@ -115,7 +115,8 @@ assert_nns_canister_id_matches() { dfx_start_for_nns_install dfx nns install - echo Checking that the install worked... + echo "Checking that the install worked..." + echo " The expected wasms should be installed..." # Note: The installation is quite expensive, so we test extensively on one installation # rather than doing a separate installation for every test. The tests are read-only # so no test should affect the output of another. @@ -144,6 +145,7 @@ assert_nns_canister_id_matches() { wasm_matches internet_identity internet_identity_dev.wasm wasm_matches nns-dapp nns-dapp_local.wasm + echo " Accounts should have funds..." account_has_funds() { assert_command dfx ledger balance "$1" assert_eq "1000000000.00000000 ICP" @@ -152,9 +154,11 @@ assert_nns_canister_id_matches() { ED25519_ACCOUNT_ID="5b315d2f6702cb3a27d826161797d7b2c2e131cd312aece51d4d5574d1247087" account_has_funds "$SECP256K1_ACCOUNT_ID" account_has_funds "$ED25519_ACCOUNT_ID" - install_asset ident-1 - dfx identity import ident-1 ident-1/identity.pem - assert_command dfx ledger account-id --identity indent-1 + + echo " The secp256k1 account can be controlled from the command line" + install_asset nns + dfx identity import --force --disable-encryption ident-1 ident-1/identity.pem + assert_command dfx ledger account-id --identity ident-1 assert_eq "$SECP256K1_ACCOUNT_ID" echo Stopping dfx... From 091dd281ceaa84a2785b7373fa0db669ee9ed1f7 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 27 Sep 2022 10:23:40 +0200 Subject: [PATCH 5/5] Add key to changelog --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf756a64b..2f89ff080a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,21 @@ ### feat: Initialise the nns with an account controlled by a secp256k1 key -This enables easy access to toy ICP using command line tools. +This enables easy access to toy ICP using command line tools and this key: +``` +-----BEGIN EC PRIVATE KEY----- +MHQCAQEEICJxApEbuZznKFpV+VKACRK30i6+7u5Z13/DOl18cIC+oAcGBSuBBAAK +oUQDQgAEPas6Iag4TUx+Uop+3NhE6s3FlayFtbwdhRVjvOar0kPTfE/N8N6btRnd +74ly5xXEBNSXiENyxhEuzOZrIWMCNQ== +-----END EC PRIVATE KEY----- +``` +For example, you can create an identity in dfx by putting this key in the file `ident-1.pem` and importing it: +``` +dfx identity import ident-1 ident-1.pem +dfx --identity ident-1 ledger balance +``` + + ### feat: default to run ic-wasm shrink when build canisters This behavior applies to Motoko, Rust and Custom canisters.