Skip to content

Commit

Permalink
[fix] address comments
Browse files Browse the repository at this point in the history
moved signing from kagami to genesis
moved genesis signing from kagami_crypto to kagami_genesis
some renames from PR

Signed-off-by: VAmuzing <amuzik95@gmail.com>
  • Loading branch information
VAmuzing committed Apr 14, 2024
1 parent 7bec110 commit 1e31472
Show file tree
Hide file tree
Showing 17 changed files with 385 additions and 350 deletions.
11 changes: 7 additions & 4 deletions cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use iroha_core::{
IrohaNetwork,
};
use iroha_data_model::prelude::*;
use iroha_genesis::{GenesisNetwork, RawGenesisBlock, SignedGenesisConfig};
use iroha_genesis::{GenesisNetwork, GenesisSignature, RawGenesisBlock};
use iroha_logger::{actor::LoggerHandle, InitConfig as LoggerInitConfig};
use iroha_torii::Torii;
use tokio::{
Expand Down Expand Up @@ -508,14 +508,17 @@ pub fn read_config_and_genesis(
let genesis = if let Genesis::Full {
public_key: _,
file,
encoded_config: encoded_genesis_config,
signature: encoded_signature,
} = &config.genesis
{
let raw_genesis = RawGenesisBlock::from_path(file)?;

let signed_genesis_config = SignedGenesisConfig::from_hex_string(encoded_genesis_config)?;
let signed_genesis_config = GenesisSignature::from_hex_string(encoded_signature)?;

Some(signed_genesis_config.validate(raw_genesis)?)
Some(GenesisNetwork::try_parse(
raw_genesis,
signed_genesis_config,
)?)
} else {
None
};
Expand Down
5 changes: 4 additions & 1 deletion cli/src/samples.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ pub fn get_user_config(
peers: &UniqueVec<PeerId>,
chain_id: Option<ChainId>,
key_pair: Option<KeyPair>,
encoded_signature: String,
) -> UserConfig {
let chain_id = chain_id.unwrap_or_else(|| ChainId::from("0"));

Expand Down Expand Up @@ -91,6 +92,7 @@ pub fn get_user_config(
.set(HumanDuration(Duration::from_millis(500)));
config.genesis.public_key.set(public_key);
config.genesis.file.set("./genesis.json".into());
config.genesis.signature.set(encoded_signature);
// There is no need in persistency in tests
// If required to should be set explicitly not to overlap with other existing tests
config.snapshot.mode.set(SnapshotMode::Disabled);
Expand All @@ -109,8 +111,9 @@ pub fn get_config(
trusted_peers: &UniqueVec<PeerId>,
chain_id: Option<ChainId>,
key_pair: Option<KeyPair>,
encoded_signature: String,
) -> Config {
get_user_config(trusted_peers, chain_id, key_pair)
get_user_config(trusted_peers, chain_id, key_pair, encoded_signature)
.unwrap_partial()
.expect("config should build as all required fields were provided")
.parse(CliContext {
Expand Down
4 changes: 3 additions & 1 deletion client/benches/torii.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use iroha_client::{
use iroha_genesis::{GenesisNetwork, RawGenesisBlockBuilder};
use iroha_primitives::unique_vec;
use iroha_version::Encode;
use test_network::{get_chain_id, get_key_pair, Peer as TestPeer, PeerBuilder, TestRuntime};
use test_network::{get_chain_id, get_genesis_encoded_signature, get_key_pair, Peer as TestPeer, PeerBuilder, TestRuntime};
use tokio::runtime::Runtime;

const MINIMUM_SUCCESS_REQUEST_RATIO: f32 = 0.9;
Expand All @@ -25,6 +25,7 @@ fn query_requests(criterion: &mut Criterion) {
&unique_vec![peer.id.clone()],
Some(chain_id.clone()),
Some(get_key_pair()),
get_genesis_encoded_signature(),
);

let rt = Runtime::test();
Expand Down Expand Up @@ -130,6 +131,7 @@ fn instruction_submits(criterion: &mut Criterion) {
&unique_vec![peer.id.clone()],
Some(chain_id.clone()),
Some(get_key_pair()),
get_genesis_encoded_signature(),
);
let genesis = GenesisNetwork::new(
RawGenesisBlockBuilder::default()
Expand Down
4 changes: 2 additions & 2 deletions client/examples/million_accounts_genesis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ use iroha_data_model::isi::InstructionBox;
use iroha_genesis::{GenesisNetwork, RawGenesisBlock, RawGenesisBlockBuilder};
use iroha_primitives::unique_vec;
use test_network::{
get_chain_id, get_key_pair, wait_for_genesis_committed, Peer as TestPeer, PeerBuilder,
TestRuntime,
get_chain_id, get_genesis_encoded_signature, get_key_pair, wait_for_genesis_committed, Peer as TestPeer, PeerBuilder, TestRuntime
};
use tokio::runtime::Runtime;

Expand Down Expand Up @@ -49,6 +48,7 @@ fn main_genesis() {
&unique_vec![peer.id.clone()],
Some(chain_id.clone()),
Some(get_key_pair()),
get_genesis_encoded_signature(),
);
let rt = Runtime::test();
let (genesis, key_pair) = generate_genesis(1_000_000_u32);
Expand Down
2 changes: 1 addition & 1 deletion config/src/parameters/actual.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ pub enum Genesis {
/// Path to the genesis file
file: PathBuf,
/// Hex-encoded genesis config
encoded_config: String,
signature: String,
},
}

Expand Down
16 changes: 8 additions & 8 deletions config/src/parameters/user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,8 @@ impl Root {
emitter.emit(eyre!("\
The network consists from this one peer only (no `sumeragi.trusted_peers` provided). \
Since `--submit-genesis` is not set, there is no way to receive the genesis block. \
Either provide the genesis by setting `--submit-genesis` argument, `genesis.encoded_config`, \
`genesis.file` and `genesis.public_key` configuration parameters, or increase the number of trusted peers in \
Either provide the genesis by setting `--submit-genesis` argument, `genesis.file`, \
`genesis.public_key` and `genesis.signature` configuration parameters, or increase the number of trusted peers in \
the network using `sumeragi.trusted_peers` configuration parameter.\
"));
}
Expand Down Expand Up @@ -348,19 +348,19 @@ pub(crate) fn private_key_from_env<E: Error>(
pub struct Genesis {
pub public_key: PublicKey,
pub file: Option<PathBuf>,
pub encoded_config: Option<String>,
pub signature: Option<String>,
}

impl Genesis {
fn parse(self, cli: CliContext) -> Result<actual::Genesis, GenesisConfigError> {
match (self.file, self.encoded_config, cli.submit_genesis) {
match (self.file, self.signature, cli.submit_genesis) {
(None, None, false) => Ok(actual::Genesis::Partial {
public_key: self.public_key,
}),
(Some(file), Some(encoded_config), true) => Ok(actual::Genesis::Full {
(Some(file), Some(signature), true) => Ok(actual::Genesis::Full {
public_key: self.public_key,
file,
encoded_config,
signature,
}),
(_, _, false) => Err(GenesisConfigError::GenesisWithoutSubmit),
(_, _, true) => Err(GenesisConfigError::SubmitWithoutGenesis),
Expand All @@ -370,9 +370,9 @@ impl Genesis {

#[derive(Copy, Clone, Debug, displaydoc::Display, thiserror::Error)]
pub enum GenesisConfigError {
/// `genesis.encoded_config`, `genesis.file` and `genesis.public_key` are presented, but `--submit-genesis` was not set
/// `genesis.file`, `genesis.public_key` and `genesis.signature` are presented, but `--submit-genesis` was not set
GenesisWithoutSubmit,
/// `--submit-genesis` was set, but `genesis.encoded_config`, `genesis.file` and `genesis.public_key` are not presented
/// `--submit-genesis` was set, but `genesis.file`, `genesis.public_key` and `genesis.signature` are not presented
SubmitWithoutGenesis,
}

Expand Down
14 changes: 7 additions & 7 deletions config/src/parameters/user/boilerplate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ impl FromEnv for RootPartial {
pub struct GenesisPartial {
pub public_key: UserField<PublicKey>,
pub file: UserField<PathBuf>,
pub encoded_config: UserField<String>,
pub signature: UserField<String>,
}

impl UnwrapPartial for GenesisPartial {
Expand All @@ -204,12 +204,12 @@ impl UnwrapPartial for GenesisPartial {

let file = self.file.get();

let encoded_config = self.encoded_config.get();
let signature = self.signature.get();

Ok(Genesis {
public_key,
file,
encoded_config,
signature,
})
}
}
Expand All @@ -232,11 +232,11 @@ impl FromEnv for GenesisPartial {
let file =
ParseEnvResult::parse_simple(&mut emitter, env, "GENESIS_FILE", "genesis.file").into();

let encoded_config = ParseEnvResult::parse_simple(
let signature = ParseEnvResult::parse_simple(
&mut emitter,
env,
"ENCODED_CONFIG",
"genesis.encoded_config",
"SIGNATURE",
"genesis.signature",
)
.into();

Expand All @@ -245,7 +245,7 @@ impl FromEnv for GenesisPartial {
Ok(Self {
public_key,
file,
encoded_config,
signature,
})
}
}
Expand Down
10 changes: 5 additions & 5 deletions config/tests/fixtures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,8 @@ fn minimal_with_genesis_but_no_cli_arg_fails() -> Result<()> {
.expect_err("should fail since `--submit-genesis=false`");

let expected = expect_test::expect![[r#"
`genesis.encoded_config`, `genesis.file` and `genesis.public_key` are presented, but `--submit-genesis` was not set
The network consists from this one peer only (no `sumeragi.trusted_peers` provided). Since `--submit-genesis` is not set, there is no way to receive the genesis block. Either provide the genesis by setting `--submit-genesis` argument, `genesis.encoded_config`, `genesis.file` and `genesis.public_key` configuration parameters, or increase the number of trusted peers in the network using `sumeragi.trusted_peers` configuration parameter."#]];
`genesis.file`, `genesis.public_key` and `genesis.signature` are presented, but `--submit-genesis` was not set
The network consists from this one peer only (no `sumeragi.trusted_peers` provided). Since `--submit-genesis` is not set, there is no way to receive the genesis block. Either provide the genesis by setting `--submit-genesis` argument, `genesis.file`, `genesis.public_key` and `genesis.signature` configuration parameters, or increase the number of trusted peers in the network using `sumeragi.trusted_peers` configuration parameter."#]];
expected.assert_eq(&format!("{error:#}"));

Ok(())
Expand All @@ -227,7 +227,7 @@ fn minimal_without_genesis_but_with_submit_fails() -> Result<()> {
"should fail since there is no genesis in the config, but `--submit-genesis=true`",
);

let expected = expect_test::expect!["`--submit-genesis` was set, but `genesis.encoded_config`, `genesis.file` and `genesis.public_key` are not presented"];
let expected = expect_test::expect!["`--submit-genesis` was set, but `genesis.file`, `genesis.public_key` and `genesis.signature` are not presented"];
expected.assert_eq(&format!("{error:#}"));

Ok(())
Expand Down Expand Up @@ -287,7 +287,7 @@ fn inconsistent_genesis_config() -> Result<()> {
.expect_err("should fail with bad genesis config");

let expected = expect_test::expect![[r#"
The network consists from this one peer only (no `sumeragi.trusted_peers` provided). Since `--submit-genesis` is not set, there is no way to receive the genesis block. Either provide the genesis by setting `--submit-genesis` argument, `genesis.encoded_config`, `genesis.file` and `genesis.public_key` configuration parameters, or increase the number of trusted peers in the network using `sumeragi.trusted_peers` configuration parameter."#]];
The network consists from this one peer only (no `sumeragi.trusted_peers` provided). Since `--submit-genesis` is not set, there is no way to receive the genesis block. Either provide the genesis by setting `--submit-genesis` argument, `genesis.file`, `genesis.public_key` and `genesis.signature` configuration parameters, or increase the number of trusted peers in the network using `sumeragi.trusted_peers` configuration parameter."#]];
expected.assert_eq(&format!("{error:#}"));

Ok(())
Expand Down Expand Up @@ -333,7 +333,7 @@ fn full_envs_set_is_consumed() -> Result<()> {
),
),
file: None,
encoded_config: None,
signature: None,
},
kura: KuraPartial {
init_mode: Some(
Expand Down
2 changes: 1 addition & 1 deletion config/tests/fixtures/absolute_paths.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ out_file = "/telemetry/file.json"
[genesis]
file = "/oh/my/genesis.json"
public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB"
encoded_config = "ABCDEFG"
signature = "ABCDEFG"
2 changes: 1 addition & 1 deletion config/tests/fixtures/full.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ private_key = { algorithm = "ed25519", payload = "8f4c15e5d664da3f13778801d23d4e
[genesis]
file = "genesis.json"
public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB"
encoded_config = "ABCDEFG"
signature = "ABCDEFG"

[network]
address = "localhost:3840"
Expand Down
2 changes: 1 addition & 1 deletion config/tests/fixtures/minimal_alone_with_genesis.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ extends = "base.toml"
[genesis]
file = "./empty_ok_genesis.json"
public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB"
encoded_config = "9030303030303030302d303030302d303030302d303030302d303030303030303030303030ea9933ab8e0100000400804c390aef5d919d5506756ac51f7dd7e768da13fa60413fd5dc136851e9117213010145dd0ec90d6982851cdac085b54085a0e78689f14844742dcfc7da15b6ef78055584658cad5b9d69da200fa3997e490bfea2d7c417be9f6221d5ca89ba650008"
signature = "9030303030303030302d303030302d303030302d303030302d303030303030303030303030ea9933ab8e0100000400804c390aef5d919d5506756ac51f7dd7e768da13fa60413fd5dc136851e9117213010145dd0ec90d6982851cdac085b54085a0e78689f14844742dcfc7da15b6ef78055584658cad5b9d69da200fa3997e490bfea2d7c417be9f6221d5ca89ba650008"
15 changes: 14 additions & 1 deletion core/test_network/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use iroha_config::parameters::actual::Root as Config;
pub use iroha_core::state::StateReadOnly;
use iroha_crypto::KeyPair;
use iroha_data_model::{query::QueryOutputBox, ChainId};
use iroha_genesis::{GenesisNetwork, RawGenesisBlockFile};
use iroha_genesis::{GenesisNetwork, RawGenesisBlock, RawGenesisBlockFile};
use iroha_logger::InstrumentFutures;
use iroha_primitives::{
addr::{socket_addr, SocketAddr},
Expand Down Expand Up @@ -64,6 +64,18 @@ pub fn get_key_pair() -> KeyPair {
).unwrap()
}

/// Get hex string represented genesis_config for ./genesis.json that is tied to hardcoded keys and chain_id
pub fn get_genesis_encoded_signature() -> String {
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let genesis = RawGenesisBlock::from_path(manifest_dir.join("../../configs/swarm/genesis.json"))
.expect("Failed to deserialize genesis block from file");

let genesis_signature =
GenesisNetwork::new_genesis_signature(genesis, &get_chain_id(), &get_key_pair());

genesis_signature.to_hex_string()
}

/// Trait used to differentiate a test instance of `genesis`.
pub trait TestGenesis: Sized {
/// Construct Iroha genesis network
Expand Down Expand Up @@ -770,6 +782,7 @@ impl TestConfig for Config {
&UniqueVec::new(),
Some(get_chain_id()),
Some(get_key_pair()),
get_genesis_encoded_signature(),
)
.merge(RootPartial::from_env(&StdEnv).expect("test env variables should parse properly"));

Expand Down
Loading

0 comments on commit 1e31472

Please sign in to comment.