From 6bde1a2335d0f82e507dc002c1066b24e6b18571 Mon Sep 17 00:00:00 2001 From: Shanin Roman Date: Mon, 8 Jul 2024 14:11:58 +0300 Subject: [PATCH] feat!: speicfy on-chain parameters explicitly in genesis Signed-off-by: Shanin Roman --- configs/swarm/executor.wasm | Bin 501671 -> 501773 bytes configs/swarm/genesis.json | 62 ++++++++++----------------- data_model/src/block.rs | 34 ++++++++++----- data_model/src/parameter.rs | 2 +- docs/source/references/schema.json | 7 +++ genesis/src/lib.rs | 49 ++++++++++++++++++--- tools/kagami/src/genesis/generate.rs | 10 ++--- 7 files changed, 103 insertions(+), 61 deletions(-) diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index 0fefcfab3a16f99bf13394c0edce678eef5e1c23..670ba5dcbd4a0c42bd1a3a63aec365ddfde22912 100644 GIT binary patch delta 53045 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 P3PWs+yHgu`YWx2O-nO#= delta 52397 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 diff --git a/configs/swarm/genesis.json b/configs/swarm/genesis.json index 121cc6ae593..aa4bc28b532 100644 --- a/configs/swarm/genesis.json +++ b/configs/swarm/genesis.json @@ -137,70 +137,54 @@ ] } } - }, + } + ], + "topology": [], + "parameters": [ { - "SetParameter": { - "Sumeragi": { - "BlockTimeMs": 2000 - } + "Sumeragi": { + "BlockTimeMs": 2000 } }, { - "SetParameter": { - "Sumeragi": { - "CommitTimeMs": 4000 - } + "Sumeragi": { + "CommitTimeMs": 4000 } }, { - "SetParameter": { - "Block": { - "MaxTransactions": 512 - } + "Block": { + "MaxTransactions": 512 } }, { - "SetParameter": { - "Transaction": { - "MaxInstructions": 4096 - } + "Transaction": { + "MaxInstructions": 4096 } }, { - "SetParameter": { - "Transaction": { - "SmartContractSize": 4194304 - } + "Transaction": { + "SmartContractSize": 4194304 } }, { - "SetParameter": { - "SmartContract": { - "Fuel": 55000000 - } + "Executor": { + "Fuel": 55000000 } }, { - "SetParameter": { - "SmartContract": { - "Memory": 55000000 - } + "Executor": { + "Memory": 55000000 } }, { - "SetParameter": { - "SmartContract": { - "Fuel": 55000000 - } + "SmartContract": { + "Fuel": 55000000 } }, { - "SetParameter": { - "SmartContract": { - "Memory": 55000000 - } + "SmartContract": { + "Memory": 55000000 } } - ], - "topology": [] + ] } diff --git a/data_model/src/block.rs b/data_model/src/block.rs index f355b462a4b..1b4b8f42954 100644 --- a/data_model/src/block.rs +++ b/data_model/src/block.rs @@ -369,23 +369,37 @@ mod candidate { }; } - let Some(transaction_executor) = transactions.first() else { + let Some(transaction) = transactions.first() else { return Err("Genesis block must contain at least one transaction"); }; - let Executable::Instructions(instructions_executor) = - transaction_executor.value.instructions() - else { + let Executable::Instructions(instructions) = transaction.value.instructions() else { return Err("Genesis transaction must contain instructions"); }; - let [InstructionBox::Upgrade(_)] = instructions_executor.as_slice() else { - return Err( - "First transaction must contain single `Upgrade` instruction to set executor", - ); + + if instructions + .as_slice() + .iter() + .all(|isi| matches!(isi, InstructionBox::SetParameter(_))) + { + let Some(transaction) = transactions.get(1) else { + return Err("Genesis block must contain at least two transactions if first transaction is set parameters"); + }; + let Executable::Instructions(instructions) = transaction.value.instructions() + else { + return Err("Genesis transaction must contain instructions"); + }; + if !matches!(instructions.as_slice(), [InstructionBox::Upgrade(_)]) { + return Err("Second transaction must be executor upgrade if first one is set parameters"); + } + } else if matches!(instructions.as_slice(), [InstructionBox::Upgrade(_)]) { + // Nothing to do, case when there is no set parameter instructions + } else { + return Err("First transaction nor executor upgrade nor set parameters"); }; - if transactions.len() > 2 { + if transactions.len() > 3 { return Err( - "Genesis block must have one or two transactions (first with executor upgrade)", + "Genesis block must have 1 to 3 transactions (parameters, executor upgrade, other isi)", ); } diff --git a/data_model/src/parameter.rs b/data_model/src/parameter.rs index 4841549d353..afff07b46d7 100644 --- a/data_model/src/parameter.rs +++ b/data_model/src/parameter.rs @@ -377,7 +377,7 @@ impl Parameters { .map(Parameter::Sumeragi) .chain(self.block.parameters().map(Parameter::Block)) .chain(self.transaction.parameters().map(Parameter::Transaction)) - .chain(self.executor.parameters().map(Parameter::SmartContract)) + .chain(self.executor.parameters().map(Parameter::Executor)) .chain( self.smart_contract .parameters() diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index b8ef73c6e7e..9570826c13c 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -3182,6 +3182,10 @@ { "name": "topology", "type": "Vec" + }, + { + "name": "parameters", + "type": "Vec" } ] }, @@ -4558,6 +4562,9 @@ "Vec": { "Vec": "InstructionBox" }, + "Vec": { + "Vec": "Parameter" + }, "Vec": { "Vec": "PeerId" }, diff --git a/genesis/src/lib.rs b/genesis/src/lib.rs index fcecd5b0772..632f2939ee3 100644 --- a/genesis/src/lib.rs +++ b/genesis/src/lib.rs @@ -10,7 +10,7 @@ use std::{ use eyre::{eyre, Result, WrapErr}; use iroha_crypto::{KeyPair, PublicKey}; -use iroha_data_model::{block::SignedBlock, isi::Instruction, prelude::*}; +use iroha_data_model::{block::SignedBlock, isi::Instruction, parameter::Parameter, prelude::*}; use iroha_schema::IntoSchema; use once_cell::sync::Lazy; use parity_scale_codec::{Decode, Encode}; @@ -40,6 +40,9 @@ pub struct RawGenesisTransaction { instructions: Vec, /// Initial topology topology: Vec, + /// Parameters + #[serde(default)] + parameters: Vec, } /// Path to [`Executor`] file @@ -105,6 +108,7 @@ impl RawGenesisTransaction { self.chain, genesis_key_pair, self.topology, + self.parameters, ); Ok(genesis) } @@ -116,8 +120,15 @@ fn build_and_sign_genesis( chain_id: ChainId, genesis_key_pair: &KeyPair, topology: Vec, + parameters: Vec, ) -> GenesisBlock { - let transactions = build_transactions(instructions, executor, chain_id, genesis_key_pair); + let transactions = build_transactions( + instructions, + executor, + parameters, + chain_id, + genesis_key_pair, + ); let block = SignedBlock::genesis(transactions, genesis_key_pair.private_key(), topology); GenesisBlock(block) } @@ -125,18 +136,32 @@ fn build_and_sign_genesis( fn build_transactions( instructions: Vec, executor: Executor, + parameters: Vec, chain_id: ChainId, genesis_key_pair: &KeyPair, ) -> Vec { let upgrade_isi = Upgrade::new(executor).into(); let transaction_executor = build_transaction(vec![upgrade_isi], chain_id.clone(), genesis_key_pair); - if instructions.is_empty() { - vec![transaction_executor] - } else { + let mut transactions = Vec::new(); + if !parameters.is_empty() { + let parameters = build_transaction( + parameters + .into_iter() + .map(SetParameter) + .map(InstructionBox::from) + .collect(), + chain_id.clone(), + genesis_key_pair, + ); + transactions.push(parameters); + } + transactions.push(transaction_executor); + if !instructions.is_empty() { let transaction_instructions = build_transaction(instructions, chain_id, genesis_key_pair); - vec![transaction_executor, transaction_instructions] + transactions.push(transaction_instructions); } + transactions } fn build_transaction( @@ -166,6 +191,7 @@ fn get_executor(file: &Path) -> Result { #[derive(Default)] pub struct GenesisBuilder { instructions: Vec, + parameters: Vec, } /// `Domain` subsection of the [`GenesisBuilder`]. Makes @@ -174,6 +200,7 @@ pub struct GenesisBuilder { #[must_use] pub struct GenesisDomainBuilder { instructions: Vec, + parameters: Vec, domain_id: DomainId, } @@ -196,6 +223,7 @@ impl GenesisBuilder { self.instructions.push(Register::domain(new_domain).into()); GenesisDomainBuilder { instructions: self.instructions, + parameters: self.parameters, domain_id, } } @@ -206,6 +234,12 @@ impl GenesisBuilder { self } + /// Add parameter to the end of parameter list + pub fn append_parameter(mut self, parameter: Parameter) -> Self { + self.parameters.push(parameter); + self + } + /// Finish building, sign, and produce a [`GenesisBlock`]. pub fn build_and_sign( self, @@ -220,6 +254,7 @@ impl GenesisBuilder { chain_id, genesis_key_pair, topology, + self.parameters, ) } @@ -233,6 +268,7 @@ impl GenesisBuilder { RawGenesisTransaction { instructions: self.instructions, executor: ExecutorPath(executor_file), + parameters: self.parameters, chain: chain_id, topology, } @@ -245,6 +281,7 @@ impl GenesisDomainBuilder { pub fn finish_domain(self) -> GenesisBuilder { GenesisBuilder { instructions: self.instructions, + parameters: self.parameters, } } diff --git a/tools/kagami/src/genesis/generate.rs b/tools/kagami/src/genesis/generate.rs index e8e0d409479..6615f69180b 100644 --- a/tools/kagami/src/genesis/generate.rs +++ b/tools/kagami/src/genesis/generate.rs @@ -139,10 +139,11 @@ pub fn generate_default( .into(); let parameters = Parameters::default(); - let set_parameters = parameters - .parameters() - .map(SetParameter) - .map(InstructionBox::from); + let parameters = parameters.parameters(); + + for parameter in parameters { + builder = builder.append_parameter(parameter); + } for isi in [ mint.into(), @@ -153,7 +154,6 @@ pub fn generate_default( ] .into_iter() .chain(std::iter::once(register_user_metadata_access)) - .chain(set_parameters) { builder = builder.append_instruction(isi); }