Skip to content

Commit

Permalink
Added skeleton for provisioner
Browse files Browse the repository at this point in the history
  • Loading branch information
kishansagathiya committed Sep 5, 2024
1 parent cd5a2bf commit ca16b01
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 35 deletions.
4 changes: 3 additions & 1 deletion dot/parachain/backing/candidate_backing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
availabilitystore "github.com/ChainSafe/gossamer/dot/parachain/availability-store"
candidatevalidation "github.com/ChainSafe/gossamer/dot/parachain/candidate-validation"
collatorprotocolmessages "github.com/ChainSafe/gossamer/dot/parachain/collator-protocol/messages"
provisionermessages "github.com/ChainSafe/gossamer/dot/parachain/provisioner/messages"

parachaintypes "github.com/ChainSafe/gossamer/dot/parachain/types"
"github.com/ChainSafe/gossamer/lib/common"
"github.com/ChainSafe/gossamer/lib/crypto/sr25519"
Expand Down Expand Up @@ -80,7 +82,7 @@ func mockOverseer(t *testing.T, subsystemToOverseer chan any) {
case parachaintypes.ProspectiveParachainsMessageIntroduceCandidate:
data.Ch <- nil
case parachaintypes.ProspectiveParachainsMessageCandidateSeconded,
parachaintypes.ProvisionerMessageProvisionableData,
provisionermessages.ProvisionableData,
parachaintypes.ProspectiveParachainsMessageCandidateBacked,
collatorprotocolmessages.Backed,
parachaintypes.StatementDistributionMessageBacked:
Expand Down
3 changes: 2 additions & 1 deletion dot/parachain/backing/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
candidatevalidation "github.com/ChainSafe/gossamer/dot/parachain/candidate-validation"
collatorprotocolmessages "github.com/ChainSafe/gossamer/dot/parachain/collator-protocol/messages"
"github.com/ChainSafe/gossamer/dot/parachain/overseer"
provisionermessages "github.com/ChainSafe/gossamer/dot/parachain/provisioner/messages"
parachaintypes "github.com/ChainSafe/gossamer/dot/parachain/types"
"github.com/ChainSafe/gossamer/lib/common"
"github.com/ChainSafe/gossamer/lib/crypto"
Expand Down Expand Up @@ -544,7 +545,7 @@ func TestCandidateReachesQuorum(t *testing.T) {
}

provisionerMessageProvisionableData := func(msg any) bool {
_, ok := msg.(parachaintypes.ProvisionerMessageProvisionableData)
_, ok := msg.(provisionermessages.ProvisionableData)
return ok
}

Expand Down
11 changes: 6 additions & 5 deletions dot/parachain/backing/per_relay_parent_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
availabilitystore "github.com/ChainSafe/gossamer/dot/parachain/availability-store"
candidatevalidation "github.com/ChainSafe/gossamer/dot/parachain/candidate-validation"
collatorprotocolmessages "github.com/ChainSafe/gossamer/dot/parachain/collator-protocol/messages"
provisionermessages "github.com/ChainSafe/gossamer/dot/parachain/provisioner/messages"
parachaintypes "github.com/ChainSafe/gossamer/dot/parachain/types"
"github.com/ChainSafe/gossamer/lib/runtime"
wazero_runtime "github.com/ChainSafe/gossamer/lib/runtime/wazero"
Expand Down Expand Up @@ -182,9 +183,9 @@ func (rpState *perRelayParentState) postImportStatement(subSystemToOverseer chan
//
// Backed candidates are bounded by the number of validators,
// parachains, and the block production rate of the relay chain.
subSystemToOverseer <- parachaintypes.ProvisionerMessageProvisionableData{
RelayParent: rpState.relayParent,
ProvisionableData: parachaintypes.ProvisionableDataBackedCandidate(backedCandidate.Candidate.ToPlain()),
subSystemToOverseer <- provisionermessages.ProvisionableData{
RelayParent: rpState.relayParent,
Data: provisionermessages.ProvisionableDataBackedCandidate(backedCandidate.Candidate.ToPlain()),
}
}
}
Expand All @@ -203,9 +204,9 @@ func issueNewMisbehaviors(subSystemToOverseer chan<- any, relayParent common.Has
// Misbehaviors are bounded by the number of validators and
// the block production protocol.
for _, misbehaviour := range misbehaviours {
subSystemToOverseer <- parachaintypes.ProvisionerMessageProvisionableData{
subSystemToOverseer <- provisionermessages.ProvisionableData{
RelayParent: relayParent,
ProvisionableData: parachaintypes.ProvisionableDataMisbehaviorReport{
Data: provisionermessages.ProvisionableDataMisbehaviorReport{
ValidatorIndex: validatorIndex,
Misbehaviour: misbehaviour,
},
Expand Down
45 changes: 45 additions & 0 deletions dot/parachain/provisioner/messages/messages.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package provisionermessages

import (
parachaintypes "github.com/ChainSafe/gossamer/dot/parachain/types"
"github.com/ChainSafe/gossamer/lib/common"
)

var (
_ Data = (*ProvisionableDataBackedCandidate)(nil)
_ Data = (*ProvisionableDataMisbehaviorReport)(nil)
)

type RequestInherentData struct {
RelayParent common.Hash
ProvisionerInherentData chan ProvisionerInherentData
}

type ProvisionerInherentData struct {
}

// ProvisionerMessageProvisionableData is a provisioner message.
// This data should become part of a relay chain block.
type ProvisionableData struct {
RelayParent common.Hash
Data Data
}

// Data becomes intrinsics or extrinsics which should be included in a future relay chain block.
type Data interface {
IsProvisionableData()
}

// ProvisionableDataBackedCandidate is a provisionable data.
// The Candidate Backing subsystem believes that this candidate is valid, pending availability.
type ProvisionableDataBackedCandidate parachaintypes.CandidateReceipt

func (ProvisionableDataBackedCandidate) IsProvisionableData() {}

// ProvisionableDataMisbehaviorReport represents self-contained proofs of validator misbehaviour.
type ProvisionableDataMisbehaviorReport struct {
ValidatorIndex parachaintypes.ValidatorIndex
Misbehaviour parachaintypes.Misbehaviour
}

func (ProvisionableDataMisbehaviorReport) IsProvisionableData() {}
87 changes: 87 additions & 0 deletions dot/parachain/provisioner/provisioner.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package provisioner

import (
"context"
"time"

provisionermessages "github.com/ChainSafe/gossamer/dot/parachain/provisioner/messages"
parachaintypes "github.com/ChainSafe/gossamer/dot/parachain/types"
"github.com/ChainSafe/gossamer/internal/log"
"github.com/ChainSafe/gossamer/lib/common"
)

var logger = log.NewFromGlobal(log.AddContext("pkg", "provisioner"))

// we expect an inherent to be ready after this time.
const INHERENT_TIMEOUT = time.Millisecond * 2000

type Provisioner struct {
// TODO This doesn't have to be a channel with buffer.
// The idea is to send a relay parent hash on this channel after INHERENT_TIMEOUT, open to design changes
inherentAfterDelay chan common.Hash
}

func (p Provisioner) Run(ctx context.Context, overseerToSubSystem <-chan any) {
// TODO https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L177

for {
select {
// TODO: polkadot-rust changes reputation in batches, so we do the same?
case msg, ok := <-overseerToSubSystem:
if !ok {
return
}
err := p.processMessage(msg)
if err != nil {
logger.Errorf("processing overseer message: %w", err)
}
case <-p.inherentAfterDelay:
// This inherentAfterDelay gets populated while handling active leaves update signal
// TODO https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L181
}

}
}

func (p Provisioner) processMessage(msg any) error {
switch msg.(type) {
case provisionermessages.RequestInherentData:
// TODO https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L253
case provisionermessages.ProvisionableData:
// TODO https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L271
default:
return parachaintypes.ErrUnknownOverseerMessage
}

return nil

}

func (p Provisioner) Name() parachaintypes.SubSystemName {
return parachaintypes.Provisioner
}

func (p Provisioner) ProcessActiveLeavesUpdateSignal(parachaintypes.ActiveLeavesUpdateSignal) error {
// TODO https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L173
// https://github.com/paritytech/polkadot-sdk/blob/e1460b5ee5f4490b428035aa4a72c1c99a262459/polkadot/node/core/provisioner/src/lib.rs#L201
return nil
}

func (p Provisioner) ProcessBlockFinalizedSignal(parachaintypes.BlockFinalizedSignal) error {
// nothing to do here
return nil
}

func (p Provisioner) Stop() {}

type RequestInherentData struct {
RelayParent common.Hash
ProvisionerInherentData chan ProvisionerInherentData
}

type ProvisionerInherentData struct {
}

type ProvisionableData struct {
RelayParent common.Hash
}
28 changes: 0 additions & 28 deletions dot/parachain/types/overseer_message.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ package parachaintypes
import "github.com/ChainSafe/gossamer/lib/common"

var (
_ ProvisionableData = (*ProvisionableDataBackedCandidate)(nil)
_ ProvisionableData = (*ProvisionableDataMisbehaviorReport)(nil)
_ HypotheticalCandidate = (*HypotheticalCandidateIncomplete)(nil)
_ HypotheticalCandidate = (*HypotheticalCandidateComplete)(nil)
)
Expand All @@ -18,32 +16,6 @@ type OverseerFuncRes[T any] struct {
Data T
}

// ProvisionerMessageProvisionableData is a provisioner message.
// This data should become part of a relay chain block.
type ProvisionerMessageProvisionableData struct {
RelayParent common.Hash
ProvisionableData ProvisionableData
}

// ProvisionableData becomes intrinsics or extrinsics which should be included in a future relay chain block.
type ProvisionableData interface {
IsProvisionableData()
}

// ProvisionableDataBackedCandidate is a provisionable data.
// The Candidate Backing subsystem believes that this candidate is valid, pending availability.
type ProvisionableDataBackedCandidate CandidateReceipt

func (ProvisionableDataBackedCandidate) IsProvisionableData() {}

// ProvisionableDataMisbehaviorReport represents self-contained proofs of validator misbehaviour.
type ProvisionableDataMisbehaviorReport struct {
ValidatorIndex ValidatorIndex
Misbehaviour Misbehaviour
}

func (ProvisionableDataMisbehaviorReport) IsProvisionableData() {}

// StatementDistributionMessageBacked is a statement distribution message.
// it represents a message indicating that a candidate has received sufficient
// validity votes from the backing group. If backed as a result of a local statement,
Expand Down
1 change: 1 addition & 0 deletions dot/parachain/types/subsystems.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const (
NetworkBridgeReceiver SubSystemName = "NetworkBridgeReceiver"
ChainAPI SubSystemName = "ChainAPI"
CandidateValidation SubSystemName = "CandidateValidation"
Provisioner SubSystemName = "Provisioner"
)

var SubsystemRequestTimeout = 1 * time.Second
Expand Down

0 comments on commit ca16b01

Please sign in to comment.