Bring support for calling check_inherents (#490)

* Start

* More work

* Add proc-macro for `validate_block`

* Make everything compile

* Add some test
This commit is contained in:
Bastian Köcher
2021-06-12 19:21:46 +01:00
committed by GitHub
parent 2f88be0874
commit d54fdd788e
20 changed files with 684 additions and 326 deletions
+10 -1
View File
@@ -14,7 +14,9 @@
// You should have received a copy of the GNU General Public License
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
use cumulus_primitives_core::{relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId};
use cumulus_primitives_core::{
relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId,
};
use sp_runtime::traits::HashFor;
use sp_state_machine::MemoryDB;
use sp_std::collections::btree_map::BTreeMap;
@@ -38,6 +40,7 @@ pub struct RelayStateSproofBuilder {
pub hrmp_ingress_channel_index: Option<Vec<ParaId>>,
pub hrmp_egress_channel_index: Option<Vec<ParaId>>,
pub hrmp_channels: BTreeMap<relay_chain::v1::HrmpChannelId, AbridgedHrmpChannel>,
pub current_slot: relay_chain::v1::Slot,
}
impl Default for RelayStateSproofBuilder {
@@ -60,6 +63,7 @@ impl Default for RelayStateSproofBuilder {
hrmp_ingress_channel_index: None,
hrmp_egress_channel_index: None,
hrmp_channels: BTreeMap::new(),
current_slot: 0.into(),
}
}
}
@@ -151,6 +155,11 @@ impl RelayStateSproofBuilder {
metadata.encode(),
);
}
insert(
relay_chain::well_known_keys::CURRENT_SLOT.to_vec(),
self.current_slot.encode(),
);
}
let root = backend.root().clone();
+26 -1
View File
@@ -427,4 +427,29 @@ impl_runtime_apis! {
}
}
cumulus_pallet_parachain_system::register_validate_block!(Runtime, Executive);
struct CheckInherents;
impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {
fn check_inherents(
_: &[UncheckedExtrinsic],
relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,
) -> sp_inherents::CheckInherentsResult {
if relay_state_proof.read_slot().expect("Reads slot") == 1337u64 {
let mut res = sp_inherents::CheckInherentsResult::new();
res.put_error(
[1u8; 8],
&sp_inherents::MakeFatalError::from("You are wrong"),
)
.expect("Puts error");
res
} else {
sp_inherents::CheckInherentsResult::new()
}
}
}
cumulus_pallet_parachain_system::register_validate_block! {
Runtime = Runtime,
BlockExecutor = Executive,
CheckInherents = CheckInherents,
}