aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-03-20 21:27:26 +0800
committerWei-Ning Huang <w@dexon.org>2019-04-09 21:32:58 +0800
commit86eb10fc5f853507baafde992b81647d41f2a587 (patch)
tree3ecefbf887e6d1b4efb02c2deac36ebb36125de1
parentf247ebfcdb76160006f0124ff881e1e2a36e547e (diff)
downloaddexon-86eb10fc5f853507baafde992b81647d41f2a587.tar
dexon-86eb10fc5f853507baafde992b81647d41f2a587.tar.gz
dexon-86eb10fc5f853507baafde992b81647d41f2a587.tar.bz2
dexon-86eb10fc5f853507baafde992b81647d41f2a587.tar.lz
dexon-86eb10fc5f853507baafde992b81647d41f2a587.tar.xz
dexon-86eb10fc5f853507baafde992b81647d41f2a587.tar.zst
dexon-86eb10fc5f853507baafde992b81647d41f2a587.zip
core: vm: deny duplicate public key from registering (#289)
-rw-r--r--core/vm/oracle_contracts.go14
-rw-r--r--core/vm/oracle_contracts_test.go7
2 files changed, 20 insertions, 1 deletions
diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go
index b9525e00b..f999cc6b1 100644
--- a/core/vm/oracle_contracts.go
+++ b/core/vm/oracle_contracts.go
@@ -1597,7 +1597,19 @@ func (g *GovernanceContract) register(
value := g.contract.Value()
offset := g.state.NodesOffsetByAddress(caller)
- // Can not stake if already staked.
+ // Can not register if already registered.
+ if offset.Cmp(big.NewInt(0)) >= 0 {
+ return nil, errExecutionReverted
+ }
+
+ nodeKeyAddr, err := publicKeyToNodeKeyAddress(publicKey)
+ if err != nil {
+ return nil, errExecutionReverted
+ }
+
+ offset = g.state.NodesOffsetByNodeKeyAddress(nodeKeyAddr)
+
+ // Can not register if node key is duplicate.
if offset.Cmp(big.NewInt(0)) >= 0 {
return nil, errExecutionReverted
}
diff --git a/core/vm/oracle_contracts_test.go b/core/vm/oracle_contracts_test.go
index 55876f9b2..5a9250ee5 100644
--- a/core/vm/oracle_contracts_test.go
+++ b/core/vm/oracle_contracts_test.go
@@ -344,6 +344,13 @@ func (g *OracleContractsTestSuite) TestStakingMechanism() {
_, err = g.call(GovernanceContractAddress, addr, input, amount)
g.Require().Error(err)
+ // Duplicate public key should fail
+ _, addrDup := newPrefundAccount(g.stateDB)
+ input, err = GovernanceABI.ABI.Pack("register", pk, "Test1", "test1@dexon.org", "Taipei", "https://dexon.org")
+ g.Require().NoError(err)
+ _, err = g.call(GovernanceContractAddress, addrDup, input, amount)
+ g.Require().Error(err)
+
// Stake more to qualify.
input, err = GovernanceABI.ABI.Pack("stake")
g.Require().NoError(err)