1
// Copyright Moonsong Labs
2
// This file is part of Moonkit.
3

            
4
// Moonkit is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8

            
9
// Moonkit is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13

            
14
// You should have received a copy of the GNU General Public License
15
// along with Moonkit.  If not, see <http://www.gnu.org/licenses/>.
16

            
17
//! Core primitives for Asynchronous Backing.
18
//!
19
//! In particular, this exposes the [`UnincludedSegmentApi`] which is used to regulate
20
//! the behavior collation within a parachain context.
21

            
22
#![cfg_attr(not(feature = "std"), no_std)]
23

            
24
pub use sp_consensus_slots::Slot;
25

            
26
sp_api::decl_runtime_apis! {
27
	/// This runtime API is used to inform potential block authors whether they will
28
	/// have the right to author at a slot, assuming they have claimed the slot.
29
	///
30
	/// In particular, this API allows parachains to regulate their "unincluded segment",
31
	/// which is the section of the head of the chain which has not yet been made available in the
32
	/// relay chain.
33
	///
34
	/// When the unincluded segment is short, parachains will allow authors to create multiple
35
	/// blocks per slot in order to build a backlog. When it is saturated, this API will limit
36
	/// the amount of blocks that can be created.
37
	pub trait UnincludedSegmentApi {
38
		/// Whether it is legal to extend the chain, assuming the given block is the most
39
		/// recently included one as-of the relay parent that will be built against, and
40
		/// the given slot.
41
		///
42
		/// This should be consistent with the logic the runtime uses when validating blocks to
43
		/// avoid issues.
44
		///
45
		/// When the unincluded segment is empty, i.e. `included_hash == at`, where at is the block
46
		/// whose state we are querying against, this must always return `true` as long as the slot
47
		/// is more recent than the included block itself.
48
		fn can_build_upon(included_hash: Block::Hash, slot: Slot) -> bool;
49
	}
50
}