Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
parity
Mirrored projects
polkadot
Commits
6f8fde1b
Commit
6f8fde1b
authored
Jun 30, 2020
by
Shawn Tabrizi
Browse files
Merge branch 'master' into shawntabrizi-crowdsale
parent
ed5cd01e
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Cargo.lock
View file @
6f8fde1b
This diff is collapsed.
Click to expand it.
Cargo.toml
View file @
6f8fde1b
...
...
@@ -42,10 +42,12 @@ members = [
"service"
,
"validation"
,
"node/
messa
ge
s
"
,
"node/
network/brid
ge"
,
"node/overseer"
,
"node/primitives"
,
"node/service"
,
"node/subsystem"
,
"node/test-helpers/subsystem"
,
"parachain/test-parachains"
,
"parachain/test-parachains/adder"
,
...
...
network/test/src/block_import.rs
View file @
6f8fde1b
...
...
@@ -60,7 +60,7 @@ fn import_single_good_block_works() {
let
mut
expected_aux
=
ImportedAux
::
default
();
expected_aux
.is_new_best
=
true
;
match
import_single_block
(
&
mut
polkadot_test_runtime_client
::
new
(),
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
(
true
))
{
match
import_single_block
(
&
mut
polkadot_test_runtime_client
::
new
(),
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
::
new
(
true
))
{
Ok
(
BlockImportResult
::
ImportedUnknown
(
ref
num
,
ref
aux
,
ref
org
))
if
*
num
==
number
as
u32
&&
*
aux
==
expected_aux
&&
*
org
==
Some
(
peer_id
)
=>
{}
r
@
_
=>
panic!
(
"{:?}"
,
r
)
...
...
@@ -70,7 +70,7 @@ fn import_single_good_block_works() {
#[test]
fn
import_single_good_known_block_is_ignored
()
{
let
(
mut
client
,
_hash
,
number
,
_
,
block
)
=
prepare_good_block
();
match
import_single_block
(
&
mut
client
,
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
(
true
))
{
match
import_single_block
(
&
mut
client
,
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
::
new
(
true
))
{
Ok
(
BlockImportResult
::
ImportedKnown
(
ref
n
))
if
*
n
==
number
as
u32
=>
{}
_
=>
panic!
()
}
...
...
@@ -80,7 +80,7 @@ fn import_single_good_known_block_is_ignored() {
fn
import_single_good_block_without_header_fails
()
{
let
(
_
,
_
,
_
,
peer_id
,
mut
block
)
=
prepare_good_block
();
block
.header
=
None
;
match
import_single_block
(
&
mut
polkadot_test_runtime_client
::
new
(),
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
(
true
))
{
match
import_single_block
(
&
mut
polkadot_test_runtime_client
::
new
(),
BlockOrigin
::
File
,
block
,
&
mut
PassThroughVerifier
::
new
(
true
))
{
Err
(
BlockImportError
::
IncompleteHeader
(
ref
org
))
if
*
org
==
Some
(
peer_id
)
=>
{}
_
=>
panic!
()
}
...
...
@@ -91,7 +91,7 @@ fn async_import_queue_drops() {
let
executor
=
sp_core
::
testing
::
SpawnBlockingExecutor
::
new
();
// Perform this test multiple times since it exhibits non-deterministic behavior.
for
_
in
0
..
100
{
let
verifier
=
PassThroughVerifier
(
true
);
let
verifier
=
PassThroughVerifier
::
new
(
true
);
let
queue
=
BasicQueue
::
new
(
verifier
,
...
...
network/test/src/lib.rs
View file @
6f8fde1b
...
...
@@ -600,7 +600,7 @@ pub trait TestNetFactory: Sized {
transaction_pool
:
Arc
::
new
(
EmptyTransactionPool
),
protocol_id
:
ProtocolId
::
from
(
&
b"test-protocol-name"
[
..
]),
import_queue
,
block_announce_validator
:
Box
::
new
(
DefaultBlockAnnounceValidator
::
new
(
client
.clone
())
),
block_announce_validator
:
Box
::
new
(
DefaultBlockAnnounceValidator
),
metrics_registry
:
None
,
})
.unwrap
();
...
...
@@ -677,7 +677,7 @@ pub trait TestNetFactory: Sized {
transaction_pool
:
Arc
::
new
(
EmptyTransactionPool
),
protocol_id
:
ProtocolId
::
from
(
&
b"test-protocol-name"
[
..
]),
import_queue
,
block_announce_validator
:
Box
::
new
(
DefaultBlockAnnounceValidator
::
new
(
client
.clone
())
),
block_announce_validator
:
Box
::
new
(
DefaultBlockAnnounceValidator
),
metrics_registry
:
None
,
})
.unwrap
();
...
...
@@ -804,7 +804,7 @@ impl TestNetFactory for TestNet {
fn
make_verifier
(
&
self
,
_client
:
PeersClient
,
_config
:
&
ProtocolConfig
,
_peer_data
:
&
())
->
Self
::
Verifier
{
PassThroughVerifier
(
false
)
PassThroughVerifier
::
new
(
false
)
}
fn
peer
(
&
mut
self
,
i
:
usize
)
->
&
mut
Peer
<
()
>
{
...
...
node/network/bridge/Cargo.toml
0 → 100644
View file @
6f8fde1b
[package]
name
=
"polkadot-network-bridge"
version
=
"0.1.0"
authors
=
[
"Parity Technologies <admin@parity.io>"
]
edition
=
"2018"
[dependencies]
futures
=
"0.3.5"
log
=
"0.4.8"
futures-timer
=
"3.0.2"
streamunordered
=
"0.5.1"
polkadot-primitives
=
{
path
=
"../../../primitives"
}
node-primitives
=
{
package
=
"polkadot-node-primitives"
,
path
=
"../../primitives"
}
parity-scale-codec
=
"1.3.0"
sc-network
=
{
git
=
"https://github.com/paritytech/substrate"
,
branch
=
"master"
}
sp-runtime
=
{
git
=
"https://github.com/paritytech/substrate"
,
branch
=
"master"
}
polkadot-subsystem
=
{
package
=
"polkadot-node-subsystem"
,
path
=
"../../subsystem"
}
[dev-dependencies]
parking_lot
=
"0.10.0"
subsystem-test
=
{
package
=
"polkadot-subsystem-test-helpers"
,
path
=
"../../test-helpers/subsystem"
}
assert_matches
=
"1.3.0"
node/network/bridge/src/lib.rs
0 → 100644
View file @
6f8fde1b
This diff is collapsed.
Click to expand it.
node/overseer/Cargo.toml
View file @
6f8fde1b
...
...
@@ -11,7 +11,8 @@ futures-timer = "3.0.2"
streamunordered
=
"0.5.1"
polkadot-primitives
=
{
path
=
"../../primitives"
}
client
=
{
package
=
"sc-client-api"
,
git
=
"https://github.com/paritytech/substrate"
,
branch
=
"master"
}
messages
=
{
package
=
"polkadot-node-messages"
,
path
=
"../messages"
}
polkadot-subsystem
=
{
package
=
"polkadot-node-subsystem"
,
path
=
"../subsystem"
}
async-trait
=
"0.1"
[dev-dependencies]
futures
=
{
version
=
"0.3.5"
,
features
=
["thread-pool"]
}
...
...
node/overseer/examples/minimal-example.rs
View file @
6f8fde1b
...
...
@@ -28,16 +28,17 @@ use futures_timer::Delay;
use
kv_log_macro
as
log
;
use
polkadot_primitives
::
parachain
::{
BlockData
,
PoVBlock
};
use
polkadot_overseer
::
{
Overseer
,
Subsystem
,
SubsystemContext
,
SpawnedSubsystem
}
;
use
polkadot_overseer
::
Overseer
;
use
messages
::{
AllMessages
,
CandidateBackingMessage
,
FromOverseer
,
CandidateValidationMessage
use
polkadot_subsystem
::{
Subsystem
,
SubsystemContext
,
SpawnedSubsystem
,
FromOverseer
};
use
polkadot_subsystem
::
messages
::{
AllMessages
,
CandidateBackingMessage
,
CandidateValidationMessage
};
struct
Subsystem1
;
impl
Subsystem1
{
async
fn
run
(
mut
ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
{
async
fn
run
(
mut
ctx
:
impl
SubsystemContext
<
Message
=
CandidateBackingMessage
>
)
{
loop
{
match
ctx
.try_recv
()
.await
{
Ok
(
Some
(
msg
))
=>
{
...
...
@@ -56,7 +57,7 @@ impl Subsystem1 {
Delay
::
new
(
Duration
::
from_secs
(
1
))
.await
;
let
(
tx
,
_
)
=
oneshot
::
channel
();
ctx
.send_m
sg
(
AllMessages
::
CandidateValidation
(
ctx
.send_m
essage
(
AllMessages
::
CandidateValidation
(
CandidateValidationMessage
::
Validate
(
Default
::
default
(),
Default
::
default
(),
...
...
@@ -70,8 +71,10 @@ impl Subsystem1 {
}
}
impl
Subsystem
<
CandidateBackingMessage
>
for
Subsystem1
{
fn
start
(
&
mut
self
,
ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
Subsystem1
where
C
:
SubsystemContext
<
Message
=
CandidateBackingMessage
>
{
fn
start
(
&
mut
self
,
ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
Self
::
run
(
ctx
)
.await
;
}))
...
...
@@ -81,7 +84,7 @@ impl Subsystem<CandidateBackingMessage> for Subsystem1 {
struct
Subsystem2
;
impl
Subsystem2
{
async
fn
run
(
mut
ctx
:
SubsystemContext
<
CandidateValidationMessage
>
)
{
async
fn
run
(
mut
ctx
:
impl
SubsystemContext
<
Message
=
CandidateValidationMessage
>
)
{
ctx
.spawn
(
Box
::
pin
(
async
{
loop
{
log
::
info!
(
"Job tick"
);
...
...
@@ -105,8 +108,10 @@ impl Subsystem2 {
}
}
impl
Subsystem
<
CandidateValidationMessage
>
for
Subsystem2
{
fn
start
(
&
mut
self
,
ctx
:
SubsystemContext
<
CandidateValidationMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
Subsystem2
where
C
:
SubsystemContext
<
Message
=
CandidateValidationMessage
>
{
fn
start
(
&
mut
self
,
ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
Self
::
run
(
ctx
)
.await
;
}))
...
...
node/overseer/src/lib.rs
View file @
6f8fde1b
...
...
@@ -65,8 +65,8 @@ use futures::channel::{mpsc, oneshot};
use
futures
::{
pending
,
poll
,
select
,
future
::{
BoxFuture
,
RemoteHandle
},
stream
::
FuturesUnordered
,
task
::{
Spawn
,
SpawnError
,
SpawnExt
},
stream
::
{
self
,
FuturesUnordered
}
,
task
::{
Spawn
,
SpawnExt
},
Future
,
FutureExt
,
SinkExt
,
StreamExt
,
};
use
futures_timer
::
Delay
;
...
...
@@ -75,50 +75,14 @@ use streamunordered::{StreamYield, StreamUnordered};
use
polkadot_primitives
::{
Block
,
BlockNumber
,
Hash
};
use
client
::{
BlockImportNotification
,
BlockchainEvents
,
FinalityNotification
};
pub
use
messages
::{
OverseerSignal
,
CandidateValidationMessage
,
CandidateBackingMessage
,
AllMessages
,
FromOverseer
,
use
polkadot_subsystem
::
messages
::{
CandidateValidationMessage
,
CandidateBackingMessage
,
AllMessages
};
pub
use
polkadot_subsystem
::{
Subsystem
,
SubsystemContext
,
OverseerSignal
,
FromOverseer
,
SubsystemError
,
SubsystemResult
,
SpawnedSubsystem
,
};
/// An error type that describes faults that may happen
///
/// These are:
/// * Channels being closed
/// * Subsystems dying when they are not expected to
/// * Subsystems not dying when they are told to die
/// * etc.
#[derive(Debug)]
pub
struct
SubsystemError
;
impl
From
<
mpsc
::
SendError
>
for
SubsystemError
{
fn
from
(
_
:
mpsc
::
SendError
)
->
Self
{
Self
}
}
impl
From
<
oneshot
::
Canceled
>
for
SubsystemError
{
fn
from
(
_
:
oneshot
::
Canceled
)
->
Self
{
Self
}
}
impl
From
<
SpawnError
>
for
SubsystemError
{
fn
from
(
_
:
SpawnError
)
->
Self
{
Self
}
}
/// A `Result` type that wraps [`SubsystemError`].
///
/// [`SubsystemError`]: struct.SubsystemError.html
pub
type
SubsystemResult
<
T
>
=
Result
<
T
,
SubsystemError
>
;
/// An asynchronous subsystem task that runs inside and being overseen by the [`Overseer`].
///
/// In essence it's just a newtype wrapping a `BoxFuture`.
///
/// [`Overseer`]: struct.Overseer.html
pub
struct
SpawnedSubsystem
(
pub
BoxFuture
<
'static
,
()
>
);
// A capacity of bounded channels inside the overseer.
const
CHANNEL_CAPACITY
:
usize
=
1024
;
...
...
@@ -278,7 +242,7 @@ impl Debug for ToOverseer {
/// A running instance of some [`Subsystem`].
///
/// [`Subsystem`]: trait.Subsystem.html
struct
SubsystemInstance
<
M
:
Debug
>
{
struct
SubsystemInstance
<
M
>
{
tx
:
mpsc
::
Sender
<
FromOverseer
<
M
>>
,
}
...
...
@@ -289,17 +253,17 @@ struct SubsystemInstance<M: Debug> {
/// [`Overseer`]: struct.Overseer.html
/// [`Subsystem`]: trait.Subsystem.html
/// [`SubsystemJob`]: trait.SubsystemJob.html
pub
struct
SubsystemContext
<
M
:
Debug
>
{
#[derive(Debug)]
pub
struct
OverseerSubsystemContext
<
M
>
{
rx
:
mpsc
::
Receiver
<
FromOverseer
<
M
>>
,
tx
:
mpsc
::
Sender
<
ToOverseer
>
,
}
impl
<
M
:
Debug
>
SubsystemContext
<
M
>
{
/// Try to asyncronously receive a message.
///
/// This has to be used with caution, if you loop over this without
/// using `pending!()` macro you will end up with a busy loop!
pub
async
fn
try_recv
(
&
mut
self
)
->
Result
<
Option
<
FromOverseer
<
M
>>
,
()
>
{
#[async_trait::async_trait]
impl
<
M
:
Send
+
'static
>
SubsystemContext
for
OverseerSubsystemContext
<
M
>
{
type
Message
=
M
;
async
fn
try_recv
(
&
mut
self
)
->
Result
<
Option
<
FromOverseer
<
M
>>
,
()
>
{
match
poll!
(
self
.rx
.next
())
{
Poll
::
Ready
(
Some
(
msg
))
=>
Ok
(
Some
(
msg
)),
Poll
::
Ready
(
None
)
=>
Err
(()),
...
...
@@ -307,13 +271,11 @@ impl<M: Debug> SubsystemContext<M> {
}
}
/// Receive a message.
pub
async
fn
recv
(
&
mut
self
)
->
SubsystemResult
<
FromOverseer
<
M
>>
{
async
fn
recv
(
&
mut
self
)
->
SubsystemResult
<
FromOverseer
<
M
>>
{
self
.rx
.next
()
.await
.ok_or
(
SubsystemError
)
}
/// Spawn a child task on the executor.
pub
async
fn
spawn
(
&
mut
self
,
s
:
Pin
<
Box
<
dyn
Future
<
Output
=
()
>
+
Send
>>
)
->
SubsystemResult
<
()
>
{
async
fn
spawn
(
&
mut
self
,
s
:
Pin
<
Box
<
dyn
Future
<
Output
=
()
>
+
Send
>>
)
->
SubsystemResult
<
()
>
{
let
(
tx
,
rx
)
=
oneshot
::
channel
();
self
.tx
.send
(
ToOverseer
::
SpawnJob
{
s
,
...
...
@@ -323,33 +285,25 @@ impl<M: Debug> SubsystemContext<M> {
rx
.await
?
}
/// Send a direct message to some other `Subsystem`, routed based on message type.
pub
async
fn
send_msg
(
&
mut
self
,
msg
:
AllMessages
)
->
SubsystemResult
<
()
>
{
async
fn
send_message
(
&
mut
self
,
msg
:
AllMessages
)
->
SubsystemResult
<
()
>
{
self
.tx
.send
(
ToOverseer
::
SubsystemMessage
(
msg
))
.await
?
;
Ok
(())
}
fn
new
(
rx
:
mpsc
::
Receiver
<
FromOverseer
<
M
>>
,
tx
:
mpsc
::
Sender
<
ToOverseer
>
)
->
Self
{
Self
{
rx
,
tx
,
}
async
fn
send_messages
<
T
>
(
&
mut
self
,
msgs
:
T
)
->
SubsystemResult
<
()
>
where
T
:
IntoIterator
<
Item
=
AllMessages
>
+
Send
,
T
::
IntoIter
:
Send
{
let
mut
msgs
=
stream
::
iter
(
msgs
.into_iter
()
.map
(
ToOverseer
::
SubsystemMessage
)
.map
(
Ok
));
self
.tx
.send_all
(
&
mut
msgs
)
.await
?
;
Ok
(())
}
}
/// A trait that describes the [`Subsystem`]s that can run on the [`Overseer`].
///
/// It is generic over the message type circulating in the system.
/// The idea that we want some type contaning persistent state that
/// can spawn actually running subsystems when asked to.
///
/// [`Overseer`]: struct.Overseer.html
/// [`Subsystem`]: trait.Subsystem.html
pub
trait
Subsystem
<
M
:
Debug
>
{
/// Start this `Subsystem` and return `SpawnedSubsystem`.
fn
start
(
&
mut
self
,
ctx
:
SubsystemContext
<
M
>
)
->
SpawnedSubsystem
;
}
/// A subsystem compatible with the overseer - one which can be run in the context of the
/// overseer.
pub
type
CompatibleSubsystem
<
M
>
=
Box
<
dyn
Subsystem
<
OverseerSubsystemContext
<
M
>>
+
Send
>
;
/// A subsystem that we oversee.
///
...
...
@@ -359,8 +313,8 @@ pub trait Subsystem<M: Debug> {
///
/// [`Subsystem`]: trait.Subsystem.html
#[allow(dead_code)]
struct
OverseenSubsystem
<
M
:
Debug
>
{
subsystem
:
Box
<
dyn
Subsystem
<
M
>
+
Send
>
,
struct
OverseenSubsystem
<
M
>
{
subsystem
:
Compatible
Subsystem
<
M
>
,
instance
:
Option
<
SubsystemInstance
<
M
>>
,
}
...
...
@@ -441,16 +395,20 @@ where
/// # use std::time::Duration;
/// # use futures::{executor, pin_mut, select, FutureExt};
/// # use futures_timer::Delay;
/// # use polkadot_overseer::{
/// # Overseer, Subsystem, SpawnedSubsystem, SubsystemContext,
/// # CandidateValidationMessage, CandidateBackingMessage,
/// # use polkadot_overseer::Overseer;
/// # use polkadot_subsystem::{
/// # Subsystem, SpawnedSubsystem, SubsystemContext,
/// # messages::{CandidateValidationMessage, CandidateBackingMessage},
/// # };
///
/// struct ValidationSubsystem;
/// impl Subsystem<CandidateValidationMessage> for ValidationSubsystem {
///
/// impl<C> Subsystem<C> for ValidationSubsystem
/// where C: SubsystemContext<Message=CandidateValidationMessage>
/// {
/// fn start(
/// &mut self,
/// mut ctx:
SubsystemContext<CandidateValidationMessage>
,
/// mut ctx:
C
,
/// ) -> SpawnedSubsystem {
/// SpawnedSubsystem(Box::pin(async move {
/// loop {
...
...
@@ -461,10 +419,12 @@ where
/// }
///
/// struct CandidateBackingSubsystem;
/// impl Subsystem<CandidateBackingMessage> for CandidateBackingSubsystem {
/// impl<C> Subsystem<C> for CandidateBackingSubsystem
/// where C: SubsystemContext<Message=CandidateBackingMessage>
/// {
/// fn start(
/// &mut self,
/// mut ctx:
SubsystemContext<CandidateBackingMessage>
,
/// mut ctx:
C
,
/// ) -> SpawnedSubsystem {
/// SpawnedSubsystem(Box::pin(async move {
/// loop {
...
...
@@ -498,8 +458,8 @@ where
/// ```
pub
fn
new
(
leaves
:
impl
IntoIterator
<
Item
=
BlockInfo
>
,
validation
:
Box
<
dyn
Subsystem
<
CandidateValidationMessage
>
+
Send
>
,
candidate_backing
:
Box
<
dyn
Subsystem
<
CandidateBackingMessage
>
+
Send
>
,
validation
:
Compatible
Subsystem
<
CandidateValidationMessage
>
,
candidate_backing
:
Compatible
Subsystem
<
CandidateBackingMessage
>
,
mut
s
:
S
,
)
->
SubsystemResult
<
(
Self
,
OverseerHandler
)
>
{
let
(
events_tx
,
events_rx
)
=
mpsc
::
channel
(
CHANNEL_CAPACITY
);
...
...
@@ -680,6 +640,12 @@ where
let
_
=
s
.tx
.send
(
FromOverseer
::
Communication
{
msg
})
.await
;
}
}
_
=>
{
// TODO: temporary catch-all until all subsystems are integrated with overseer.
// The overseer is not complete until this is an exhaustive match with all
// messages targeting an included subsystem.
// https://github.com/paritytech/polkadot/issues/1317
}
}
}
...
...
@@ -688,15 +654,15 @@ where
}
}
fn
spawn
<
S
:
Spawn
,
M
:
Debug
>
(
fn
spawn
<
S
:
Spawn
,
M
:
Send
+
'static
>
(
spawner
:
&
mut
S
,
futures
:
&
mut
FuturesUnordered
<
RemoteHandle
<
()
>>
,
streams
:
&
mut
StreamUnordered
<
mpsc
::
Receiver
<
ToOverseer
>>
,
mut
s
:
Box
<
dyn
Subsystem
<
M
>
+
Send
>
,
mut
s
:
Compatible
Subsystem
<
M
>
,
)
->
SubsystemResult
<
OverseenSubsystem
<
M
>>
{
let
(
to_tx
,
to_rx
)
=
mpsc
::
channel
(
CHANNEL_CAPACITY
);
let
(
from_tx
,
from_rx
)
=
mpsc
::
channel
(
CHANNEL_CAPACITY
);
let
ctx
=
SubsystemContext
::
new
(
to_rx
,
from_tx
)
;
let
ctx
=
Overseer
SubsystemContext
{
rx
:
to_rx
,
tx
:
from_tx
}
;
let
f
=
s
.start
(
ctx
);
let
handle
=
spawner
.spawn_with_handle
(
f
.0
)
?
;
...
...
@@ -723,8 +689,10 @@ mod tests {
struct
TestSubsystem1
(
mpsc
::
Sender
<
usize
>
);
impl
Subsystem
<
CandidateValidationMessage
>
for
TestSubsystem1
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateValidationMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
TestSubsystem1
where
C
:
SubsystemContext
<
Message
=
CandidateValidationMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
let
mut
sender
=
self
.0
.clone
();
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
let
mut
i
=
0
;
...
...
@@ -746,14 +714,16 @@ mod tests {
struct
TestSubsystem2
(
mpsc
::
Sender
<
usize
>
);
impl
Subsystem
<
CandidateBackingMessage
>
for
TestSubsystem2
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
TestSubsystem2
where
C
:
SubsystemContext
<
Message
=
CandidateBackingMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
let
mut
c
:
usize
=
0
;
loop
{
if
c
<
10
{
let
(
tx
,
_
)
=
oneshot
::
channel
();
ctx
.send_m
sg
(
ctx
.send_m
essage
(
AllMessages
::
CandidateValidation
(
CandidateValidationMessage
::
Validate
(
Default
::
default
(),
...
...
@@ -786,8 +756,10 @@ mod tests {
struct
TestSubsystem4
;
impl
Subsystem
<
CandidateBackingMessage
>
for
TestSubsystem4
{
fn
start
(
&
mut
self
,
mut
_ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
TestSubsystem4
where
C
:
SubsystemContext
<
Message
=
CandidateBackingMessage
>
{
fn
start
(
&
mut
self
,
mut
_ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
// Do nothing and exit.
}))
...
...
@@ -871,8 +843,10 @@ mod tests {
struct
TestSubsystem5
(
mpsc
::
Sender
<
OverseerSignal
>
);
impl
Subsystem
<
CandidateValidationMessage
>
for
TestSubsystem5
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateValidationMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
TestSubsystem5
where
C
:
SubsystemContext
<
Message
=
CandidateValidationMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
let
mut
sender
=
self
.0
.clone
();
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
...
...
@@ -895,8 +869,10 @@ mod tests {
struct
TestSubsystem6
(
mpsc
::
Sender
<
OverseerSignal
>
);
impl
Subsystem
<
CandidateBackingMessage
>
for
TestSubsystem6
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
TestSubsystem6
where
C
:
SubsystemContext
<
Message
=
CandidateBackingMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
let
mut
sender
=
self
.0
.clone
();
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
...
...
node/primitives/Cargo.toml
View file @
6f8fde1b
...
...
@@ -10,3 +10,4 @@ polkadot-primitives = { path = "../../primitives" }
polkadot-statement-table
=
{
path
=
"../../statement-table"
}
parity-scale-codec
=
{
version
=
"1.3.0"
,
default-features
=
false
,
features
=
["derive"]
}
runtime_primitives
=
{
package
=
"sp-runtime"
,
git
=
"https://github.com/paritytech/substrate"
,
branch
=
"master"
,
default-features
=
false
}
async-trait
=
"0.1"
node/primitives/src/lib.rs
View file @
6f8fde1b
...
...
@@ -64,6 +64,7 @@ impl EncodeAs<CompactStatement> for Statement {
pub
type
SignedFullStatement
=
Signed
<
Statement
,
CompactStatement
>
;
/// A misbehaviour report.
#[derive(Debug)]
pub
enum
MisbehaviorReport
{
/// These validator nodes disagree on this candidate's validity, please figure it out
///
...
...
@@ -79,3 +80,12 @@ pub enum MisbehaviorReport {
/// This peer has seconded more than one parachain candidate for this relay parent head
DoubleVote
(
CandidateReceipt
,
SignedFullStatement
,
SignedFullStatement
),
}
/// A unique identifier for a network protocol.
pub
type
ProtocolId
=
[
u8
;
4
];
/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads.
///
/// Up to `N` (5?) chain heads.
#[derive(Debug,
Clone,
PartialEq,
Eq,
Encode,
Decode)]
pub
struct
View
(
pub
Vec
<
Hash
>
);
node/service/Cargo.toml
View file @
6f8fde1b
...
...
@@ -15,6 +15,7 @@ hex-literal = "0.2.1"
polkadot-primitives
=
{
path
=
"../../primitives"
}
polkadot-runtime
=
{
path
=
"../../runtime/polkadot"
}
polkadot-overseer
=
{
path
=
"../overseer"
}
polkadot-subsystem
=
{
package
=
"polkadot-node-subsystem"
,
path
=
"../subsystem"
}
kusama-runtime
=
{
path
=
"../../runtime/kusama"
}
westend-runtime
=
{
path
=
"../../runtime/westend"
}
polkadot-network
=
{
path
=
"../../network"
,
optional
=
true
}
...
...
node/service/src/lib.rs
View file @
6f8fde1b
...
...
@@ -29,10 +29,10 @@ use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider};
use
sc_executor
::
native_executor_instance
;
use
log
::
info
;
use
sp_blockchain
::
HeaderBackend
;
use
polkadot_overseer
::{
se
lf
as
overseer
,
BlockInfo
,
Overseer
,
OverseerHandler
,
Subsystem
,
SubsystemContext
,
SpawnedSubsystem
,
CandidateValidationMessage
,
CandidateBackingMessage
,
use
polkadot_overseer
::{
self
as
overseer
,
BlockInfo
,
Overseer
,
OverseerHandler
};
u
se
polkadot_subsystem
::{
Subsystem
,
SubsystemContext
,
SpawnedSubsystem
,
messages
::{
CandidateValidationMessage
,
CandidateBackingMessage
}
,
};
pub
use
service
::{
Role
,
PruningMode
,
TransactionPoolOptions
,
Error
,
RuntimeGenesis
,
...
...
@@ -269,8 +269,10 @@ macro_rules! new_full_start {
struct
CandidateValidationSubsystem
;
impl
Subsystem
<
CandidateValidationMessage
>
for
CandidateValidationSubsystem
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateValidationMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
CandidateValidationSubsystem
where
C
:
SubsystemContext
<
Message
=
CandidateValidationMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
while
let
Ok
(
_
)
=
ctx
.recv
()
.await
{}
}))
...
...
@@ -279,8 +281,10 @@ impl Subsystem<CandidateValidationMessage> for CandidateValidationSubsystem {
struct
CandidateBackingSubsystem
;
impl
Subsystem
<
CandidateBackingMessage
>
for
CandidateBackingSubsystem
{
fn
start
(
&
mut
self
,
mut
ctx
:
SubsystemContext
<
CandidateBackingMessage
>
)
->
SpawnedSubsystem
{
impl
<
C
>
Subsystem
<
C
>
for
CandidateBackingSubsystem
where
C
:
SubsystemContext
<
Message
=
CandidateBackingMessage
>
{
fn
start
(
&
mut
self
,
mut
ctx
:
C
)
->
SpawnedSubsystem
{
SpawnedSubsystem
(
Box
::
pin
(
async
move
{
while
let
Ok
(
_
)
=
ctx
.recv
()
.await
{}
}))
...
...
node/
messages
/Cargo.toml
→
node/
subsystem
/Cargo.toml
View file @
6f8fde1b
[package]
name
=
"polkadot-node-
messages
"
name
=
"polkadot-node-
subsystem
"
version
=
"0.1.0"
authors
=
[
"Parity Technologies <admin@parity.io>"
]
edition
=
"2018"
description
=
"
Message types used by Subsystem
s"
description
=
"
Subsystem traits and message definition
s"
[dependencies]
polkadot-primitives
=
{
path
=
"../../primitives"
}
...
...
@@ -11,3 +11,4 @@ polkadot-statement-table = { path = "../../statement-table" }
polkadot-node-primitives
=
{
path
=
"../primitives"
}
sc-network
=
{
git
=
"https://github.com/paritytech/substrate"
,
branch
=
"master"
}
futures
=
"0.3.5"
async-trait
=
"0.1"
node/subsystem/src/lib.rs
0 → 100644
View file @
6f8fde1b
// Copyright 2017-2020 Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Polkadot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of