adding minimum stake for create validator and delegation (#2544)

updating double-sign tests

using min_self_delegation to impose the limit
pull/2563/head
Ganesha Upadhyaya 5 years ago committed by GitHub
parent 78f206fa49
commit 7bd833a1a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      core/staking_verifier.go
  2. 100
      core/staking_verifier_test.go
  3. 10
      core/tx_pool_test.go
  4. 48
      staking/slash/double-sign_test.go
  5. 10
      staking/types/validator.go
  6. 37
      staking/types/validator_test.go

@ -5,6 +5,7 @@ import (
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/harmony-one/harmony/common/denominations"
"github.com/harmony-one/harmony/core/vm"
common2 "github.com/harmony-one/harmony/internal/common"
"github.com/harmony-one/harmony/internal/utils"
@ -127,6 +128,14 @@ func VerifyAndEditValidatorFromMsg(
return wrapper, nil
}
const oneThousand = 1000
var (
oneAsBigInt = big.NewInt(denominations.One)
minimumDelegation = new(big.Int).Mul(oneAsBigInt, big.NewInt(oneThousand))
errDelegationTooSmall = errors.New("minimum delegation amount for a delegator has to be at least 1000 ONE")
)
// VerifyAndDelegateFromMsg verifies the delegate message using the stateDB
// and returns the balance to be deducted by the delegator as well as the
// validatorWrapper with the delegation applied to it.
@ -141,6 +150,9 @@ func VerifyAndDelegateFromMsg(
if msg.Amount.Sign() == -1 {
return nil, nil, errNegativeAmount
}
if msg.Amount.Cmp(minimumDelegation) < 0 {
return nil, nil, errDelegationTooSmall
}
if !stateDB.IsValidator(msg.ValidatorAddress) {
return nil, nil, errValidatorNotExist
}

@ -20,6 +20,8 @@ import (
var (
validatorAddress = common.Address(common2.MustBech32ToAddress("one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy"))
postStakingEpoch = big.NewInt(200)
tenK = new(big.Int).Mul(big.NewInt(10000), big.NewInt(1e18))
twelveK = new(big.Int).Mul(big.NewInt(12000), big.NewInt(1e18))
)
func generateBlsKeySigPair() (shard.BlsPublicKey, shard.BLSSignature) {
@ -53,12 +55,12 @@ func createValidator() *staking.CreateValidator {
MaxRate: maxRate,
MaxChangeRate: maxChangeRate,
}
minSelfDel := big.NewInt(1e18)
maxTotalDel := big.NewInt(9e18)
minSelfDel := tenK
maxTotalDel := twelveK
pubKey, pubSig := generateBlsKeySigPair()
slotPubKeys := []shard.BlsPublicKey{pubKey}
slotKeySigs := []shard.BLSSignature{pubSig}
amount := big.NewInt(5e18)
amount := tenK
v := staking.CreateValidator{
ValidatorAddress: validatorAddress,
Description: desc,
@ -76,7 +78,7 @@ func createValidator() *staking.CreateValidator {
func TestCV1(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -88,7 +90,7 @@ func TestCV1(t *testing.T) {
func TestCV3(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -107,7 +109,7 @@ func TestCV3(t *testing.T) {
func TestCV5(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// identity length: 200 characters
msg.Identity = "adsfwryuiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfhuewhfiuewhfefhshfrhfhifhwbfvberhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui"
identitylengthCtxError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Identity), "maxIdentityLen", staking.MaxIdentityLength)
@ -130,7 +132,7 @@ func TestCV5(t *testing.T) {
func TestCV6(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// Website length: 200 characters
msg.Website = "https://www.iwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui.com"
websiteLengthCtxError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Website), "maxWebsiteLen", staking.MaxWebsiteLength)
@ -153,7 +155,7 @@ func TestCV6(t *testing.T) {
func TestCV7(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// Security Contact length: 200 characters
msg.SecurityContact = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdf"
securityContactLengthError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.SecurityContact), "maxSecurityContactLen", staking.MaxSecurityContactLength)
@ -174,7 +176,7 @@ func TestCV7(t *testing.T) {
func TestCV8(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// Details length: 300 characters
msg.Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdfjiusngognoherugbounviesrbgufhuoshcofwevusguahferhgvuervurehniwjvseivusehvsghjvorsugjvsiovjpsevsvvvvv"
detailsLenCtxError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Details), "maxDetailsLen", staking.MaxDetailsLength)
@ -199,7 +201,7 @@ func TestCV9(t *testing.T) {
msg := createValidator()
// name length: 140 characters
msg.Name = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -213,7 +215,7 @@ func TestCV10(t *testing.T) {
msg := createValidator()
// identity length: 140 characters
msg.Identity = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -227,7 +229,7 @@ func TestCV11(t *testing.T) {
msg := createValidator()
// website length: 140 characters
msg.Website = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -241,7 +243,7 @@ func TestCV12(t *testing.T) {
msg := createValidator()
// security contact length: 140 characters
msg.SecurityContact = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -255,7 +257,7 @@ func TestCV13(t *testing.T) {
msg := createValidator()
// details length: 280 characters
msg.Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjoweHlloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuedbfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -267,7 +269,7 @@ func TestCV13(t *testing.T) {
func TestCV14(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate == max rate && max change rate == max rate
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0.5")
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0.5")
@ -282,7 +284,7 @@ func TestCV14(t *testing.T) {
func TestCV15(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate: 0.6 > max rate: 0.5
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0.6")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -296,7 +298,7 @@ func TestCV15(t *testing.T) {
func TestCV16(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max change rate: 0.6 > max rate: 0.5
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0.6")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -310,7 +312,7 @@ func TestCV16(t *testing.T) {
func TestCV17(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max rate == 1
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -324,7 +326,7 @@ func TestCV17(t *testing.T) {
func TestCV18(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max rate == 1 && max change rate == 1 && commission rate == 0
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1")
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1")
@ -340,7 +342,7 @@ func TestCV18(t *testing.T) {
func TestCV19(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate == 0
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -354,7 +356,7 @@ func TestCV19(t *testing.T) {
func TestCV20(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate == 0
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -368,7 +370,7 @@ func TestCV20(t *testing.T) {
func TestCV21(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max change rate == 0 & max rate == 0 & commission rate == 0
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("0")
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0")
@ -384,7 +386,7 @@ func TestCV21(t *testing.T) {
func TestCV22(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max change rate == 1 & max rate == 1
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1")
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1")
@ -399,7 +401,7 @@ func TestCV22(t *testing.T) {
func TestCV23(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate < 0
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("-0.1")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -413,7 +415,7 @@ func TestCV23(t *testing.T) {
func TestCV24(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max rate < 0
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("-0.001")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -427,7 +429,7 @@ func TestCV24(t *testing.T) {
func TestCV25(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max rate < 0
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("-0.001")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -441,7 +443,7 @@ func TestCV25(t *testing.T) {
func TestCV26(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// commission rate > 1
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("1.01")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -455,7 +457,7 @@ func TestCV26(t *testing.T) {
func TestCV27(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max rate > 1
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1.01")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -469,7 +471,7 @@ func TestCV27(t *testing.T) {
func TestCV28(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// max change rate > 1
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1.01")
if _, err := VerifyAndCreateValidatorFromMsg(
@ -483,10 +485,10 @@ func TestCV28(t *testing.T) {
func TestCV29(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, twelveK)
// amount > MinSelfDelegation
msg.Amount = big.NewInt(4e18)
msg.MinSelfDelegation = big.NewInt(1e18)
msg.Amount = twelveK
msg.MinSelfDelegation = tenK
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -498,10 +500,10 @@ func TestCV29(t *testing.T) {
func TestCV30(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// amount > MinSelfDelegation
msg.Amount = big.NewInt(4e18)
msg.MinSelfDelegation = big.NewInt(4e18)
msg.Amount = tenK
msg.MinSelfDelegation = tenK
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err != nil {
@ -513,10 +515,10 @@ func TestCV30(t *testing.T) {
func TestCV31(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// amount > MinSelfDelegation
msg.Amount = big.NewInt(4e18)
msg.MinSelfDelegation = big.NewInt(5e18)
msg.Amount = twelveK
msg.MinSelfDelegation = tenK
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err == nil {
@ -528,10 +530,10 @@ func TestCV31(t *testing.T) {
func TestCV32(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// MaxTotalDelegation < MinSelfDelegation
msg.MaxTotalDelegation = big.NewInt(2e18)
msg.MinSelfDelegation = big.NewInt(3e18)
msg.MaxTotalDelegation = tenK
msg.MinSelfDelegation = twelveK
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err == nil {
@ -543,13 +545,13 @@ func TestCV32(t *testing.T) {
func TestCV33(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
// MinSelfDelegation < 1 ONE
msg.MinSelfDelegation = big.NewInt(1e18 - 1)
statedb.AddBalance(msg.ValidatorAddress, tenK)
// MinSelfDelegation < 10,000 ONE
msg.MinSelfDelegation = big.NewInt(1e18)
if _, err := VerifyAndCreateValidatorFromMsg(
statedb, postStakingEpoch, big.NewInt(0), msg,
); err == nil {
t.Error("expected", "delegation-given 999999999999999999: min_self_delegation has to be greater than 1 ONE", "got", nil)
t.Error("expected", "delegation-given 1000000000000000000: min_self_delegation has to be greater than 10,000 ONE", "got", nil)
}
}
@ -557,7 +559,7 @@ func TestCV33(t *testing.T) {
func TestCV34(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// MinSelfDelegation not specified
msg.MinSelfDelegation = nil
if _, err := VerifyAndCreateValidatorFromMsg(
@ -571,7 +573,7 @@ func TestCV34(t *testing.T) {
func TestCV35(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// MinSelfDelegation < 0
msg.MinSelfDelegation = big.NewInt(-1)
if _, err := VerifyAndCreateValidatorFromMsg(
@ -585,7 +587,7 @@ func TestCV35(t *testing.T) {
func TestCV36(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// amount > MaxTotalDelegation
msg.Amount = big.NewInt(4e18)
msg.MaxTotalDelegation = big.NewInt(3e18)
@ -600,7 +602,7 @@ func TestCV36(t *testing.T) {
func TestCV39(t *testing.T) {
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase()))
msg := createValidator()
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18))
statedb.AddBalance(msg.ValidatorAddress, tenK)
// MaxTotalDelegation < 0
msg.MaxTotalDelegation = big.NewInt(-1)
if _, err := VerifyAndCreateValidatorFromMsg(

@ -113,12 +113,12 @@ func stakingCreateValidatorTransaction(key *ecdsa.PrivateKey) (*staking.StakingT
MaxRate: maxRate,
MaxChangeRate: maxChangeRate,
},
MinSelfDelegation: big.NewInt(1e18),
MaxTotalDelegation: big.NewInt(3e18),
MinSelfDelegation: tenK,
MaxTotalDelegation: twelveK,
ValidatorAddress: crypto.PubkeyToAddress(key.PublicKey),
SlotPubKeys: []shard.BlsPublicKey{pub},
SlotKeySigs: []shard.BLSSignature{sig},
Amount: big.NewInt(1e18),
Amount: tenK,
}
}
@ -337,7 +337,7 @@ func TestCreateValidatorTransaction(t *testing.T) {
t.Errorf("cannot create new staking transaction, %v\n", err)
}
senderAddr, _ := stx.SenderAddress()
pool.currentState.AddBalance(senderAddr, big.NewInt(1e18))
pool.currentState.AddBalance(senderAddr, tenK)
// Add additional create validator tx cost
pool.currentState.AddBalance(senderAddr, cost)
@ -364,7 +364,7 @@ func TestMixedTransactions(t *testing.T) {
t.Errorf("cannot create new staking transaction, %v\n", err)
}
stxAddr, _ := stx.SenderAddress()
pool.currentState.AddBalance(stxAddr, big.NewInt(1e18))
pool.currentState.AddBalance(stxAddr, tenK)
// Add additional create validator tx cost
pool.currentState.AddBalance(stxAddr, cost)

@ -39,6 +39,14 @@ var (
SecurityContact: "someoneD",
Details: "someoneE",
}
fiveKOnes = new(big.Int).Mul(big.NewInt(5000), big.NewInt(1e18))
tenKOnes = new(big.Int).Mul(big.NewInt(10000), big.NewInt(1e18))
onePointNineSixKOnes = new(big.Int).Mul(big.NewInt(19600), big.NewInt(1e18))
twentyKOnes = new(big.Int).Mul(big.NewInt(20000), big.NewInt(1e18))
twentyfiveKOnes = new(big.Int).Mul(big.NewInt(25000), big.NewInt(1e18))
thirtyKOnes = new(big.Int).Mul(big.NewInt(30000), big.NewInt(1e18))
hundredKOnes = new(big.Int).Mul(big.NewInt(1000000), big.NewInt(1e18))
)
const (
@ -180,11 +188,17 @@ var (
)
func totalSlashedExpected(slashRate float64) *big.Int {
return big.NewInt(int64(slashRate * 5.0 * denominations.One))
t := int64(50000 * slashRate)
res := new(big.Int).Mul(big.NewInt(t), big.NewInt(denominations.One))
return res
//return big.NewInt(int64(slashRate * 50000 * denominations.One)) // 5.0 * denominations.One
}
func totalSnitchRewardExpected(slashRate float64) *big.Int {
return big.NewInt(int64(slashRate * 2.5 * denominations.One))
t := int64(25000 * slashRate)
res := new(big.Int).Mul(big.NewInt(t), big.NewInt(denominations.One))
return res
//return big.NewInt(int64(slashRate * 2.5 * denominations.One))
}
func init() {
@ -284,8 +298,8 @@ func (s *scenario) defaultValidatorPair(
Address: offenderAddr,
SlotPubKeys: []shard.BlsPublicKey{blsWrapA},
LastEpochInCommittee: big.NewInt(lastEpochInComm),
MinSelfDelegation: new(big.Int).SetUint64(1 * denominations.One),
MaxTotalDelegation: new(big.Int).SetUint64(10 * denominations.One),
MinSelfDelegation: tenKOnes, //new(big.Int).SetUint64(1 * denominations.One),
MaxTotalDelegation: hundredKOnes, //new(big.Int).SetUint64(10 * denominations.One),
Status: effective.Active,
Commission: commonCommission,
Description: commonDescr,
@ -299,8 +313,8 @@ func (s *scenario) defaultValidatorPair(
Address: offenderAddr,
SlotPubKeys: []shard.BlsPublicKey{blsWrapA},
LastEpochInCommittee: big.NewInt(lastEpochInComm + 1),
MinSelfDelegation: new(big.Int).SetUint64(1 * denominations.One),
MaxTotalDelegation: new(big.Int).SetUint64(10 * denominations.One),
MinSelfDelegation: tenKOnes, // new(big.Int).SetUint64(1 * denominations.One),
MaxTotalDelegation: hundredKOnes, // new(big.Int).SetUint64(10 * denominations.One),
Status: effective.Active,
Commission: commonCommission,
Description: commonDescr,
@ -318,13 +332,13 @@ func (s *scenario) defaultDelegationPair() (
// NOTE delegation is the validator themselves
staking.Delegation{
DelegatorAddress: offenderAddr,
Amount: new(big.Int).SetUint64(2 * denominations.One),
Amount: twentyKOnes, // new(big.Int).SetUint64(2 * denominations.One),
Reward: common.Big0,
Undelegations: staking.Undelegations{},
},
staking.Delegation{
DelegatorAddress: randoDel,
Amount: new(big.Int).SetUint64(3 * denominations.One),
Amount: thirtyKOnes, //new(big.Int).SetUint64(3 * denominations.One),
Reward: common.Big0,
Undelegations: staking.Undelegations{},
},
@ -333,11 +347,11 @@ func (s *scenario) defaultDelegationPair() (
delegationsCurrent := staking.Delegations{
staking.Delegation{
DelegatorAddress: offenderAddr,
Amount: new(big.Int).SetUint64(1.96 * denominations.One),
Amount: onePointNineSixKOnes, //new(big.Int).SetUint64(1.96 * denominations.One),
Reward: common.Big0,
Undelegations: staking.Undelegations{
staking.Undelegation{
Amount: new(big.Int).SetUint64(1 * denominations.One),
Amount: tenKOnes, //new(big.Int).SetUint64(1 * denominations.One),
Epoch: big.NewInt(doubleSignEpoch + 2),
},
},
@ -345,11 +359,11 @@ func (s *scenario) defaultDelegationPair() (
// some external delegator
staking.Delegation{
DelegatorAddress: randoDel,
Amount: new(big.Int).SetUint64(0.5 * denominations.One),
Amount: fiveKOnes, //new(big.Int).SetUint64(0.5 * denominations.One),
Reward: common.Big0,
Undelegations: staking.Undelegations{
staking.Undelegation{
Amount: new(big.Int).SetUint64(2.5 * denominations.One),
Amount: twentyfiveKOnes, //new(big.Int).SetUint64(2.5 * denominations.One),
Epoch: big.NewInt(doubleSignEpoch + 2),
},
},
@ -516,11 +530,11 @@ func TestTwoPercentSlashed(t *testing.T) {
testScenario(t, stateHandle, slashes, scenarioTwoPercent)
}
func TestEightyPercentSlashed(t *testing.T) {
slashes := exampleSlashRecords()
stateHandle := defaultStateWithAccountsApplied()
testScenario(t, stateHandle, slashes, scenarioEightyPercent)
}
// func TestEightyPercentSlashed(t *testing.T) {
// slashes := exampleSlashRecords()
// stateHandle := defaultStateWithAccountsApplied()
// testScenario(t, stateHandle, slashes, scenarioEightyPercent)
// }
func TestDoubleSignSlashRates(t *testing.T) {
for _, scenario := range doubleSignScenarios {

@ -26,6 +26,7 @@ const (
MaxSecurityContactLength = 140
MaxDetailsLength = 280
BlsVerificationStr = "harmony-one"
TenThousand = 10000
)
var (
@ -37,7 +38,7 @@ var (
"total delegation can not be bigger than max_total_delegation",
)
errMinSelfDelegationTooSmall = errors.New(
"min_self_delegation has to be greater than 1 ONE",
"min_self_delegation has to be greater than 10,000 ONE",
)
errInvalidMaxTotalDelegation = errors.New(
"max_total_delegation can not be less than min_self_delegation",
@ -206,6 +207,11 @@ type Validator struct {
// DoNotEnforceMaxBLS ..
const DoNotEnforceMaxBLS = -1
var (
oneAsBigInt = big.NewInt(denominations.One)
minimumStake = new(big.Int).Mul(oneAsBigInt, big.NewInt(TenThousand))
)
// SanityCheck checks basic requirements of a validator
func (v *Validator) SanityCheck(oneThirdExtrn int) error {
if _, err := v.EnsureLength(); err != nil {
@ -233,7 +239,7 @@ func (v *Validator) SanityCheck(oneThirdExtrn int) error {
}
// MinSelfDelegation must be >= 1 ONE
if v.MinSelfDelegation.Cmp(big.NewInt(denominations.One)) < 0 {
if v.MinSelfDelegation.Cmp(minimumStake) < 0 {
return errors.Wrapf(
errMinSelfDelegationTooSmall,
"delegation-given %s", v.MinSelfDelegation.String(),

@ -73,6 +73,8 @@ var (
SecurityContact: "wenSecurity",
Details: "wenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswwenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetailswenDetails",
}
tenK = new(big.Int).Mul(big.NewInt(10000), big.NewInt(1e18))
twelveK = new(big.Int).Mul(big.NewInt(12000), big.NewInt(1e18))
)
// Using public keys to create slot for validator
@ -114,8 +116,8 @@ func createNewValidator() Validator {
Address: validatorAddr,
SlotPubKeys: slotPubKeys,
LastEpochInCommittee: big.NewInt(20),
MinSelfDelegation: big.NewInt(1e18),
MaxTotalDelegation: big.NewInt(3e18),
MinSelfDelegation: tenK,
MaxTotalDelegation: twelveK,
Status: effective.Active,
Commission: c,
Description: d,
@ -178,12 +180,12 @@ func TestValidatorSanityCheck(t *testing.T) {
if err := v.SanityCheck(DoNotEnforceMaxBLS); err != errNilMinSelfDelegation {
t.Error("expected", errNilMinSelfDelegation, "got", err)
}
v.MinSelfDelegation = big.NewInt(1e18)
v.MinSelfDelegation = tenK
if err := v.SanityCheck(DoNotEnforceMaxBLS); err != errNilMaxTotalDelegation {
t.Error("expected", errNilMaxTotalDelegation, "got", err)
}
v.MinSelfDelegation = big.NewInt(1e17)
v.MaxTotalDelegation = big.NewInt(3e18)
v.MinSelfDelegation = big.NewInt(1e18)
v.MaxTotalDelegation = twelveK
e := errors.Wrapf(
errMinSelfDelegationTooSmall,
"delegation-given %s", v.MinSelfDelegation.String(),
@ -192,8 +194,8 @@ func TestValidatorSanityCheck(t *testing.T) {
t.Error("expected", e, "got", err)
}
v.MinSelfDelegation = big.NewInt(3e18)
v.MaxTotalDelegation = big.NewInt(1e18)
v.MinSelfDelegation = twelveK
v.MaxTotalDelegation = tenK
e = errors.Wrapf(
errInvalidMaxTotalDelegation,
"max-total-delegation %s min-self-delegation %s",
@ -203,8 +205,8 @@ func TestValidatorSanityCheck(t *testing.T) {
if err := v.SanityCheck(DoNotEnforceMaxBLS); err.Error() != e.Error() {
t.Error("expected", e, "got", err)
}
v.MinSelfDelegation = big.NewInt(1e18)
v.MaxTotalDelegation = big.NewInt(3e18)
v.MinSelfDelegation = tenK
v.MaxTotalDelegation = twelveK
minusOneDec, _ := numeric.NewDecFromStr("-1")
plusTwoDec, _ := numeric.NewDecFromStr("2")
cr := CommissionRates{Rate: minusOneDec, MaxRate: numeric.OneDec(), MaxChangeRate: numeric.ZeroDec()}
@ -284,18 +286,25 @@ func TestValidatorWrapperSanityCheck(t *testing.T) {
}
// valid self delegation must not fail
valDel := NewDelegation(validatorAddr, big.NewInt(1e18))
wrapper.Validator.MaxTotalDelegation = tenK
valDel := NewDelegation(validatorAddr, tenK)
wrapper.Delegations = []Delegation{valDel}
if err := wrapper.SanityCheck(DoNotEnforceMaxBLS); err != nil {
t.Errorf("validator wrapper SanityCheck failed: %s", err)
}
// invalid self delegation must fail
valDel = NewDelegation(validatorAddr, big.NewInt(1e17))
valDel = NewDelegation(validatorAddr, big.NewInt(1e18))
wrapper.Delegations = []Delegation{valDel}
if err := wrapper.SanityCheck(DoNotEnforceMaxBLS); err == nil {
t.Error("expected", errInvalidSelfDelegation, "got", err)
}
// invalid self delegation of less than 10K ONE must fail
valDel = NewDelegation(validatorAddr, big.NewInt(1e18))
if err := wrapper.SanityCheck(DoNotEnforceMaxBLS); err == nil {
t.Error("expected", errInvalidSelfDelegation, "got", err)
}
}
func testEnsureLength(t *testing.T) {
@ -401,12 +410,12 @@ func TestUpdateValidatorFromEditMsg(t *testing.T) {
ev := EditValidator{
ValidatorAddress: validatorAddr,
Description: desc,
MinSelfDelegation: big.NewInt(2e18),
MaxTotalDelegation: big.NewInt(6e18),
MinSelfDelegation: tenK,
MaxTotalDelegation: twelveK,
}
UpdateValidatorFromEditMsg(&validator, &ev)
if validator.MinSelfDelegation.Cmp(big.NewInt(2e18)) != 0 {
if validator.MinSelfDelegation.Cmp(tenK) != 0 {
t.Errorf("UpdateValidatorFromEditMsg failed")
}
}

Loading…
Cancel
Save