Skip to content

Commit

Permalink
Fix (Un)DelegationTransactionData
Browse files Browse the repository at this point in the history
  • Loading branch information
fakedev9999 authored and junha1 committed Mar 1, 2023
1 parent 7486210 commit 66519d4
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 117 deletions.
9 changes: 8 additions & 1 deletion cli/src/cli.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use clap::{Parser, Subcommand};
use simperby_common::MemberName;
use simperby_node::simperby_common::BlockHeight;

/**
Expand All @@ -23,13 +24,15 @@ pub enum CreateCommands {
governance: bool,
block_height: BlockHeight,
proof: String,
chain_name: String,
},
/// An extra-agenda transaction that undelegates the consensus voting power and
/// the governance voting power (if delegated).
TxUndelegate {
delegator: String,
block_height: BlockHeight,
proof: String,
chain_name: String,
},
/// An extra-agenda transaction that reports a misbehaving validator.
TxReport, // TODO
Expand All @@ -42,13 +45,17 @@ pub enum CreateCommands {
#[derive(Debug, Subcommand)]
pub enum SignCommands {
TxDelegate {
delegatee: String,
delegator: MemberName,
delegatee: MemberName,
/// Whether to delegate the governance voting power too.
governance: bool,
target_height: u64,
chain_name: String,
},
TxUndelegate {
delegator: MemberName,
target_height: u64,
chain_name: String,
},
Custom {
hash: String,
Expand Down
21 changes: 16 additions & 5 deletions cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,19 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
}
Commands::Chat { .. } => todo!("chat is not implemented yet"),
Commands::Sign(SignCommands::TxDelegate {
delegator,
delegatee,
governance,
target_height,
chain_name,
}) => {
let delegation_transaction_data = DelegationTransactionData {
delegator: config.public_key,
delegatee: serde_spb::from_str(&delegatee)
.map_err(|_| eyre!("invalid delegatee for a delegation transaction"))?,
delegator,
delegatee,
governance,
block_height: target_height,
timestamp: get_timestamp(),
chain_name,
};
println!(
"{:?}",
Expand All @@ -50,11 +52,16 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
)
);
}
Commands::Sign(SignCommands::TxUndelegate { target_height }) => {
Commands::Sign(SignCommands::TxUndelegate {
delegator,
target_height,
chain_name,
}) => {
let undelegation_transaction_data = UndelegationTransactionData {
delegator: config.public_key,
delegator,
block_height: target_height,
timestamp: get_timestamp(),
chain_name,
};
println!(
"{:?}",
Expand Down Expand Up @@ -107,6 +114,7 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
governance,
block_height,
proof,
chain_name,
}) => {
simperby_node
.create_extra_agenda_transaction(ExtraAgendaTransaction::Delegate(
Expand All @@ -121,6 +129,7 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
governance,
block_height,
timestamp: get_timestamp(),
chain_name,
},
proof: serde_spb::from_str(&proof).map_err(|_| {
eyre!("invalid proof for a delegation transaction")
Expand All @@ -133,6 +142,7 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
delegator,
block_height,
proof,
chain_name,
}) => {
simperby_node
.create_extra_agenda_transaction(ExtraAgendaTransaction::Undelegate(
Expand All @@ -143,6 +153,7 @@ async fn run(args: cli::Cli, path: String, config: Config) -> eyre::Result<()> {
})?,
block_height,
timestamp: get_timestamp(),
chain_name,
},
proof: serde_spb::from_str(&proof).map_err(|_| {
eyre!("invalid proof for an undelegation transaction")
Expand Down
58 changes: 26 additions & 32 deletions common/src/reserved.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,13 @@ impl ReservedState {
if tx.proof.verify(&tx.data).is_err() {
return Err("delegation proof verification failed".to_string());
}
let delegator_name = self
.query_name(&tx.data.delegator.clone())
.ok_or_else(|| "delegator does not exist by name".to_string())?;
let delegatee_name = self
.query_name(&tx.data.delegatee.clone())
.ok_or_else(|| "delegatee does not exist by name".to_string())?;
for delegator in &mut self.members {
if delegator.name == delegator_name {
if delegator.name == tx.data.delegator {
if tx.data.governance {
delegator.governance_delegatee = Some(delegatee_name.clone());
delegator.consensus_delegatee = Some(delegatee_name);
delegator.governance_delegatee = Some(tx.data.delegatee.clone());
delegator.consensus_delegatee = Some(tx.data.delegatee.clone());
} else {
delegator.consensus_delegatee = Some(delegatee_name);
delegator.consensus_delegatee = Some(tx.data.delegatee.clone());
}
break;
}
Expand All @@ -109,11 +103,8 @@ impl ReservedState {
if tx.proof.verify(&tx.data).is_err() {
return Err("delegation proof verification failed".to_string());
}
let delegator_name = self
.query_name(&tx.data.delegator.clone())
.ok_or_else(|| "delegator does not exist by name".to_string())?;
for delegator in &mut self.members {
if delegator.name == delegator_name {
if delegator.name == tx.data.delegator {
if delegator.consensus_delegatee.is_some() {
delegator.consensus_delegatee = None;
delegator.governance_delegatee = None;
Expand Down Expand Up @@ -400,20 +391,19 @@ mod tests {
setup_test();
let (mut reserved_state, keys) = generate_standard_genesis(4);

// delegator : member-0000 && delegatee : member-0002
let delegator_public_key = keys[0].0.clone();
// delegator: member-0000, delegatee: member-0002
let delegator = reserved_state.members[0].clone();
let delegator_private_key = keys[0].1.clone();
let delegatee_public_key = keys[2].0.clone();

let delegatee = reserved_state.members[2].clone();

// when
let data: DelegationTransactionData = DelegationTransactionData {
delegator: delegator_public_key,
delegatee: delegatee_public_key,
delegator: delegator.name,
delegatee: delegatee.name.clone(),
governance: true,
block_height: 0,
timestamp: 0,
chain_name: reserved_state.genesis_info.chain_name.clone(),
};
let proof = TypedSignature::sign(&data, &delegator_private_key).unwrap();

Expand Down Expand Up @@ -462,20 +452,20 @@ mod tests {
// given
setup_test();
let (mut state, keys) = generate_standard_genesis(3);
// delegator : member-0000 && delegatee : member-0002
let delegator_public_key = keys[0].0.clone();
let delegator_private_key = keys[0].1.clone();
let delegatee_public_key = keys[2].0.clone();

// delegator: member-0000, delegatee: member-0002
let delegator = state.members[0].clone();
let delegator_private_key = keys[0].1.clone();
let delegatee = state.members[2].clone();

// when
let data: DelegationTransactionData = DelegationTransactionData {
delegator: delegator_public_key,
delegatee: delegatee_public_key,
delegator: delegator.name,
delegatee: delegatee.name.clone(),
governance: false,
block_height: 0,
timestamp: 0,
chain_name: state.genesis_info.chain_name.clone(),
};
let proof = TypedSignature::sign(&data, &delegator_private_key).unwrap();

Expand Down Expand Up @@ -522,16 +512,18 @@ mod tests {
// given
setup_test();
let (mut reserved_state, keys) = generate_delegated_genesis(4, true);
let delegator_public_key = keys[0].0.clone();
let delegator_private_key = keys[0].1.clone();

// delegator: member-0000, delegatee: member-0002
let delegator = reserved_state.members[0].clone();
let delegator_private_key = keys[0].1.clone();
let delegatee = reserved_state.members[2].clone();

// when
let data = UndelegationTransactionData {
delegator: delegator_public_key,
delegator: delegator.name,
block_height: 0,
timestamp: 0,
chain_name: reserved_state.genesis_info.chain_name.clone(),
};

let proof = TypedSignature::sign(&data, &delegator_private_key).unwrap();
Expand Down Expand Up @@ -574,16 +566,18 @@ mod tests {
// given
setup_test();
let (mut reserved_state, keys) = generate_delegated_genesis(4, false);
let delegator_public_key = keys[0].0.clone();
let delegator_private_key = keys[0].1.clone();

// delegator: member-0000, delegatee: member-0002
let delegator = reserved_state.members[0].clone();
let delegator_private_key = keys[0].1.clone();
let delegatee = reserved_state.members[2].clone();

// when
let data = UndelegationTransactionData {
delegator: delegator_public_key,
delegator: delegator.name,
block_height: 0,
timestamp: 0,
chain_name: reserved_state.genesis_info.chain_name.clone(),
};

let proof = TypedSignature::sign(&data, &delegator_private_key).unwrap();
Expand Down
8 changes: 5 additions & 3 deletions common/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,19 +132,21 @@ pub struct TxReport {

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
pub struct DelegationTransactionData {
pub delegator: PublicKey,
pub delegatee: PublicKey,
pub delegator: MemberName,
pub delegatee: MemberName,
/// Whether to delegate the governance voting power too.
pub governance: bool,
pub block_height: BlockHeight,
pub timestamp: Timestamp,
pub chain_name: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
pub struct UndelegationTransactionData {
pub delegator: PublicKey,
pub delegator: MemberName,
pub block_height: BlockHeight,
pub timestamp: Timestamp,
pub chain_name: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
Expand Down
6 changes: 1 addition & 5 deletions node/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,7 @@ impl SimperbyNode {
.get_raw()
.read_semantic_commit(commit_hash)
.await?;
let reserved_state = self.repository.get_reserved_state().await?;
let commit = simperby_repository::format::from_semantic_commit(
semantic_commit.clone(),
reserved_state,
)?;
let commit = simperby_repository::format::from_semantic_commit(semantic_commit.clone())?;
let result = match commit {
Commit::Block(block_header) => CommitInfo::Block {
semantic_commit,
Expand Down
Loading

0 comments on commit 66519d4

Please sign in to comment.