Skip to content

Commit

Permalink
move getRewardsAccumulated API to governance namespace and refine the…
Browse files Browse the repository at this point in the history
… name of governanceAPI struct
  • Loading branch information
aidan-kwon committed May 17, 2023
1 parent 49470f2 commit 0d777b1
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 76 deletions.
10 changes: 5 additions & 5 deletions api/api_ethereum.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ type EthereumAPI struct {
publicBlockChainAPI *PublicBlockChainAPI
publicTransactionPoolAPI *PublicTransactionPoolAPI
publicAccountAPI *PublicAccountAPI
publicGovernanceAPI *governance.PublicGovernanceAPI
governanceAPI *governance.GovernanceAPI
}

// NewEthereumAPI creates a new ethereum API.
Expand Down Expand Up @@ -112,15 +112,15 @@ func (api *EthereumAPI) SetPublicAccountAPI(publicAccountAPI *PublicAccountAPI)
api.publicAccountAPI = publicAccountAPI
}

// SetPublicGovernanceAPI sets publicGovernanceAPI
func (api *EthereumAPI) SetPublicGovernanceAPI(publicGovernanceAPI *governance.PublicGovernanceAPI) {
api.publicGovernanceAPI = publicGovernanceAPI
// SetGovernanceAPI sets governanceAPI
func (api *EthereumAPI) SetGovernanceAPI(governanceAPI *governance.GovernanceAPI) {
api.governanceAPI = governanceAPI
}

// Etherbase is the address of operating node.
// Unlike Ethereum, it only returns the node address because Klaytn does not have a POW mechanism.
func (api *EthereumAPI) Etherbase() (common.Address, error) {
return api.publicGovernanceAPI.NodeAddress(), nil
return api.governanceAPI.NodeAddress(), nil
}

// Coinbase is the address of operating node (alias for Etherbase).
Expand Down
2 changes: 1 addition & 1 deletion api/api_ethereum_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func testNodeAddress(t *testing.T, testAPIName string) {
nodeAddress := crypto.PubkeyToAddress(key.PublicKey)
gov.SetNodeAddress(nodeAddress)

api := EthereumAPI{publicGovernanceAPI: governance.NewGovernanceAPI(gov)}
api := EthereumAPI{governanceAPI: governance.NewGovernanceAPI(gov)}
results := reflect.ValueOf(&api).MethodByName(testAPIName).Call([]reflect.Value{})
result, ok := results[0].Interface().(common.Address)
assert.True(t, ok)
Expand Down
14 changes: 7 additions & 7 deletions console/web3ext/web3ext.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,13 @@ web3._extend({
call: 'governance_getChainConfig',
params: 1,
inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter]
})
}),
new web3._extend.Method({
name: 'getRewardsAccumulated',
call: 'governance_getRewardsAccumulated',
params: 3,
inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.formatters.inputBlockNumberFormatter, null],
}),
],
properties: [
new web3._extend.Property({
Expand Down Expand Up @@ -904,12 +910,6 @@ web3._extend({
params: 1,
inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter],
}),
new web3._extend.Method({
name: 'getRewardsAccumulated',
call: 'klay_getRewardsAccumulated',
params: 3,
inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.formatters.inputBlockNumberFormatter, null],
}),
new web3._extend.Method({
name: 'getStakingInfo',
call: 'klay_getStakingInfo',
Expand Down
121 changes: 62 additions & 59 deletions governance/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
"github.com/klaytn/klaytn/reward"
)

type PublicGovernanceAPI struct {
type GovernanceAPI struct {
governance Engine // Node interfaced by this API
}

Expand All @@ -42,8 +42,8 @@ type returnTally struct {
ApprovalPercentage float64
}

func NewGovernanceAPI(gov Engine) *PublicGovernanceAPI {
return &PublicGovernanceAPI{governance: gov}
func NewGovernanceAPI(gov Engine) *GovernanceAPI {
return &GovernanceAPI{governance: gov}
}

type GovernanceKlayAPI struct {
Expand All @@ -66,6 +66,20 @@ var (
errInvalidUpperBound = errors.New("upperboundbasefee cannot be set lower than lowerboundbasefee")
)

func (api *GovernanceKlayAPI) ChainConfig() *params.ChainConfig {
num := rpc.LatestBlockNumber
return getChainConfig(api.governance, &num)
}

// TODO-Klaytn-Mantle: deprecate this
func (api *GovernanceKlayAPI) ChainConfigAt(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

func (api *GovernanceKlayAPI) GetChainConfig(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

func (api *GovernanceKlayAPI) GetStakingInfo(num *rpc.BlockNumber) (*reward.StakingInfo, error) {
return getStakingInfo(api.governance, num)
}
Expand Down Expand Up @@ -148,15 +162,36 @@ func (api *GovernanceKlayAPI) GetRewards(num *rpc.BlockNumber) (*reward.RewardSp
return reward.GetBlockReward(header, rules, rewardParamSet)
}

type accumulatedRewards struct {
Period uint `json:"period"`
FirstBlockTime string `json:"firstBlockTime"`
LastBlockTime string `json:"lastBlockTime"`
FirstBlock *big.Int `json:"firstBlock"`
LastBlock *big.Int `json:"lastBlock"`

// TotalMinted + TotalTxFee - TotalBurntTxFee = TotalProposerRewards + TotalStakingRewards + TotalKFFRewards + TotalKCFRewards
TotalMinted *big.Int `json:"totalMinted"`
TotalTxFee *big.Int `json:"totalTxFee"`
TotalBurntTxFee *big.Int `json:"totalBurntTxFee"`
TotalProposerRewards *big.Int `json:"totalProposerRewards"`
TotalStakingRewards *big.Int `json:"totalStakingRewards"`
TotalKFFRewards *big.Int `json:"totalKFFRewards"`
TotalKCFRewards *big.Int `json:"totalKCFRewards"`
Rewards map[common.Address]*big.Int `json:"rewards"`
}

// GetRewardsAccumulated returns accumulated rewards data in the range of [start, end).
// The given block range is divided into many accumulation periods with a given period parameter.
func (api *GovernanceKlayAPI) GetRewardsAccumulated(start rpc.BlockNumber, end rpc.BlockNumber, period uint64) ([]accumulatedRewards, error) {
func (api *GovernanceAPI) GetRewardsAccumulated(start rpc.BlockNumber, end rpc.BlockNumber, period uint64) ([]accumulatedRewards, error) {
type request struct {
period uint64
blockNum uint64
}

currentBlock := api.chain.CurrentBlock().NumberU64()
blockchain := api.governance.BlockChain()
govKlayAPI := NewGovernanceKlayAPI(api.governance, blockchain)

currentBlock := blockchain.CurrentBlock().NumberU64()

startBlock := currentBlock
if start >= rpc.EarliestBlockNumber {
Expand Down Expand Up @@ -206,7 +241,7 @@ func (api *GovernanceKlayAPI) GetRewardsAccumulated(start rpc.BlockNumber, end r
// the minimum digit of request is period to avoid current access to an accArray item
for req := range reqCh {
bn := rpc.BlockNumber(req.blockNum)
blockReward, err := api.GetRewards(&bn)
blockReward, err := govKlayAPI.GetRewards(&bn)
if err != nil {
errCh <- err
return
Expand Down Expand Up @@ -235,15 +270,15 @@ func (api *GovernanceKlayAPI) GetRewardsAccumulated(start rpc.BlockNumber, end r
}

// write the information of the period starting block
header := api.chain.GetHeaderByNumber(periodStart)
header := blockchain.GetHeaderByNumber(periodStart)
if header == nil {
return nil, fmt.Errorf("the block does not exist (block number: %d)", periodStart)
}
accArray[periodIdx].FirstBlock = header.Number
accArray[periodIdx].FirstBlockTime = time.Unix(header.Time.Int64(), 0).String()

// write the information of the period ending block
header = api.chain.GetHeaderByNumber(periodEnd - 1) // the periodEnd block is not included
header = blockchain.GetHeaderByNumber(periodEnd - 1) // the periodEnd block is not included
if header == nil {
return nil, fmt.Errorf("the block does not exist (block number: %d)", periodEnd-1)
}
Expand Down Expand Up @@ -285,40 +320,8 @@ func (api *GovernanceKlayAPI) GetRewardsAccumulated(start rpc.BlockNumber, end r
return accArray, nil
}

type accumulatedRewards struct {
Period uint `json:"period"`
FirstBlockTime string `json:"firstBlockTime"`
LastBlockTime string `json:"lastBlockTime"`
FirstBlock *big.Int `json:"firstBlock"`
LastBlock *big.Int `json:"lastBlock"`

// TotalMinted + TotalTxFee - TotalBurntTxFee = TotalProposerRewards + TotalStakingRewards + TotalKFFRewards + TotalKCFRewards
TotalMinted *big.Int `json:"totalMinted"`
TotalTxFee *big.Int `json:"totalTxFee"`
TotalBurntTxFee *big.Int `json:"totalBurntTxFee"`
TotalProposerRewards *big.Int `json:"totalProposerRewards"`
TotalStakingRewards *big.Int `json:"totalStakingRewards"`
TotalKFFRewards *big.Int `json:"totalKFFRewards"`
TotalKCFRewards *big.Int `json:"totalKCFRewards"`
Rewards map[common.Address]*big.Int `json:"rewards"`
}

func (api *GovernanceKlayAPI) ChainConfig() *params.ChainConfig {
num := rpc.LatestBlockNumber
return getChainConfig(api.governance, &num)
}

// TODO-Klaytn-Mantle: deprecate this
func (api *GovernanceKlayAPI) ChainConfigAt(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

func (api *GovernanceKlayAPI) GetChainConfig(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

// Vote injects a new vote for governance targets such as unitprice and governingnode.
func (api *PublicGovernanceAPI) Vote(key string, val interface{}) (string, error) {
func (api *GovernanceAPI) Vote(key string, val interface{}) (string, error) {
blockNumber := api.governance.BlockChain().CurrentBlock().NumberU64()
pset, err := api.governance.EffectiveParams(blockNumber + 1)
if err != nil {
Expand Down Expand Up @@ -355,7 +358,7 @@ func (api *PublicGovernanceAPI) Vote(key string, val interface{}) (string, error
return "", errInvalidKeyValue
}

func (api *PublicGovernanceAPI) isRemovingSelf(val string) bool {
func (api *GovernanceAPI) isRemovingSelf(val string) bool {
for _, str := range strings.Split(val, ",") {
str = strings.Trim(str, " ")
if common.HexToAddress(str) == api.governance.NodeAddress() {
Expand All @@ -365,7 +368,7 @@ func (api *PublicGovernanceAPI) isRemovingSelf(val string) bool {
return false
}

func (api *PublicGovernanceAPI) ShowTally() []*returnTally {
func (api *GovernanceAPI) ShowTally() []*returnTally {
ret := []*returnTally{}

for _, val := range api.governance.GetGovernanceTalliesCopy() {
Expand All @@ -380,19 +383,19 @@ func (api *PublicGovernanceAPI) ShowTally() []*returnTally {
return ret
}

func (api *PublicGovernanceAPI) TotalVotingPower() (float64, error) {
func (api *GovernanceAPI) TotalVotingPower() (float64, error) {
if !api.isGovernanceModeBallot() {
return 0, errNotAvailableInThisMode
}
return float64(api.governance.TotalVotingPower()) / 1000.0, nil
}

// TODO-Klaytn-Mantle: deprecate this
func (api *PublicGovernanceAPI) ItemsAt(num *rpc.BlockNumber) (map[string]interface{}, error) {
func (api *GovernanceAPI) ItemsAt(num *rpc.BlockNumber) (map[string]interface{}, error) {
return getParams(api.governance, num)
}

func (api *PublicGovernanceAPI) GetParams(num *rpc.BlockNumber) (map[string]interface{}, error) {
func (api *GovernanceAPI) GetParams(num *rpc.BlockNumber) (map[string]interface{}, error) {
return getParams(api.governance, num)
}

Expand All @@ -411,7 +414,7 @@ func getParams(governance Engine, num *rpc.BlockNumber) (map[string]interface{},
return pset.StrMap(), nil
}

func (api *PublicGovernanceAPI) GetStakingInfo(num *rpc.BlockNumber) (*reward.StakingInfo, error) {
func (api *GovernanceAPI) GetStakingInfo(num *rpc.BlockNumber) (*reward.StakingInfo, error) {
return getStakingInfo(api.governance, num)
}

Expand All @@ -425,24 +428,24 @@ func getStakingInfo(governance Engine, num *rpc.BlockNumber) (*reward.StakingInf
return reward.GetStakingInfo(blockNumber), nil
}

func (api *PublicGovernanceAPI) PendingChanges() map[string]interface{} {
func (api *GovernanceAPI) PendingChanges() map[string]interface{} {
return api.governance.PendingChanges()
}

func (api *PublicGovernanceAPI) Votes() []GovernanceVote {
func (api *GovernanceAPI) Votes() []GovernanceVote {
return api.governance.Votes()
}

func (api *PublicGovernanceAPI) IdxCache() []uint64 {
func (api *GovernanceAPI) IdxCache() []uint64 {
return api.governance.IdxCache()
}

func (api *PublicGovernanceAPI) IdxCacheFromDb() []uint64 {
func (api *GovernanceAPI) IdxCacheFromDb() []uint64 {
return api.governance.IdxCacheFromDb()
}

// TODO-Klaytn: Return error if invalid input is given such as pending or a too big number
func (api *PublicGovernanceAPI) ItemCacheFromDb(num *rpc.BlockNumber) map[string]interface{} {
func (api *GovernanceAPI) ItemCacheFromDb(num *rpc.BlockNumber) map[string]interface{} {
blockNumber := uint64(0)
if num == nil || *num == rpc.LatestBlockNumber || *num == rpc.PendingBlockNumber {
blockNumber = api.governance.BlockChain().CurrentBlock().NumberU64()
Expand All @@ -460,7 +463,7 @@ type VoteList struct {
BlockNum uint64
}

func (api *PublicGovernanceAPI) MyVotes() []*VoteList {
func (api *GovernanceAPI) MyVotes() []*VoteList {
ret := []*VoteList{}

for k, v := range api.governance.GetVoteMapCopy() {
Expand All @@ -476,24 +479,24 @@ func (api *PublicGovernanceAPI) MyVotes() []*VoteList {
return ret
}

func (api *PublicGovernanceAPI) MyVotingPower() (float64, error) {
func (api *GovernanceAPI) MyVotingPower() (float64, error) {
if !api.isGovernanceModeBallot() {
return 0, errNotAvailableInThisMode
}
return float64(api.governance.MyVotingPower()) / 1000.0, nil
}

func (api *PublicGovernanceAPI) ChainConfig() *params.ChainConfig {
func (api *GovernanceAPI) ChainConfig() *params.ChainConfig {
num := rpc.LatestBlockNumber
return getChainConfig(api.governance, &num)
}

// TODO-Klaytn-Mantle: deprecate this
func (api *PublicGovernanceAPI) ChainConfigAt(num *rpc.BlockNumber) *params.ChainConfig {
func (api *GovernanceAPI) ChainConfigAt(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

func (api *PublicGovernanceAPI) GetChainConfig(num *rpc.BlockNumber) *params.ChainConfig {
func (api *GovernanceAPI) GetChainConfig(num *rpc.BlockNumber) *params.ChainConfig {
return getChainConfig(api.governance, num)
}

Expand Down Expand Up @@ -524,11 +527,11 @@ func getChainConfig(governance Engine, num *rpc.BlockNumber) *params.ChainConfig
return config
}

func (api *PublicGovernanceAPI) NodeAddress() common.Address {
func (api *GovernanceAPI) NodeAddress() common.Address {
return api.governance.NodeAddress()
}

func (api *PublicGovernanceAPI) isGovernanceModeBallot() bool {
func (api *GovernanceAPI) isGovernanceModeBallot() bool {
blockNumber := api.governance.BlockChain().CurrentBlock().NumberU64()
pset, err := api.governance.EffectiveParams(blockNumber + 1)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion governance/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func newTestBlockchain(config *params.ChainConfig) *testBlockChain {
}
}

func newTestGovernanceApi() *PublicGovernanceAPI {
func newTestGovernanceApi() *GovernanceAPI {
config := params.CypressChainConfig
config.Governance.KIP71 = params.GetDefaultKIP71Config()
govApi := NewGovernanceAPI(NewMixedEngine(config, database.NewMemoryDBManager()))
Expand Down
6 changes: 3 additions & 3 deletions node/cn/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,13 +489,13 @@ func (s *CN) APIs() []rpc.API {

publicFilterAPI := filters.NewPublicFilterAPI(s.APIBackend, false)
governanceKlayAPI := governance.NewGovernanceKlayAPI(s.governance, s.blockchain)
publicGovernanceAPI := governance.NewGovernanceAPI(s.governance)
governanceAPI := governance.NewGovernanceAPI(s.governance)
publicDownloaderAPI := downloader.NewPublicDownloaderAPI(s.protocolManager.Downloader(), s.eventMux)
privateDownloaderAPI := downloader.NewPrivateDownloaderAPI(s.protocolManager.Downloader())

ethAPI.SetPublicFilterAPI(publicFilterAPI)
ethAPI.SetGovernanceKlayAPI(governanceKlayAPI)
ethAPI.SetPublicGovernanceAPI(publicGovernanceAPI)
ethAPI.SetGovernanceAPI(governanceAPI)

var tracerAPI *tracers.API
if s.config.DisableUnsafeDebug {
Expand Down Expand Up @@ -560,7 +560,7 @@ func (s *CN) APIs() []rpc.API {
}, {
Namespace: "governance",
Version: "1.0",
Service: governance.NewGovernanceAPI(s.governance),
Service: governanceAPI,
Public: true,
}, {
Namespace: "klay",
Expand Down

0 comments on commit 0d777b1

Please sign in to comment.