You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.8 KiB
180 lines
4.8 KiB
11 months ago
|
package quorum
|
||
|
|
||
|
import (
|
||
|
"math/big"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
bls_core "github.com/harmony-one/bls/ffi/go/bls"
|
||
|
"github.com/harmony-one/harmony/consensus/votepower"
|
||
|
"github.com/harmony-one/harmony/crypto/bls"
|
||
|
shardingconfig "github.com/harmony-one/harmony/internal/configs/sharding"
|
||
|
"github.com/harmony-one/harmony/multibls"
|
||
|
"github.com/harmony-one/harmony/numeric"
|
||
|
"github.com/harmony-one/harmony/shard"
|
||
|
)
|
||
|
|
||
|
var _ Decider = threadSafeDeciderImpl{}
|
||
|
|
||
|
type threadSafeDeciderImpl struct {
|
||
|
mu *sync.RWMutex
|
||
|
decider Decider
|
||
|
}
|
||
|
|
||
|
func NewThreadSafeDecider(decider Decider, mu *sync.RWMutex) Decider {
|
||
|
return threadSafeDeciderImpl{
|
||
|
mu: mu,
|
||
|
decider: decider,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) String() string {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.String()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) Participants() multibls.PublicKeys {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.Participants()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) IndexOf(key bls.SerializedPublicKey) int {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.IndexOf(key)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) ParticipantsCount() int64 {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.ParticipantsCount()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) NthNextValidator(slotList shard.SlotList, pubKey *bls.PublicKeyWrapper, next int) (bool, *bls.PublicKeyWrapper) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.NthNextValidator(slotList, pubKey, next)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) NthNextHmy(instance shardingconfig.Instance, pubkey *bls.PublicKeyWrapper, next int) (bool, *bls.PublicKeyWrapper) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.NthNextHmy(instance, pubkey, next)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) NthNextHmyExt(instance shardingconfig.Instance, wrapper *bls.PublicKeyWrapper, i int) (bool, *bls.PublicKeyWrapper) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.NthNextHmyExt(instance, wrapper, i)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) FirstParticipant(instance shardingconfig.Instance) *bls.PublicKeyWrapper {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.FirstParticipant(instance)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) UpdateParticipants(pubKeys, allowlist []bls.PublicKeyWrapper) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
a.decider.UpdateParticipants(pubKeys, allowlist)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) submitVote(p Phase, pubkeys []bls.SerializedPublicKey, sig *bls_core.Sign, headerHash common.Hash, height, viewID uint64) (*votepower.Ballot, error) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.submitVote(p, pubkeys, sig, headerHash, height, viewID)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) SignersCount(phase Phase) int64 {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.SignersCount(phase)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) reset(phases []Phase) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
a.decider.reset(phases)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) ReadBallot(p Phase, pubkey bls.SerializedPublicKey) *votepower.Ballot {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.ReadBallot(p, pubkey)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) TwoThirdsSignersCount() int64 {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.TwoThirdsSignersCount()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) AggregateVotes(p Phase) *bls_core.Sign {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.AggregateVotes(p)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) SetVoters(subCommittee *shard.Committee, epoch *big.Int) (*TallyResult, error) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.SetVoters(subCommittee, epoch)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) Policy() Policy {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.Policy()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) AddNewVote(p Phase, pubkeys []*bls.PublicKeyWrapper, sig *bls_core.Sign, headerHash common.Hash, height, viewID uint64) (*votepower.Ballot, error) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.AddNewVote(p, pubkeys, sig, headerHash, height, viewID)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) IsQuorumAchievedByMask(mask *bls.Mask) bool {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.IsQuorumAchievedByMask(mask)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) QuorumThreshold() numeric.Dec {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.QuorumThreshold()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) IsAllSigsCollected() bool {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.IsAllSigsCollected()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) ResetPrepareAndCommitVotes() {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
a.decider.ResetPrepareAndCommitVotes()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) ResetViewChangeVotes() {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
a.decider.ResetViewChangeVotes()
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) CurrentTotalPower(p Phase) (*numeric.Dec, error) {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.CurrentTotalPower(p)
|
||
|
}
|
||
|
|
||
|
func (a threadSafeDeciderImpl) IsQuorumAchieved(p Phase) bool {
|
||
|
a.mu.Lock()
|
||
|
defer a.mu.Unlock()
|
||
|
return a.decider.IsQuorumAchieved(p)
|
||
|
}
|