Skip to content

Commit

Permalink
go/registry: Refactor registry stake thresholds and claims
Browse files Browse the repository at this point in the history
  • Loading branch information
kostko committed Feb 11, 2020
1 parent a5172fb commit 119616f
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 47 deletions.
2 changes: 1 addition & 1 deletion go/consensus/tendermint/apps/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ func (app *registryApplication) onRegistryEpochChanged(ctx *abci.Context, regist

// Remove the stake claim for the given node.
if !params.DebugBypassStake {
if err = stakeAcc.RemoveStakeClaim(node.EntityID, stakeClaimForNode(node.ID)); err != nil {
if err = stakeAcc.RemoveStakeClaim(node.EntityID, registry.StakeClaimForNode(node.ID)); err != nil {
return fmt.Errorf("registry: onRegistryEpochChanged: couldn't remove stake claim: %w", err)
}
}
Expand Down
52 changes: 6 additions & 46 deletions go/consensus/tendermint/apps/registry/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ package registry
import (
"fmt"

"github.com/oasislabs/oasis-core/go/common"
"github.com/oasislabs/oasis-core/go/common/cbor"
"github.com/oasislabs/oasis-core/go/common/crypto/signature"
"github.com/oasislabs/oasis-core/go/common/entity"
"github.com/oasislabs/oasis-core/go/common/node"
"github.com/oasislabs/oasis-core/go/consensus/tendermint/abci"
Expand All @@ -16,20 +14,6 @@ import (
staking "github.com/oasislabs/oasis-core/go/staking/api"
)

const (
claimRegisterEntity = "registry.RegisterEntity"
claimRegisterNode = "registry.RegisterNode.%s"
claimRegisterRuntime = "registry.RegisterRuntime.%s"
)

func stakeClaimForNode(id signature.PublicKey) staking.StakeClaim {
return staking.StakeClaim(fmt.Sprintf(claimRegisterNode, id))
}

func stakeClaimForRuntime(id common.Namespace) staking.StakeClaim {
return staking.StakeClaim(fmt.Sprintf(claimRegisterRuntime, id))
}

func (app *registryApplication) registerEntity(
ctx *abci.Context,
state *registryState.MutableState,
Expand Down Expand Up @@ -67,7 +51,7 @@ func (app *registryApplication) registerEntity(
}

if !params.DebugBypassStake {
if err = stakingState.AddStakeClaim(ctx, ent.ID, claimRegisterEntity, []staking.ThresholdKind{staking.KindEntity}); err != nil {
if err = stakingState.AddStakeClaim(ctx, ent.ID, registry.StakeClaimRegisterEntity, []staking.ThresholdKind{staking.KindEntity}); err != nil {
ctx.Logger().Error("RegisterEntity: Insufficent stake",
"err", err,
"id", ent.ID,
Expand Down Expand Up @@ -141,7 +125,7 @@ func (app *registryApplication) deregisterEntity(ctx *abci.Context, state *regis
}

if !params.DebugBypassStake {
if err = stakingState.RemoveStakeClaim(ctx, id, claimRegisterEntity); err != nil {
if err = stakingState.RemoveStakeClaim(ctx, id, registry.StakeClaimRegisterEntity); err != nil {
panic(fmt.Errorf("DeregisterEntity: failed to remove stake claim: %w", err))
}
}
Expand Down Expand Up @@ -320,20 +304,8 @@ func (app *registryApplication) registerNode( // nolint: gocyclo
return fmt.Errorf("failed to create stake accumulator cache: %w", err)
}

claim := stakeClaimForNode(newNode.ID)
var thresholds []staking.ThresholdKind
if newNode.HasRoles(node.RoleKeyManager) {
thresholds = append(thresholds, staking.KindNodeKeyManager)
}
if newNode.HasRoles(node.RoleComputeWorker) {
thresholds = append(thresholds, staking.KindNodeCompute)
}
if newNode.HasRoles(node.RoleStorageWorker) {
thresholds = append(thresholds, staking.KindNodeStorage)
}
if newNode.HasRoles(node.RoleValidator) {
thresholds = append(thresholds, staking.KindNodeValidator)
}
claim := registry.StakeClaimForNode(newNode.ID)
thresholds := registry.StakeThresholdsForNode(newNode)

if err = stakeAcc.AddStakeClaim(newNode.EntityID, claim, thresholds); err != nil {
ctx.Logger().Error("RegisterNode: insufficient stake for new node",
Expand Down Expand Up @@ -609,20 +581,8 @@ func (app *registryApplication) registerRuntime( // nolint: gocyclo

// Make sure that the entity has enough stake.
if !params.DebugBypassStake {
claim := stakeClaimForRuntime(rt.ID)
var thresholds []staking.ThresholdKind
switch rt.Kind {
case registry.KindCompute:
thresholds = append(thresholds, staking.KindRuntimeCompute)
case registry.KindKeyManager:
thresholds = append(thresholds, staking.KindRuntimeKeyManager)
default:
ctx.Logger().Error("RegisterRuntime: unknown runtime kind",
"runtime_id", rt.ID,
"kind", rt.Kind,
)
return fmt.Errorf("registry: unknown runtime kind (%d)", rt.Kind)
}
claim := registry.StakeClaimForRuntime(rt.ID)
thresholds := registry.StakeThresholdsForRuntime(rt)

if err = stakingState.AddStakeClaim(ctx, rt.EntityID, claim, thresholds); err != nil {
ctx.Logger().Error("RegisterRuntime: Insufficent stake",
Expand Down
49 changes: 49 additions & 0 deletions go/registry/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/oasislabs/oasis-core/go/common/sgx/ias"
"github.com/oasislabs/oasis-core/go/consensus/api/transaction"
epochtime "github.com/oasislabs/oasis-core/go/epochtime/api"
staking "github.com/oasislabs/oasis-core/go/staking/api"
)

// ModuleName is a unique module name for the registry module.
Expand Down Expand Up @@ -1285,3 +1286,51 @@ var DefaultGasCosts = transaction.Costs{
GasOpRuntimeEpochMaintenance: 1000,
GasOpUpdateKeyManager: 1000,
}

const (
// StakeClaimRegisterEntity is the stake claim identifier used for registering an entity.
StakeClaimRegisterEntity = "registry.RegisterEntity"
// StakeClaimRegisterNode is the stake claim template used for registering nodes.
StakeClaimRegisterNode = "registry.RegisterNode.%s"
// StakeClaimRegisterRuntime is the stake claim template used for registering runtimes.
StakeClaimRegisterRuntime = "registry.RegisterRuntime.%s"
)

// StakeClaimForNode generates a new stake claim identifier for a specific node registration.
func StakeClaimForNode(id signature.PublicKey) staking.StakeClaim {
return staking.StakeClaim(fmt.Sprintf(StakeClaimRegisterNode, id))
}

// StakeClaimForRuntime generates a new stake claim for a specific runtime registration.
func StakeClaimForRuntime(id common.Namespace) staking.StakeClaim {
return staking.StakeClaim(fmt.Sprintf(StakeClaimRegisterRuntime, id))
}

// StakeThresholdsForNode returns the staking thresholds for the given node.
func StakeThresholdsForNode(n *node.Node) (thresholds []staking.ThresholdKind) {
if n.HasRoles(node.RoleKeyManager) {
thresholds = append(thresholds, staking.KindNodeKeyManager)
}
if n.HasRoles(node.RoleComputeWorker) {
thresholds = append(thresholds, staking.KindNodeCompute)
}
if n.HasRoles(node.RoleStorageWorker) {
thresholds = append(thresholds, staking.KindNodeStorage)
}
if n.HasRoles(node.RoleValidator) {
thresholds = append(thresholds, staking.KindNodeValidator)
}
return
}

// StakeThresholdsForRuntime returns the staking thresholds for the given runtime.
func StakeThresholdsForRuntime(rt *Runtime) (thresholds []staking.ThresholdKind) {
switch rt.Kind {
case KindCompute:
thresholds = append(thresholds, staking.KindRuntimeCompute)
case KindKeyManager:
thresholds = append(thresholds, staking.KindRuntimeKeyManager)
default:
}
return
}

0 comments on commit 119616f

Please sign in to comment.