aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/oracle_contracts.go
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-04-04 10:33:55 +0800
committerWei-Ning Huang <w@dexon.org>2019-04-09 21:32:59 +0800
commitd52097c148c5247be8e346c8eca3c3cfc8fdd770 (patch)
tree577e129ddc2ee59676bbc890316d7501e7388e42 /core/vm/oracle_contracts.go
parentb8eb11fc1ecba52c05ea150cf77217e61bb16c55 (diff)
downloaddexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.gz
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.bz2
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.lz
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.xz
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.zst
dexon-d52097c148c5247be8e346c8eca3c3cfc8fdd770.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/vm/oracle_contracts.go')
-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 a698b87f1..06b9c2a89 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"
@@ -1250,16 +1251,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 {