diff --git a/examples/gno.land/r/system/validators/admin.gno b/examples/gno.land/r/system/validators/admin.gno new file mode 100644 index 00000000000..770901199bd --- /dev/null +++ b/examples/gno.land/r/system/validators/admin.gno @@ -0,0 +1,20 @@ +package validators + +import ( + "std" +) + +var ( + adminAddr = std.Address("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") +) + +func assertIsAdmin() { + caller := std.GetOrigCaller() + if !isAdmin(caller) { + panic("access restricted.") + } +} + +func isAdmin(addr std.Address) bool { + return addr == adminAddr +} diff --git a/examples/gno.land/r/system/validators/public.gno b/examples/gno.land/r/system/validators/public.gno index 01485e8a401..fb96dec3e7d 100644 --- a/examples/gno.land/r/system/validators/public.gno +++ b/examples/gno.land/r/system/validators/public.gno @@ -6,24 +6,19 @@ import ( "gno.land/p/demo/ufmt" ) +// CreateValidator creates a new validator with the given name and public key func CreateValidator(name, pubkey string) { std.AssertOriginCall() - if validators.Size() >= maxValidators { - panic("validator set is full") - } - caller := std.GetOrigCaller() vkey := validatorKey(caller) if validators.Has(vkey) { panic("validator already registered") } - power := std.GetOrigSend().AmountOf(nativeDenom) - + var power int64 = 0 // when created validator, power is 0, admin must confirm this validator is active or not validator := newValidator(name, caller, pubkey, power) validators.Set(vkey, validator) - } func RemoveValidator() { @@ -37,26 +32,32 @@ func RemoveValidator() { validators.Remove(vkey) } -func UpdateMaxValidators(max int) { - std.AssertOriginCall() - caller := std.GetOrigCaller() - if caller != admin { - panic("unauthorized") - } +// UpdateValidatorPower updates the power of the given validator by admins +func UpdateValidatorPower(addr std.Address, power int64) { + assertIsAdmin() + vkey := validatorKey(addr) - maxValidators = max + v, ok := validators.Get(vkey) + if !ok { + panic("validator not found") + } + v.(*Validator).power = power } +// ValidatorSet returns the current active validator set func ValidatorSet() string { output := "" colon := "" validators.Iterate("", "", func(key string, value interface{}) bool { validator := value.(*Validator) + if validator.power == 0 { + return false + } + output = output + colon + ufmt.Sprintf("%s:%d", validator.pubkey, validator.power) colon = "," return false }) - return output } diff --git a/examples/gno.land/r/system/validators/render.gno b/examples/gno.land/r/system/validators/render.gno index d14dcbf0061..1399c29a3c8 100644 --- a/examples/gno.land/r/system/validators/render.gno +++ b/examples/gno.land/r/system/validators/render.gno @@ -6,10 +6,10 @@ import ( func Render(path string) string { output := "" - output += ufmt.Sprintf("## Validators: (%d / %d)\n", validators.Size(), maxValidators) + output += ufmt.Sprintf("## Validators: (%d)\n", validators.Size()) output += "\n" - output += "| Name | Address | VotingPower |\n" - output += "| ---- | ------- | ----------- |\n" + output += "| Name | Address | Pubkey | VotingPower |\n" + output += "| ---- | ------- | ------ | ----------- |\n" validators.Iterate("", "", func(key string, value interface{}) bool { v := value.(*Validator) diff --git a/examples/gno.land/r/system/validators/validator.gno b/examples/gno.land/r/system/validators/validator.gno index 7bb537eb1ea..22d30230c2f 100644 --- a/examples/gno.land/r/system/validators/validator.gno +++ b/examples/gno.land/r/system/validators/validator.gno @@ -8,9 +8,9 @@ import ( type Validator struct { name string - address std.Address - pubkey string - power int64 + address std.Address // owner address + pubkey string // node pubkey(id) + power int64 // voting power } func newValidator(name string, address std.Address, pubkey string, power int64) *Validator { @@ -18,6 +18,6 @@ func newValidator(name string, address std.Address, pubkey string, power int64) } func (v Validator) Render() string { - format := "|%s|%s|%d|" - return ufmt.Sprintf(format, v.name, v.address, v.power) + format := "|%s|%s|%s|%d|" + return ufmt.Sprintf(format, v.name, v.address, v.pubkey, v.power) } diff --git a/examples/gno.land/r/system/validators/validators.gno b/examples/gno.land/r/system/validators/validators.gno index 344779165d6..c30c1f84945 100644 --- a/examples/gno.land/r/system/validators/validators.gno +++ b/examples/gno.land/r/system/validators/validators.gno @@ -11,12 +11,6 @@ var ( validators = avl.NewTree() // addr -> *Validator ) -var ( - maxValidators = 20 - nativeDenom = "ugnot" - admin = std.Address("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") -) - func validatorKey(addr std.Address) string { return addr.String() }