Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kaiax/staking: Replace StakingManager #110

Merged
merged 12 commits into from
Oct 24, 2024
2 changes: 1 addition & 1 deletion api/api_ethereum_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func testNodeAddress(t *testing.T, testAPIName string) {
nodeAddress := crypto.PubkeyToAddress(key.PublicKey)
gov.SetNodeAddress(nodeAddress)

api := EthereumAPI{governanceAPI: governance.NewGovernanceAPI(gov)}
api := EthereumAPI{governanceAPI: governance.NewGovernanceAPI(gov, nil)}
results := reflect.ValueOf(&api).MethodByName(testAPIName).Call([]reflect.Value{})
result, ok := results[0].Interface().(common.Address)
assert.True(t, ok)
Expand Down
19 changes: 14 additions & 5 deletions consensus/istanbul/backend/backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,15 @@ import (
"testing"
"time"

"github.com/golang/mock/gomock"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/consensus/istanbul"
"github.com/kaiachain/kaia/consensus/istanbul/validator"
"github.com/kaiachain/kaia/crypto"
"github.com/kaiachain/kaia/governance"
"github.com/kaiachain/kaia/kaiax/staking/mock"
"github.com/kaiachain/kaia/params"
"github.com/kaiachain/kaia/reward"
"github.com/kaiachain/kaia/storage/database"
)

Expand Down Expand Up @@ -938,8 +939,9 @@ func TestCheckValidatorSignature(t *testing.T) {

func TestCommit(t *testing.T) {
backend := newTestBackend()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
backend.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

commitCh := make(chan *types.Block)
// Case: it's a proposer, so the backend.commit will receive channel result from backend.Commit function
Expand All @@ -954,6 +956,7 @@ func TestCommit(t *testing.T) {
[][]byte{append([]byte{1}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-1)...)},
func() *types.Block {
chain, engine := newBlockChain(1)
engine.RegisterStakingModule(mStaking)
defer engine.Stop()

block := makeBlockWithoutSeal(chain, engine, chain.Genesis())
Expand All @@ -967,6 +970,7 @@ func TestCommit(t *testing.T) {
nil,
func() *types.Block {
chain, engine := newBlockChain(1)
engine.RegisterStakingModule(mStaking)
defer engine.Stop()

block := makeBlockWithoutSeal(chain, engine, chain.Genesis())
Expand Down Expand Up @@ -1010,8 +1014,13 @@ func TestCommit(t *testing.T) {
func TestGetProposer(t *testing.T) {
chain, engine := newBlockChain(1)
defer engine.Stop()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)

si := makeTestStakingInfo(nil, 0)
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
mStaking := mock.NewMockStakingModule(mockCtrl)
mStaking.EXPECT().GetStakingInfo(gomock.Any()).Return(si, nil).AnyTimes()
engine.RegisterStakingModule(mStaking)

block := makeBlock(chain, engine, chain.Genesis())
_, err := chain.InsertChain(types.Blocks{block})
Expand Down
9 changes: 7 additions & 2 deletions consensus/istanbul/backend/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,12 @@ func (sb *backend) Finalize(chain consensus.ChainReader, header *types.Header, s
logger.Trace(logMsg, "header.Number", header.Number.Uint64(), "node address", sb.address, "rewardbase", header.Rewardbase)
}

rewardSpec, err = reward.CalcDeferredReward(header, txs, receipts, rules, pset)
// Temporary patch to use kaiax/staking + weightedCouncil
si, siErr := sb.stakingModule.GetStakingInfo(header.Number.Uint64())
if siErr != nil {
return nil, siErr
}
rewardSpec, err = reward.CalcDeferredReward(header, txs, receipts, rules, pset, reward.FromKaiax(si))
} else {
rewardSpec, err = reward.CalcDeferredRewardSimple(header, txs, receipts, rules, pset)
}
Expand Down Expand Up @@ -969,7 +974,7 @@ func (sb *backend) snapshot(chain consensus.ChainReader, number uint64, hash com
if err != nil {
return nil, err
}
snap, err = snap.apply(headers, sb.governance, sb.address, pset.Policy(), chain, writable)
snap, err = snap.apply(headers, sb.governance, sb.address, pset.Policy(), chain, sb.stakingModule, writable)
if err != nil {
return nil, err
}
Expand Down
116 changes: 70 additions & 46 deletions consensus/istanbul/backend/engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"testing"
"time"

"github.com/golang/mock/gomock"
"github.com/kaiachain/kaia/blockchain"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/blockchain/vm"
Expand All @@ -41,8 +42,9 @@ import (
"github.com/kaiachain/kaia/consensus/istanbul"
"github.com/kaiachain/kaia/consensus/istanbul/core"
"github.com/kaiachain/kaia/crypto"
"github.com/kaiachain/kaia/kaiax/staking"
"github.com/kaiachain/kaia/kaiax/staking/mock"
"github.com/kaiachain/kaia/params"
"github.com/kaiachain/kaia/reward"
"github.com/kaiachain/kaia/rlp"
"github.com/stretchr/testify/assert"
)
Expand Down Expand Up @@ -300,8 +302,9 @@ func TestPrepare(t *testing.T) {
func TestSealStopChannel(t *testing.T) {
chain, engine := newBlockChain(4)
defer engine.Stop()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

block := makeBlockWithoutSeal(chain, engine, chain.Genesis())
stop := make(chan struct{}, 1)
Expand Down Expand Up @@ -332,8 +335,9 @@ func TestSealStopChannel(t *testing.T) {
func TestSealCommitted(t *testing.T) {
chain, engine := newBlockChain(1)
defer engine.Stop()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

block := makeBlockWithoutSeal(chain, engine, chain.Genesis())
expectedBlock, _ := engine.updateBlock(block)
Expand Down Expand Up @@ -413,8 +417,9 @@ func TestVerifyHeader(t *testing.T) {
func TestVerifySeal(t *testing.T) {
chain, engine := newBlockChain(1)
defer engine.Stop()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

genesis := chain.Genesis()

Expand Down Expand Up @@ -451,9 +456,9 @@ func TestVerifySeal(t *testing.T) {
func TestVerifyHeaders(t *testing.T) {
chain, engine := newBlockChain(1)
defer engine.Stop()

oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

genesis := chain.Genesis()

Expand Down Expand Up @@ -759,37 +764,48 @@ func makeSnapshotTestConfigItems(stakingInterval, proposerInterval uint64) []int
}
}

func makeMockStakingManager(t *testing.T, amounts []uint64, blockNum uint64) (*gomock.Controller, *mock.MockStakingModule) {
si := makeTestStakingInfo(amounts, blockNum)

mockCtrl := gomock.NewController(t)
mStaking := mock.NewMockStakingModule(mockCtrl)
mStaking.EXPECT().GetStakingInfo(gomock.Any()).Return(si, nil).AnyTimes()
return mockCtrl, mStaking
ian0371 marked this conversation as resolved.
Show resolved Hide resolved
}

// Set StakingInfo with given amount for nodeKeys. If amounts == nil, set to 0 amounts.
// Returns the original (old) StakingManager. Call `reward.SetTestStakingManager(oldStakingManager)`
func setTestStakingInfo(amounts []uint64) *reward.StakingManager {
func setTestStakingInfo(t *testing.T, b *backend, amounts []uint64, blockNum uint64) *gomock.Controller {
if amounts == nil {
amounts = make([]uint64, len(nodeKeys))
}
si := makeTestStakingInfo(amounts, blockNum)

stakingInfo := stakingInfo(amounts, 0)

// Save old StakingManager, overwrite to the fake one.
oldStakingManager := reward.GetStakingManager()
reward.SetTestStakingManagerWithStakingInfoCache(stakingInfo)
return oldStakingManager
mockCtrl := gomock.NewController(t)
mStaking := mock.NewMockStakingModule(mockCtrl)
mStaking.EXPECT().GetStakingInfo(gomock.Any()).Return(si, nil).AnyTimes()
b.RegisterStakingModule(mStaking)
return mockCtrl
}

func stakingInfo(amounts []uint64, blockNum uint64) *reward.StakingInfo {
stakingInfo := &reward.StakingInfo{
BlockNum: blockNum,
func makeTestStakingInfo(amounts []uint64, blockNum uint64) *staking.StakingInfo {
if amounts == nil {
amounts = make([]uint64, len(nodeKeys))
}
si := &staking.StakingInfo{
SourceBlockNum: blockNum,
}
for idx, key := range nodeKeys {
addr := crypto.PubkeyToAddress(key.PublicKey)

pk, _ := crypto.GenerateKey()
rewardAddr := crypto.PubkeyToAddress(pk.PublicKey)

stakingInfo.CouncilNodeAddrs = append(stakingInfo.CouncilNodeAddrs, addr)
stakingInfo.CouncilStakingAddrs = append(stakingInfo.CouncilStakingAddrs, addr)
stakingInfo.CouncilStakingAmounts = append(stakingInfo.CouncilStakingAmounts, amounts[idx])
stakingInfo.CouncilRewardAddrs = append(stakingInfo.CouncilRewardAddrs, rewardAddr)
si.NodeIds = append(si.NodeIds, addr)
si.StakingContracts = append(si.StakingContracts, addr)
si.RewardAddrs = append(si.RewardAddrs, rewardAddr)
si.StakingAmounts = append(si.StakingAmounts, amounts[idx])
}
return stakingInfo
return si
}

func toAddressList(validators []istanbul.Validator) []common.Address {
Expand Down Expand Up @@ -923,7 +939,8 @@ func TestSnapshot_Validators_AfterMinimumStakingVotes(t *testing.T) {

for _, tc := range testcases {
chain, engine := newBlockChain(4, configItems...)
oldStakingManager := setTestStakingInfo(tc.stakingAmounts)
mockCtrl, mStaking := makeMockStakingManager(t, tc.stakingAmounts, 0)
engine.RegisterStakingModule(mStaking)

var previousBlock, currentBlock *types.Block = nil, chain.Genesis()

Expand Down Expand Up @@ -968,7 +985,7 @@ func TestSnapshot_Validators_AfterMinimumStakingVotes(t *testing.T) {
}
}

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand Down Expand Up @@ -1031,11 +1048,12 @@ func TestSnapshot_Validators_AfterKaia_BasedOnStaking(t *testing.T) {
configItems = append(configItems, istanbulCompatibleBlock(new(big.Int).SetUint64(0)))
}
chain, engine := newBlockChain(testNum, configItems...)
// Save old StakingManager, overwrite to the fake one.
oldStakingManager := reward.GetStakingManager()
reward.SetTestStakingManagerWithChain(chain, engine.governance, nil)
reward.AddTestStakingInfoToCache(stakingInfo(genesisStakingAmounts, 0))
reward.AddTestStakingInfoToCache(stakingInfo(tc.stakingAmounts, 1))

mockCtrl := gomock.NewController(t)
mStaking := mock.NewMockStakingModule(mockCtrl)
mStaking.EXPECT().GetStakingInfo(uint64(1)).Return(makeTestStakingInfo(genesisStakingAmounts, 0), nil).AnyTimes()
mStaking.EXPECT().GetStakingInfo(uint64(2)).Return(makeTestStakingInfo(tc.stakingAmounts, 1), nil).AnyTimes()
engine.RegisterStakingModule(mStaking)

block := makeBlockWithSeal(chain, engine, chain.Genesis())
_, err := chain.InsertChain(types.Blocks{block})
Expand All @@ -1053,7 +1071,7 @@ func TestSnapshot_Validators_AfterKaia_BasedOnStaking(t *testing.T) {
assert.Equal(t, expectedValidators, validators)
assert.Equal(t, expectedDemoted, demoted)

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand Down Expand Up @@ -1198,7 +1216,8 @@ func TestSnapshot_Validators_BasedOnStaking(t *testing.T) {
configItems = append(configItems, governanceMode("single"))
}
chain, engine := newBlockChain(testNum, configItems...)
oldStakingManager := setTestStakingInfo(tc.stakingAmounts)
mockCtrl, mStaking := makeMockStakingManager(t, tc.stakingAmounts, 0)
engine.RegisterStakingModule(mStaking)

block := makeBlockWithSeal(chain, engine, chain.Genesis())
_, err := chain.InsertChain(types.Blocks{block})
Expand All @@ -1216,7 +1235,7 @@ func TestSnapshot_Validators_BasedOnStaking(t *testing.T) {
assert.Equal(t, expectedValidators, validators)
assert.Equal(t, expectedDemoted, demoted)

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand Down Expand Up @@ -1366,7 +1385,8 @@ func TestSnapshot_Validators_AddRemove(t *testing.T) {
for _, tc := range testcases {
// Create test blockchain
chain, engine := newBlockChain(4, configItems...)
oldStakingManager := setTestStakingInfo(stakes)
mockCtrl, mStaking := makeMockStakingManager(t, stakes, 0)
engine.RegisterStakingModule(mStaking)

// Backup the globals. The globals `nodeKeys` and `addrs` will be
// modified according to validator change votes.
Expand Down Expand Up @@ -1431,7 +1451,7 @@ func TestSnapshot_Validators_AddRemove(t *testing.T) {
// t.Logf("snap at block #%d: size %d", i, snap.ValSet.Size())
}

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand All @@ -1444,8 +1464,9 @@ func TestSnapshot_Writable(t *testing.T) {
configItems = append(configItems, blockPeriod(0)) // set block period to 0 to prevent creating future block
chain, engine := newBlockChain(1, configItems...)
defer engine.Stop()
oldStakingManager := setTestStakingInfo(nil)
defer reward.SetTestStakingManager(oldStakingManager)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)
defer mockCtrl.Finish()

// add votes and insert voted blocks
var (
Expand Down Expand Up @@ -1703,7 +1724,8 @@ func TestGovernance_Votes(t *testing.T) {
configItems = append(configItems, blockPeriod(0)) // set block period to 0 to prevent creating future block
for _, tc := range testcases {
chain, engine := newBlockChain(1, configItems...)
oldStakingManager := setTestStakingInfo(nil)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)

// test initial governance items
assert.Equal(t, uint64(3), engine.governance.CurrentParams().Epoch())
Expand Down Expand Up @@ -1747,7 +1769,7 @@ func TestGovernance_Votes(t *testing.T) {
assert.Equal(t, item.value, items[item.key])
}

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand Down Expand Up @@ -1795,7 +1817,8 @@ func TestGovernance_ReaderEngine(t *testing.T) {
for _, tc := range testcases {
// Create test blockchain
chain, engine := newBlockChain(4, configItems...)
oldStakingManager := setTestStakingInfo(stakes)
mockCtrl, mStaking := makeMockStakingManager(t, stakes, 0)
engine.RegisterStakingModule(mStaking)

var previousBlock, currentBlock *types.Block = nil, chain.Genesis()

Expand Down Expand Up @@ -1836,7 +1859,7 @@ func TestGovernance_ReaderEngine(t *testing.T) {
assertMapSubset(t, tc.expected[num+1], items)
}

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Expand Down Expand Up @@ -1967,7 +1990,8 @@ func TestChainConfig_ReadFromDBAfterVotes(t *testing.T) {
configItems = append(configItems, blockPeriod(0)) // set block period to 0 to prevent creating future block
for _, tc := range testcases {
chain, engine := newBlockChain(1, configItems...)
oldStakingManager := setTestStakingInfo(nil)
mockCtrl, mStaking := makeMockStakingManager(t, nil, 0)
engine.RegisterStakingModule(mStaking)

// test initial governance items
assert.Equal(t, uint64(25000000000), chain.Config().Governance.KIP71.LowerBoundBaseFee)
Expand Down Expand Up @@ -2012,7 +2036,7 @@ func TestChainConfig_ReadFromDBAfterVotes(t *testing.T) {
assert.Error(t, nil)
}

reward.SetTestStakingManager(oldStakingManager)
mockCtrl.Finish()
engine.Stop()
}
}
Loading
Loading