mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-24 12:25:51 +00:00
add sender to table's signed statement
This commit is contained in:
@@ -64,13 +64,6 @@ pub trait Context {
|
|||||||
group: &Self::GroupId,
|
group: &Self::GroupId,
|
||||||
) -> bool;
|
) -> bool;
|
||||||
|
|
||||||
// recover signer of statement and ensure the signature corresponds to the
|
|
||||||
// statement.
|
|
||||||
fn statement_signer(
|
|
||||||
&self,
|
|
||||||
statement: &SignedStatement<Self>,
|
|
||||||
) -> Option<Self::ValidatorId>;
|
|
||||||
|
|
||||||
// requisite number of votes for validity and availability respectively from a group.
|
// requisite number of votes for validity and availability respectively from a group.
|
||||||
fn requisite_votes(&self, group: &Self::GroupId) -> (usize, usize);
|
fn requisite_votes(&self, group: &Self::GroupId) -> (usize, usize);
|
||||||
}
|
}
|
||||||
@@ -101,6 +94,8 @@ pub struct SignedStatement<C: Context + ?Sized> {
|
|||||||
pub statement: Statement<C>,
|
pub statement: Statement<C>,
|
||||||
/// The signature.
|
/// The signature.
|
||||||
pub signature: C::Signature,
|
pub signature: C::Signature,
|
||||||
|
/// The sender.
|
||||||
|
pub sender: C::ValidatorId,
|
||||||
}
|
}
|
||||||
|
|
||||||
// A unique trace for a class of valid statements issued by a validator.
|
// A unique trace for a class of valid statements issued by a validator.
|
||||||
@@ -303,49 +298,47 @@ impl<C: Context> Table<C> {
|
|||||||
::std::mem::replace(&mut self.detected_misbehavior, HashMap::new())
|
::std::mem::replace(&mut self.detected_misbehavior, HashMap::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Import a signed statement.
|
/// Import a signed statement. Signatures should be checked for validity, and the
|
||||||
|
/// sender should be checked to actually be a validator.
|
||||||
///
|
///
|
||||||
/// This can note the origin of the statement to indicate that he has
|
/// This can note the origin of the statement to indicate that he has
|
||||||
/// seen it already.
|
/// seen it already.
|
||||||
pub fn import_statement(&mut self, context: &C, statement: SignedStatement<C>, from: Option<C::ValidatorId>)
|
pub fn import_statement(&mut self, context: &C, statement: SignedStatement<C>, from: Option<C::ValidatorId>)
|
||||||
-> Option<Summary<C::Digest, C::GroupId>>
|
-> Option<Summary<C::Digest, C::GroupId>>
|
||||||
{
|
{
|
||||||
let signer = match context.statement_signer(&statement) {
|
let SignedStatement { statement, signature, sender: signer } = statement;
|
||||||
None => return None,
|
|
||||||
Some(signer) => signer,
|
|
||||||
};
|
|
||||||
|
|
||||||
let trace = match statement.statement {
|
let trace = match statement {
|
||||||
Statement::Candidate(_) => StatementTrace::Candidate(signer.clone()),
|
Statement::Candidate(_) => StatementTrace::Candidate(signer.clone()),
|
||||||
Statement::Valid(ref d) => StatementTrace::Valid(signer.clone(), d.clone()),
|
Statement::Valid(ref d) => StatementTrace::Valid(signer.clone(), d.clone()),
|
||||||
Statement::Invalid(ref d) => StatementTrace::Invalid(signer.clone(), d.clone()),
|
Statement::Invalid(ref d) => StatementTrace::Invalid(signer.clone(), d.clone()),
|
||||||
Statement::Available(ref d) => StatementTrace::Available(signer.clone(), d.clone()),
|
Statement::Available(ref d) => StatementTrace::Available(signer.clone(), d.clone()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let (maybe_misbehavior, maybe_summary) = match statement.statement {
|
let (maybe_misbehavior, maybe_summary) = match statement {
|
||||||
Statement::Candidate(candidate) => self.import_candidate(
|
Statement::Candidate(candidate) => self.import_candidate(
|
||||||
context,
|
context,
|
||||||
signer.clone(),
|
signer.clone(),
|
||||||
candidate,
|
candidate,
|
||||||
statement.signature
|
signature
|
||||||
),
|
),
|
||||||
Statement::Valid(digest) => self.validity_vote(
|
Statement::Valid(digest) => self.validity_vote(
|
||||||
context,
|
context,
|
||||||
signer.clone(),
|
signer.clone(),
|
||||||
digest,
|
digest,
|
||||||
ValidityVote::Valid(statement.signature),
|
ValidityVote::Valid(signature),
|
||||||
),
|
),
|
||||||
Statement::Invalid(digest) => self.validity_vote(
|
Statement::Invalid(digest) => self.validity_vote(
|
||||||
context,
|
context,
|
||||||
signer.clone(),
|
signer.clone(),
|
||||||
digest,
|
digest,
|
||||||
ValidityVote::Invalid(statement.signature),
|
ValidityVote::Invalid(signature),
|
||||||
),
|
),
|
||||||
Statement::Available(digest) => self.availability_vote(
|
Statement::Available(digest) => self.availability_vote(
|
||||||
context,
|
context,
|
||||||
signer.clone(),
|
signer.clone(),
|
||||||
digest,
|
digest,
|
||||||
statement.signature,
|
signature,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -385,6 +378,7 @@ impl<C: Context> Table<C> {
|
|||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
signature,
|
signature,
|
||||||
statement: Statement::Candidate(candidate),
|
statement: Statement::Candidate(candidate),
|
||||||
|
sender: from,
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
None,
|
None,
|
||||||
@@ -469,6 +463,7 @@ impl<C: Context> Table<C> {
|
|||||||
Some(Misbehavior::UnauthorizedStatement(UnauthorizedStatement {
|
Some(Misbehavior::UnauthorizedStatement(UnauthorizedStatement {
|
||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
signature: sig,
|
signature: sig,
|
||||||
|
sender: from,
|
||||||
statement: if valid {
|
statement: if valid {
|
||||||
Statement::Valid(digest)
|
Statement::Valid(digest)
|
||||||
} else {
|
} else {
|
||||||
@@ -540,6 +535,7 @@ impl<C: Context> Table<C> {
|
|||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
signature: signature.clone(),
|
signature: signature.clone(),
|
||||||
statement: Statement::Available(digest),
|
statement: Statement::Available(digest),
|
||||||
|
sender: from,
|
||||||
}
|
}
|
||||||
})),
|
})),
|
||||||
None
|
None
|
||||||
@@ -609,13 +605,6 @@ mod tests {
|
|||||||
self.validators.get(validator).map(|v| &v.1 == group).unwrap_or(false)
|
self.validators.get(validator).map(|v| &v.1 == group).unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn statement_signer(
|
|
||||||
&self,
|
|
||||||
statement: &SignedStatement<Self>,
|
|
||||||
) -> Option<ValidatorId> {
|
|
||||||
Some(ValidatorId(statement.signature.0))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn requisite_votes(&self, _id: &GroupId) -> (usize, usize) {
|
fn requisite_votes(&self, _id: &GroupId) -> (usize, usize) {
|
||||||
(6, 34)
|
(6, 34)
|
||||||
}
|
}
|
||||||
@@ -635,11 +624,13 @@ mod tests {
|
|||||||
let statement_a = SignedStatement {
|
let statement_a = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
let statement_b = SignedStatement {
|
let statement_b = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 999)),
|
statement: Statement::Candidate(Candidate(2, 999)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
table.import_statement(&context, statement_a, None);
|
table.import_statement(&context, statement_a, None);
|
||||||
@@ -669,6 +660,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
table.import_statement(&context, statement, None);
|
table.import_statement(&context, statement, None);
|
||||||
@@ -679,6 +671,7 @@ mod tests {
|
|||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -700,12 +693,14 @@ mod tests {
|
|||||||
let candidate_a = SignedStatement {
|
let candidate_a = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
let candidate_a_digest = Digest(100);
|
let candidate_a_digest = Digest(100);
|
||||||
|
|
||||||
let candidate_b = SignedStatement {
|
let candidate_b = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(3, 987)),
|
statement: Statement::Candidate(Candidate(3, 987)),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
let candidate_b_digest = Digest(987);
|
let candidate_b_digest = Digest(987);
|
||||||
|
|
||||||
@@ -718,6 +713,7 @@ mod tests {
|
|||||||
let bad_availability_vote = SignedStatement {
|
let bad_availability_vote = SignedStatement {
|
||||||
statement: Statement::Available(candidate_b_digest.clone()),
|
statement: Statement::Available(candidate_b_digest.clone()),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
table.import_statement(&context, bad_availability_vote, None);
|
table.import_statement(&context, bad_availability_vote, None);
|
||||||
|
|
||||||
@@ -727,6 +723,7 @@ mod tests {
|
|||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
statement: Statement::Available(candidate_b_digest),
|
statement: Statement::Available(candidate_b_digest),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -735,6 +732,7 @@ mod tests {
|
|||||||
let bad_validity_vote = SignedStatement {
|
let bad_validity_vote = SignedStatement {
|
||||||
statement: Statement::Valid(candidate_a_digest.clone()),
|
statement: Statement::Valid(candidate_a_digest.clone()),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
table.import_statement(&context, bad_validity_vote, None);
|
table.import_statement(&context, bad_validity_vote, None);
|
||||||
|
|
||||||
@@ -744,6 +742,7 @@ mod tests {
|
|||||||
statement: SignedStatement {
|
statement: SignedStatement {
|
||||||
statement: Statement::Valid(candidate_a_digest),
|
statement: Statement::Valid(candidate_a_digest),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -764,6 +763,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
let candidate_digest = Digest(100);
|
let candidate_digest = Digest(100);
|
||||||
|
|
||||||
@@ -773,11 +773,13 @@ mod tests {
|
|||||||
let valid_statement = SignedStatement {
|
let valid_statement = SignedStatement {
|
||||||
statement: Statement::Valid(candidate_digest.clone()),
|
statement: Statement::Valid(candidate_digest.clone()),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
let invalid_statement = SignedStatement {
|
let invalid_statement = SignedStatement {
|
||||||
statement: Statement::Invalid(candidate_digest.clone()),
|
statement: Statement::Invalid(candidate_digest.clone()),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
table.import_statement(&context, valid_statement, None);
|
table.import_statement(&context, valid_statement, None);
|
||||||
@@ -809,6 +811,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
let candidate_digest = Digest(100);
|
let candidate_digest = Digest(100);
|
||||||
|
|
||||||
@@ -818,6 +821,7 @@ mod tests {
|
|||||||
let extra_vote = SignedStatement {
|
let extra_vote = SignedStatement {
|
||||||
statement: Statement::Valid(candidate_digest.clone()),
|
statement: Statement::Valid(candidate_digest.clone()),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
table.import_statement(&context, extra_vote, None);
|
table.import_statement(&context, extra_vote, None);
|
||||||
@@ -876,6 +880,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
|
|
||||||
let summary = table.import_statement(&context, statement, None)
|
let summary = table.import_statement(&context, statement, None)
|
||||||
@@ -902,6 +907,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
let candidate_digest = Digest(100);
|
let candidate_digest = Digest(100);
|
||||||
|
|
||||||
@@ -911,6 +917,7 @@ mod tests {
|
|||||||
let vote = SignedStatement {
|
let vote = SignedStatement {
|
||||||
statement: Statement::Valid(candidate_digest.clone()),
|
statement: Statement::Valid(candidate_digest.clone()),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
let summary = table.import_statement(&context, vote, None)
|
let summary = table.import_statement(&context, vote, None)
|
||||||
@@ -939,6 +946,7 @@ mod tests {
|
|||||||
let statement = SignedStatement {
|
let statement = SignedStatement {
|
||||||
statement: Statement::Candidate(Candidate(2, 100)),
|
statement: Statement::Candidate(Candidate(2, 100)),
|
||||||
signature: Signature(1),
|
signature: Signature(1),
|
||||||
|
sender: ValidatorId(1),
|
||||||
};
|
};
|
||||||
let candidate_digest = Digest(100);
|
let candidate_digest = Digest(100);
|
||||||
|
|
||||||
@@ -948,6 +956,7 @@ mod tests {
|
|||||||
let vote = SignedStatement {
|
let vote = SignedStatement {
|
||||||
statement: Statement::Available(candidate_digest.clone()),
|
statement: Statement::Available(candidate_digest.clone()),
|
||||||
signature: Signature(2),
|
signature: Signature(2),
|
||||||
|
sender: ValidatorId(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
let summary = table.import_statement(&context, vote, None)
|
let summary = table.import_statement(&context, vote, None)
|
||||||
|
|||||||
Reference in New Issue
Block a user