diff --git a/pkg/availability/multisigcollector/internal/common/common.go b/pkg/availability/multisigcollector/internal/common/common.go index 8ccdb14e7..030c712fe 100644 --- a/pkg/availability/multisigcollector/internal/common/common.go +++ b/pkg/availability/multisigcollector/internal/common/common.go @@ -37,16 +37,7 @@ func DefaultModuleConfig() *ModuleConfig { type ModuleParams struct { InstanceUID []byte // unique identifier for this instance of BCB, used to prevent cross-instance replay attacks AllNodes []t.NodeID // the list of participating nodes -} - -// N is the total number of replicas. -func (params *ModuleParams) N() int { - return len(params.AllNodes) -} - -// F is the maximum number of replicas that can be tolerated. -func (params *ModuleParams) F() int { - return (params.N() - 1) / 3 + F int // the maximum number of failures tolerated. Must be less than (len(AllNodes)-1) / 2 } // State represents the common state used by all parts of the multisig collector implementation. diff --git a/pkg/availability/multisigcollector/internal/parts/certcreation/certcreation.go b/pkg/availability/multisigcollector/internal/parts/certcreation/certcreation.go index 8005873b5..d490353a3 100644 --- a/pkg/availability/multisigcollector/internal/parts/certcreation/certcreation.go +++ b/pkg/availability/multisigcollector/internal/parts/certcreation/certcreation.go @@ -113,12 +113,12 @@ func IncludeCreatingCertificates( return nil }) - // When a quorum (more than (N+F)/2) of signatures are collected, create and output a certificate. + // When F+1 signatures are collected, create and output a certificate. dsl.UponCondition(m, func() error { // Iterate over active outgoing requests. //Most of the time, there is expected to be at most one active outgoing request. for reqID, requestState := range state.RequestState { - if len(requestState.sigs) > (params.N()+params.F())/2 { + if len(requestState.sigs) > params.F+1 { certNodes, certSigs := maputil.GetKeysAndValues(requestState.sigs) requestingModule := t.ModuleID(requestState.ReqOrigin.Module) diff --git a/pkg/availability/multisigcollector/internal/parts/certverification/certverification.go b/pkg/availability/multisigcollector/internal/parts/certverification/certverification.go index 9fd91750d..e32e46f02 100644 --- a/pkg/availability/multisigcollector/internal/parts/certverification/certverification.go +++ b/pkg/availability/multisigcollector/internal/parts/certverification/certverification.go @@ -67,7 +67,7 @@ func verifyCertificateStructure(params *common.ModuleParams, cert *apb.Cert) (*m mscCert := mscCertWrapper.Msc // Check that the certificate contains a sufficient number of signatures. - if len(mscCert.Signers) <= (params.N()+params.F())/2 { + if len(mscCert.Signers) <= params.F+1 { return nil, fmt.Errorf("insuficient number of signatures") } diff --git a/pkg/availability/multisigcollector/multisigcollector.go b/pkg/availability/multisigcollector/multisigcollector.go index 6ddddc731..c9b19e875 100644 --- a/pkg/availability/multisigcollector/multisigcollector.go +++ b/pkg/availability/multisigcollector/multisigcollector.go @@ -1,6 +1,8 @@ package multisigcollector import ( + "fmt" + "github.com/filecoin-project/mir/pkg/availability/multisigcollector/internal/common" "github.com/filecoin-project/mir/pkg/availability/multisigcollector/internal/parts/batchreconstruction" "github.com/filecoin-project/mir/pkg/availability/multisigcollector/internal/parts/certcreation" @@ -18,9 +20,13 @@ type ModuleParams = common.ModuleParams // NewModule creates a new instance of the multisig collector module. // Multisig collector is the simplest implementation of the availability layer. // Whenever an availability certificate is requested, it pulls a batch from the mempool module, -// sends it to all replicas and collects a quorum (i.e., more than (N+F)/2) of signatures confirming that +// sends it to all replicas and collects params.F+1 signatures confirming that // other nodes have persistently stored the batch. -func NewModule(mc *ModuleConfig, params *ModuleParams, nodeID t.NodeID) modules.PassiveModule { +func NewModule(mc *ModuleConfig, params *ModuleParams, nodeID t.NodeID) (modules.PassiveModule, error) { + if 2*params.F+1 < len(params.AllNodes) { + return nil, fmt.Errorf("cannot tolerate %v / %v failures", params.F, len(params.AllNodes)) + } + m := dsl.NewModule(mc.Self) commonState := &common.State{ @@ -32,5 +38,5 @@ func NewModule(mc *ModuleConfig, params *ModuleParams, nodeID t.NodeID) modules. certverification.IncludeVerificationOfCertificates(m, mc, params, nodeID, commonState) batchreconstruction.IncludeBatchReconstruction(m, mc, params, nodeID, commonState) - return m + return m, nil }