diff options
author | Wei-Ning Huang <w@dexon.org> | 2019-04-04 10:33:55 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:59 +0800 |
commit | d52097c148c5247be8e346c8eca3c3cfc8fdd770 (patch) | |
tree | 577e129ddc2ee59676bbc890316d7501e7388e42 /core | |
parent | b8eb11fc1ecba52c05ea150cf77217e61bb16c55 (diff) | |
download | go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.gz go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.bz2 go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.lz go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.xz go-tangerine-d52097c148c5247be8e346c8eca3c3cfc8fdd770.tar.zst go-tangerine-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')
-rw-r--r-- | core/vm/oracle_contracts.go | 19 |
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 { |