aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-04-04 10:33:55 +0800
committerWei-Ning Huang <w@byzantine-lab.io>2019-06-15 22:09:55 +0800
commit8bb384eb28d4aceba63b8077f664381fb3c06444 (patch)
treee0608b62d06234df27786c7e2de78c6758463a6a /core
parent83967112258e35425dae4aa943404ee76a36f591 (diff)
downloadgo-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar.gz
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar.bz2
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar.lz
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar.xz
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.tar.zst
go-tangerine-8bb384eb28d4aceba63b8077f664381fb3c06444.zip
core: vm: cache GPK to prevent DoS (#335)
Cache GPK so one can not slow the chain down with the ProposeCRS method call.
Diffstat (limited to 'core')
-rw-r--r--core/vm/oracle_contracts.go19
1 files changed, 18 insertions, 1 deletions
diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go
index 10459a870..c63c750a3 100644
--- a/core/vm/oracle_contracts.go
+++ b/core/vm/oracle_contracts.go
@@ -24,6 +24,7 @@ import (
"math"
"math/big"
"sort"
+ "sync/atomic"
"github.com/dexon-foundation/dexon/accounts/abi"
"github.com/dexon-foundation/dexon/common"
@@ -1248,16 +1249,32 @@ type GovernanceContract struct {
// defaultCoreDKGUtils implements coreDKGUtils.
type defaultCoreDKGUtils struct {
+ gpk atomic.Value
}
func (c *defaultCoreDKGUtils) NewGroupPublicKey(
state *GovernanceState, round *big.Int, threshold int) (tsigVerifierIntf, error) {
+ var gpk *dkgTypes.GroupPublicKey
+ var err error
+
+ v := c.gpk.Load()
+ if v != nil {
+ gpk = v.(*dkgTypes.GroupPublicKey)
+ if gpk.Round == round.Uint64() {
+ return gpk, nil
+ }
+ }
// Prepare DKGMasterPublicKeys.
mpks := state.DKGMasterPublicKeyItems()
comps := state.DKGComplaintItems()
- return dkgTypes.NewGroupPublicKey(round.Uint64(), mpks, comps, threshold)
+ gpk, err = dkgTypes.NewGroupPublicKey(round.Uint64(), mpks, comps, threshold)
+ if err != nil {
+ return nil, err
+ }
+ c.gpk.Store(gpk)
+ return gpk, nil
}
func (g *GovernanceContract) Address() common.Address {