From fe5c303893290fc5891688ed9dac23410a65042e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com>
Date: Thu, 5 Aug 2021 16:26:02 +0200
Subject: [PATCH] Return `relay_parent` as result of collation seconded signal
 as well (#3577)

* Return `relay_parent` as result of collation seconded signal as well

Before we only returned the seconded statement. However, to verify the
statement in a future proof way, we also need the relay parent that was
used as a context to sign the statement.

* FMT
---
 .../collator-protocol/src/collator_side/mod.rs    |  8 ++++----
 polkadot/node/primitives/src/lib.rs               | 15 +++++++++++++--
 polkadot/node/subsystem-types/src/messages.rs     |  6 +++---
 .../test-parachains/adder/collator/src/lib.rs     |  8 ++++----
 .../src/types/overseer-protocol.md                |  2 +-
 5 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
index 5713ad647c6..5f0425d8cd6 100644
--- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
+++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
@@ -32,7 +32,7 @@ use polkadot_node_network_protocol::{
 	},
 	v1 as protocol_v1, OurView, PeerId, UnifiedReputationChange as Rep, View,
 };
-use polkadot_node_primitives::{PoV, SignedFullStatement, Statement};
+use polkadot_node_primitives::{CollationSecondedSignal, PoV, Statement};
 use polkadot_node_subsystem_util::{
 	metrics::{self, prometheus},
 	runtime::{get_availability_cores, get_group_rotation_info, RuntimeInfo},
@@ -266,7 +266,7 @@ struct State {
 	collations: HashMap<Hash, Collation>,
 
 	/// The result senders per collation.
-	collation_result_senders: HashMap<CandidateHash, oneshot::Sender<SignedFullStatement>>,
+	collation_result_senders: HashMap<CandidateHash, oneshot::Sender<CollationSecondedSignal>>,
 
 	/// Our validator groups per active leaf.
 	our_validators_groups: HashMap<Hash, ValidatorGroup>,
@@ -336,7 +336,7 @@ async fn distribute_collation<Context>(
 	id: ParaId,
 	receipt: CandidateReceipt,
 	pov: PoV,
-	result_sender: Option<oneshot::Sender<SignedFullStatement>>,
+	result_sender: Option<oneshot::Sender<CollationSecondedSignal>>,
 ) -> Result<()>
 where
 	Context: SubsystemContext<Message = CollatorProtocolMessage>,
@@ -866,7 +866,7 @@ where
 						?origin,
 						"received a `CollationSeconded`",
 					);
-					let _ = sender.send(statement);
+					let _ = sender.send(CollationSecondedSignal { statement, relay_parent });
 				}
 			}
 		},
diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs
index 1ec3291f803..19ee14f05ac 100644
--- a/polkadot/node/primitives/src/lib.rs
+++ b/polkadot/node/primitives/src/lib.rs
@@ -215,6 +215,17 @@ pub struct Collation<BlockNumber = polkadot_primitives::v1::BlockNumber> {
 	pub hrmp_watermark: BlockNumber,
 }
 
+/// Signal that is being returned back when a collation was seconded by a validator.
+#[derive(Debug)]
+pub struct CollationSecondedSignal {
+	/// The hash of the relay chain block that was used as context to sign [`Self::statement`].
+	pub relay_parent: Hash,
+	/// The statement about seconding the collation.
+	///
+	/// Anything else than [`Statement::Seconded`](Statement::Seconded) is forbidden here.
+	pub statement: SignedFullStatement,
+}
+
 /// Result of the [`CollatorFn`] invocation.
 pub struct CollationResult {
 	/// The collation that was build.
@@ -224,14 +235,14 @@ pub struct CollationResult {
 	/// There is no guarantee that this sender is informed ever about any result, it is completely okay to just drop it.
 	/// However, if it is called, it should be called with the signed statement of a parachain validator seconding the
 	/// collation.
-	pub result_sender: Option<futures::channel::oneshot::Sender<SignedFullStatement>>,
+	pub result_sender: Option<futures::channel::oneshot::Sender<CollationSecondedSignal>>,
 }
 
 impl CollationResult {
 	/// Convert into the inner values.
 	pub fn into_inner(
 		self,
-	) -> (Collation, Option<futures::channel::oneshot::Sender<SignedFullStatement>>) {
+	) -> (Collation, Option<futures::channel::oneshot::Sender<CollationSecondedSignal>>) {
 		(self.collation, self.result_sender)
 	}
 }
diff --git a/polkadot/node/subsystem-types/src/messages.rs b/polkadot/node/subsystem-types/src/messages.rs
index b6cf9d0a0dd..7ffc84b3a99 100644
--- a/polkadot/node/subsystem-types/src/messages.rs
+++ b/polkadot/node/subsystem-types/src/messages.rs
@@ -35,8 +35,8 @@ use polkadot_node_network_protocol::{
 use polkadot_node_primitives::{
 	approval::{BlockApprovalMeta, IndirectAssignmentCert, IndirectSignedApprovalVote},
 	AvailableData, BabeEpoch, BlockWeight, CandidateVotes, CollationGenerationConfig,
-	DisputeMessage, ErasureChunk, PoV, SignedDisputeStatement, SignedFullStatement,
-	ValidationResult,
+	CollationSecondedSignal, DisputeMessage, ErasureChunk, PoV, SignedDisputeStatement,
+	SignedFullStatement, ValidationResult,
 };
 use polkadot_primitives::v1::{
 	AuthorityDiscoveryId, BackedCandidate, BlockNumber, CandidateDescriptor, CandidateEvent,
@@ -158,7 +158,7 @@ pub enum CollatorProtocolMessage {
 	///
 	/// The result sender should be informed when at least one parachain validator seconded the collation. It is also
 	/// completely okay to just drop the sender.
-	DistributeCollation(CandidateReceipt, PoV, Option<oneshot::Sender<SignedFullStatement>>),
+	DistributeCollation(CandidateReceipt, PoV, Option<oneshot::Sender<CollationSecondedSignal>>),
 	/// Report a collator as having provided an invalid collation. This should lead to disconnect
 	/// and blacklist of the collator.
 	ReportCollator(CollatorId),
diff --git a/polkadot/parachain/test-parachains/adder/collator/src/lib.rs b/polkadot/parachain/test-parachains/adder/collator/src/lib.rs
index a7da25c30ab..95e54a53448 100644
--- a/polkadot/parachain/test-parachains/adder/collator/src/lib.rs
+++ b/polkadot/parachain/test-parachains/adder/collator/src/lib.rs
@@ -20,7 +20,7 @@ use futures::channel::oneshot;
 use futures_timer::Delay;
 use parity_scale_codec::{Decode, Encode};
 use polkadot_node_primitives::{
-	Collation, CollationResult, CollatorFn, PoV, SignedFullStatement, Statement,
+	Collation, CollationResult, CollationSecondedSignal, CollatorFn, PoV, Statement,
 };
 use polkadot_primitives::v1::{CollatorId, CollatorPair};
 use sp_core::{traits::SpawnNamed, Pair};
@@ -182,19 +182,19 @@ impl Collator {
 
 			let compressed_pov = polkadot_node_primitives::maybe_compress_pov(pov);
 
-			let (result_sender, recv) = oneshot::channel::<SignedFullStatement>();
+			let (result_sender, recv) = oneshot::channel::<CollationSecondedSignal>();
 			let seconded_collations = seconded_collations.clone();
 			spawner.spawn(
 				"adder-collator-seconded",
 				async move {
 					if let Ok(res) = recv.await {
 						if !matches!(
-							res.payload(),
+							res.statement.payload(),
 							Statement::Seconded(s) if s.descriptor.pov_hash == compressed_pov.hash(),
 						) {
 							log::error!(
 								"Seconded statement should match our collation: {:?}",
-								res.payload()
+								res.statement.payload()
 							);
 							std::process::exit(-1);
 						}
diff --git a/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md b/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md
index b4f9b9a47a3..b1b139f859a 100644
--- a/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md
+++ b/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md
@@ -387,7 +387,7 @@ enum CollatorProtocolMessage {
     ///
     /// The result sender should be informed when at least one parachain validator seconded the collation. It is also
     /// completely okay to just drop the sender.
-    DistributeCollation(CandidateReceipt, PoV, Option<oneshot::Sender<SignedFullStatement>>),
+    DistributeCollation(CandidateReceipt, PoV, Option<oneshot::Sender<CollationSecondedSignal>>),
     /// Fetch a collation under the given relay-parent for the given ParaId.
     FetchCollation(Hash, ParaId, ResponseChannel<(CandidateReceipt, PoV)>),
     /// Report a collator as having provided an invalid collation. This should lead to disconnect
-- 
GitLab