58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package policies
|
|
|
|
import (
|
|
"math"
|
|
|
|
cb "github.com/hyperledger/fabric-protos-go/common"
|
|
mspa "github.com/hyperledger/fabric-protos-go/msp"
|
|
"github.com/hyperledger/fabric/common/policydsl"
|
|
"github.com/hyperledger/fabric/protoutil"
|
|
)
|
|
|
|
const (
|
|
BlockValidationPolicyKey = "BlockValidation"
|
|
)
|
|
|
|
func EncodeBFTBlockVerificationPolicy(consenterProtos []*cb.Consenter, ordererGroup *cb.ConfigGroup) {
|
|
n := len(consenterProtos)
|
|
f := (n - 1) / 3
|
|
|
|
var identities []*mspa.MSPPrincipal
|
|
var pols []*cb.SignaturePolicy
|
|
for i, consenter := range consenterProtos {
|
|
pols = append(pols, &cb.SignaturePolicy{
|
|
Type: &cb.SignaturePolicy_SignedBy{
|
|
SignedBy: int32(i),
|
|
},
|
|
})
|
|
identities = append(identities, &mspa.MSPPrincipal{
|
|
PrincipalClassification: mspa.MSPPrincipal_IDENTITY,
|
|
Principal: protoutil.MarshalOrPanic(&mspa.SerializedIdentity{Mspid: consenter.MspId, IdBytes: consenter.Identity}),
|
|
})
|
|
}
|
|
|
|
quorumSize := ComputeBFTQuorum(n, f)
|
|
sp := &cb.SignaturePolicyEnvelope{
|
|
Rule: policydsl.NOutOf(int32(quorumSize), pols),
|
|
Identities: identities,
|
|
}
|
|
ordererGroup.Policies[BlockValidationPolicyKey] = &cb.ConfigPolicy{
|
|
// Inherit modification policy
|
|
ModPolicy: ordererGroup.Policies[BlockValidationPolicyKey].ModPolicy,
|
|
Policy: &cb.Policy{
|
|
Type: int32(cb.Policy_SIGNATURE),
|
|
Value: protoutil.MarshalOrPanic(sp),
|
|
},
|
|
}
|
|
}
|
|
|
|
func ComputeBFTQuorum(totalNodes, faultyNodes int) int {
|
|
return int(math.Ceil(float64(totalNodes+faultyNodes+1) / 2))
|
|
}
|