diff --git a/core/staking_verifier_test.go b/core/staking_verifier_test.go index 38e641a41..e8733bfcd 100644 --- a/core/staking_verifier_test.go +++ b/core/staking_verifier_test.go @@ -1416,8 +1416,6 @@ func TestVerifyAndUndelegateFromMsg(t *testing.T) { }(t), noNilDelegationsEpoch: big.NewInt(defaultEpoch), }, - - } for i, test := range tests { config := ¶ms.ChainConfig{} diff --git a/core/state/statedb.go b/core/state/statedb.go index 8aaf5aa3f..fa5526354 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -1415,63 +1415,63 @@ func (db *DB) AddReward( delegation := snapshot.Delegations[i] percentage, ok := shareLookup[delegation.DelegatorAddress] - if !ok { - return errors.Wrapf(err, "missing delegation shares for reward distribution") - } + if !ok { + return errors.Wrapf(err, "missing delegation shares for reward distribution") + } - rewardInt := percentage.MulInt(totalRewardForDelegators).RoundInt() - curDelegation := curValidator.Delegations[i] - // should we check that curDelegation.DelegatorAddress == delegation.DelegatorAddress ? - // wasn't there originally so I leave it for now - curDelegation.Reward.Add(curDelegation.Reward, rewardInt) - rewardPool.Sub(rewardPool, rewardInt) - } -} else { - // iterate simply over snapshot delegations - // those added later to curValidator are new delegations which do not receive rewards immediately - // those removed from curValidator are stale delegations which do not receive rewards anyway - offset := 0 - for i := 0; i < len(snapshot.Delegations); i++ { - delegationFromSnapshot := snapshot.Delegations[i] - percentage, ok := shareLookup[delegationFromSnapshot.DelegatorAddress] - if !ok { - return errors.Wrapf(err, "missing delegation shares for reward distribution") + rewardInt := percentage.MulInt(totalRewardForDelegators).RoundInt() + curDelegation := curValidator.Delegations[i] + // should we check that curDelegation.DelegatorAddress == delegation.DelegatorAddress ? + // wasn't there originally so I leave it for now + curDelegation.Reward.Add(curDelegation.Reward, rewardInt) + rewardPool.Sub(rewardPool, rewardInt) } - if percentage.IsZero() { // stale delegation + } else { + // iterate simply over snapshot delegations + // those added later to curValidator are new delegations which do not receive rewards immediately + // those removed from curValidator are stale delegations which do not receive rewards anyway + offset := 0 + for i := 0; i < len(snapshot.Delegations); i++ { + delegationFromSnapshot := snapshot.Delegations[i] + percentage, ok := shareLookup[delegationFromSnapshot.DelegatorAddress] + if !ok { + return errors.Wrapf(err, "missing delegation shares for reward distribution") + } + if percentage.IsZero() { // stale delegation - offset++ - continue - } - // try to find in wrapper - // this is O(N) even though order is not guaranteed - // for example, snapshot is A / B / C / D / E where C is a stale delegation - // wrapper then becomes A / B / D / E - // if C then delegates to this validator, the wrapper becomes A / B / D / E / C - // (1) snapshot = A / B / C / D / E and wrapper = A / B / D / E / C (remove and re-add) - // for i in [0, 1] j = i - 0 (offset) works well - // for i = 2, offset becomes 1 - // for i in [3, 4] use j = i - 1 (offset) - // other cases are - // (1) snapshot = A / B / C / D and wrapper = A / C / D (just remove B) - // (2) snapshot = A / B / C / D and wrapper = A / C / D / E (remove B and add E) - // (3) snapshot = A / B / C / D and wrapper = A / B / C / D / E (just add E) - // (4) snapshot and wrapper equal (no effort needed) - // even if a stale delegation is removed from the end and re-added this works - // (5) snapshot = A / B / C / D / E and wrapper = A / B / D / E / C / F (remove and re-add + add) - - found := false - for j := i - offset; j < len(curValidator.Delegations) && !found; j++ { - delegationFromWrapper := curValidator.Delegations[j] - if bytes.Equal( - delegationFromWrapper.DelegatorAddress.Bytes(), - delegationFromSnapshot.DelegatorAddress.Bytes(), - ) { - found = true - rewardInt := percentage.MulInt(totalRewardForDelegators).RoundInt() - delegationFromWrapper.Reward.Add(delegationFromWrapper.Reward, rewardInt) - rewardPool.Sub(rewardPool, rewardInt) + offset++ + continue + } + // try to find in wrapper + // this is O(N) even though order is not guaranteed + // for example, snapshot is A / B / C / D / E where C is a stale delegation + // wrapper then becomes A / B / D / E + // if C then delegates to this validator, the wrapper becomes A / B / D / E / C + // (1) snapshot = A / B / C / D / E and wrapper = A / B / D / E / C (remove and re-add) + // for i in [0, 1] j = i - 0 (offset) works well + // for i = 2, offset becomes 1 + // for i in [3, 4] use j = i - 1 (offset) + // other cases are + // (1) snapshot = A / B / C / D and wrapper = A / C / D (just remove B) + // (2) snapshot = A / B / C / D and wrapper = A / C / D / E (remove B and add E) + // (3) snapshot = A / B / C / D and wrapper = A / B / C / D / E (just add E) + // (4) snapshot and wrapper equal (no effort needed) + // even if a stale delegation is removed from the end and re-added this works + // (5) snapshot = A / B / C / D / E and wrapper = A / B / D / E / C / F (remove and re-add + add) + + found := false + for j := i - offset; j < len(curValidator.Delegations) && !found; j++ { + delegationFromWrapper := curValidator.Delegations[j] + if bytes.Equal( + delegationFromWrapper.DelegatorAddress.Bytes(), + delegationFromSnapshot.DelegatorAddress.Bytes(), + ) { + found = true + rewardInt := percentage.MulInt(totalRewardForDelegators).RoundInt() + delegationFromWrapper.Reward.Add(delegationFromWrapper.Reward, rewardInt) + rewardPool.Sub(rewardPool, rewardInt) + } } - } // delegation in snapshot with non zero reward but not in wrapper if !found { return errors.New("Non-zero reward found in snapshot but delegation missing in wrapper") diff --git a/core/state_processor.go b/core/state_processor.go index 47b7c7eaa..11505f038 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -64,13 +64,13 @@ type StateProcessor struct { // this structure is cached, and each individual element is returned type ProcessorResult struct { - Receipts types.Receipts - CxReceipts types.CXReceipts - StakeMsgs []staking.StakeMsg - Logs []*types.Log - UsedGas uint64 - Reward reward.Reader - State *state.DB + Receipts types.Receipts + CxReceipts types.CXReceipts + StakeMsgs []staking.StakeMsg + Logs []*types.Log + UsedGas uint64 + Reward reward.Reader + State *state.DB DelegationsToRemove map[common.Address][]common.Address } @@ -232,13 +232,13 @@ func (p *StateProcessor) Process( } result := &ProcessorResult{ - Receipts: receipts, - CxReceipts: outcxs, - StakeMsgs: blockStakeMsgs, - Logs: allLogs, - UsedGas: *usedGas, - Reward: payout, - State: statedb, + Receipts: receipts, + CxReceipts: outcxs, + StakeMsgs: blockStakeMsgs, + Logs: allLogs, + UsedGas: *usedGas, + Reward: payout, + State: statedb, DelegationsToRemove: delegationsToRemove, } p.resultCache.Add(cacheKey, result) diff --git a/hmy/downloader/adapter_test.go b/hmy/downloader/adapter_test.go index 0c5386d2f..3a3c2df3c 100644 --- a/hmy/downloader/adapter_test.go +++ b/hmy/downloader/adapter_test.go @@ -161,7 +161,7 @@ func (e *dummyEngine) Finalize( incxs []*types.CXReceiptsProof, stks staking.StakingTransactions, doubleSigners slash.Records, sigsReady chan bool, viewID func() uint64, ) (*types.Block, map[common.Address][]common.Address, reward.Reader, error) { - return nil, nil, nil, nil + return nil, nil, nil, nil } type testInsertHelper struct { diff --git a/internal/chain/engine.go b/internal/chain/engine.go index f357790d7..5c949bf66 100644 --- a/internal/chain/engine.go +++ b/internal/chain/engine.go @@ -377,7 +377,6 @@ func (e *engineImpl) Finalize( Msg("pruneStaleStakingData") } - // Finalize the state root header.SetRoot(state.IntermediateRoot(chain.Config().IsS3(header.Epoch()))) return types.NewBlock(header, txs, receipts, outcxs, incxs, stks), delegationsToRemove, payout, nil diff --git a/internal/chain/engine_test.go b/internal/chain/engine_test.go index 85a49e79d..259302edb 100644 --- a/internal/chain/engine_test.go +++ b/internal/chain/engine_test.go @@ -1,33 +1,29 @@ package chain import ( - "bytes" "fmt" "math/big" - "testing" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/trie" - bls_core "github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/harmony/block" blockfactory "github.com/harmony-one/harmony/block/factory" - "github.com/harmony-one/harmony/common/denominations" + "github.com/harmony-one/harmony/consensus/engine" "github.com/harmony-one/harmony/core" + "github.com/harmony-one/harmony/core/rawdb" "github.com/harmony-one/harmony/core/state" + "github.com/harmony-one/harmony/core/state/snapshot" + "github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/vm" "github.com/harmony-one/harmony/crypto/bls" "github.com/harmony-one/harmony/crypto/hash" "github.com/harmony-one/harmony/internal/params" "github.com/harmony-one/harmony/numeric" - "github.com/harmony-one/harmony/staking/effective" + "github.com/harmony-one/harmony/shard" + "github.com/harmony-one/harmony/staking/slash" staking "github.com/harmony-one/harmony/staking/types" types2 "github.com/harmony-one/harmony/staking/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/harmony-one/harmony/core/rawdb" - "github.com/harmony-one/harmony/core/state" - "github.com/harmony-one/harmony/core/state/snapshot" - "github.com/harmony-one/harmony/core/types" - "github.com/harmony-one/harmony/internal/params" + staketest "github.com/harmony-one/harmony/staking/types/test" ) type fakeReader struct { diff --git a/internal/params/config.go b/internal/params/config.go index 2ccb27f2d..baecf1a65 100644 --- a/internal/params/config.go +++ b/internal/params/config.go @@ -36,269 +36,269 @@ var once sync.Once var ( // MainnetChainConfig is the chain parameters to run a node on the main network. MainnetChainConfig = &ChainConfig{ - ChainID: MainnetChainID, - EthCompatibleChainID: EthMainnetShard0ChainID, - EthCompatibleShard0ChainID: EthMainnetShard0ChainID, - EthCompatibleEpoch: big.NewInt(442), // Around Thursday Feb 4th 2020, 10AM PST - CrossTxEpoch: big.NewInt(28), - CrossLinkEpoch: big.NewInt(186), - AggregatedRewardEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time - StakingEpoch: big.NewInt(186), - PreStakingEpoch: big.NewInt(185), - QuickUnlockEpoch: big.NewInt(191), - FiveSecondsEpoch: big.NewInt(230), - TwoSecondsEpoch: big.NewInt(366), // Around Tuesday Dec 8th 2020, 8AM PST - SixtyPercentEpoch: big.NewInt(530), // Around Monday Apr 12th 2021, 22:30 UTC - RedelegationEpoch: big.NewInt(290), - NoEarlyUnlockEpoch: big.NewInt(530), // Around Monday Apr 12th 2021, 22:30 UTC - VRFEpoch: big.NewInt(631), // Around Wed July 7th 2021 - PrevVRFEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time - MinDelegation100Epoch: big.NewInt(631), // Around Wed July 7th 2021 - MinCommissionRateEpoch: big.NewInt(631), // Around Wed July 7th 2021 - MinCommissionPromoPeriod: big.NewInt(100), - EPoSBound35Epoch: big.NewInt(631), // Around Wed July 7th 2021 - EIP155Epoch: big.NewInt(28), - S3Epoch: big.NewInt(28), - DataCopyFixEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time - IstanbulEpoch: big.NewInt(314), - ReceiptLogEpoch: big.NewInt(101), - SHA3Epoch: big.NewInt(725), // Around Mon Oct 11 2021, 19:00 UTC - HIP6And8Epoch: big.NewInt(725), // Around Mon Oct 11 2021, 19:00 UTC - StakingPrecompileEpoch: big.NewInt(871), // Around Tue Feb 11 2022 - ChainIdFixEpoch: big.NewInt(1323), // Around Wed 8 Feb 11:30PM UTC - SlotsLimitedEpoch: big.NewInt(999), // Around Fri, 27 May 2022 09:41:02 UTC with 2s block time - CrossShardXferPrecompileEpoch: big.NewInt(1323), // Around Wed 8 Feb 11:30PM UTC - AllowlistEpoch: EpochTBD, - LeaderRotationInternalValidatorsEpoch: EpochTBD, - LeaderRotationExternalValidatorsEpoch: EpochTBD, - FeeCollectEpoch: big.NewInt(1535), // 2023-07-20 05:51:07+00:00 - ValidatorCodeFixEpoch: big.NewInt(1535), // 2023-07-20 05:51:07+00:00 - HIP30Epoch: big.NewInt(1673), // 2023-11-02 17:30:00+00:00 - NoNilDelegationsEpoch: EpochTBD, - BlockGas30MEpoch: big.NewInt(1673), // 2023-11-02 17:30:00+00:00 + ChainID: MainnetChainID, + EthCompatibleChainID: EthMainnetShard0ChainID, + EthCompatibleShard0ChainID: EthMainnetShard0ChainID, + EthCompatibleEpoch: big.NewInt(442), // Around Thursday Feb 4th 2020, 10AM PST + CrossTxEpoch: big.NewInt(28), + CrossLinkEpoch: big.NewInt(186), + AggregatedRewardEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time + StakingEpoch: big.NewInt(186), + PreStakingEpoch: big.NewInt(185), + QuickUnlockEpoch: big.NewInt(191), + FiveSecondsEpoch: big.NewInt(230), + TwoSecondsEpoch: big.NewInt(366), // Around Tuesday Dec 8th 2020, 8AM PST + SixtyPercentEpoch: big.NewInt(530), // Around Monday Apr 12th 2021, 22:30 UTC + RedelegationEpoch: big.NewInt(290), + NoEarlyUnlockEpoch: big.NewInt(530), // Around Monday Apr 12th 2021, 22:30 UTC + VRFEpoch: big.NewInt(631), // Around Wed July 7th 2021 + PrevVRFEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time + MinDelegation100Epoch: big.NewInt(631), // Around Wed July 7th 2021 + MinCommissionRateEpoch: big.NewInt(631), // Around Wed July 7th 2021 + MinCommissionPromoPeriod: big.NewInt(100), + EPoSBound35Epoch: big.NewInt(631), // Around Wed July 7th 2021 + EIP155Epoch: big.NewInt(28), + S3Epoch: big.NewInt(28), + DataCopyFixEpoch: big.NewInt(689), // Around Wed Sept 15th 2021 with 3.5s block time + IstanbulEpoch: big.NewInt(314), + ReceiptLogEpoch: big.NewInt(101), + SHA3Epoch: big.NewInt(725), // Around Mon Oct 11 2021, 19:00 UTC + HIP6And8Epoch: big.NewInt(725), // Around Mon Oct 11 2021, 19:00 UTC + StakingPrecompileEpoch: big.NewInt(871), // Around Tue Feb 11 2022 + ChainIdFixEpoch: big.NewInt(1323), // Around Wed 8 Feb 11:30PM UTC + SlotsLimitedEpoch: big.NewInt(999), // Around Fri, 27 May 2022 09:41:02 UTC with 2s block time + CrossShardXferPrecompileEpoch: big.NewInt(1323), // Around Wed 8 Feb 11:30PM UTC + AllowlistEpoch: EpochTBD, + LeaderRotationInternalValidatorsEpoch: EpochTBD, + LeaderRotationExternalValidatorsEpoch: EpochTBD, + FeeCollectEpoch: big.NewInt(1535), // 2023-07-20 05:51:07+00:00 + ValidatorCodeFixEpoch: big.NewInt(1535), // 2023-07-20 05:51:07+00:00 + HIP30Epoch: big.NewInt(1673), // 2023-11-02 17:30:00+00:00 + NoNilDelegationsEpoch: EpochTBD, + BlockGas30MEpoch: big.NewInt(1673), // 2023-11-02 17:30:00+00:00 } // TestnetChainConfig contains the chain parameters to run a node on the harmony test network. TestnetChainConfig = &ChainConfig{ - ChainID: TestnetChainID, - EthCompatibleChainID: EthTestnetShard0ChainID, - EthCompatibleShard0ChainID: EthTestnetShard0ChainID, - EthCompatibleEpoch: big.NewInt(0), - CrossTxEpoch: big.NewInt(0), - CrossLinkEpoch: big.NewInt(2), - AggregatedRewardEpoch: big.NewInt(2), - StakingEpoch: big.NewInt(2), - PreStakingEpoch: big.NewInt(1), - QuickUnlockEpoch: big.NewInt(0), - FiveSecondsEpoch: big.NewInt(0), - TwoSecondsEpoch: big.NewInt(2), - SixtyPercentEpoch: big.NewInt(2), - RedelegationEpoch: big.NewInt(2), - NoEarlyUnlockEpoch: big.NewInt(2), - VRFEpoch: big.NewInt(2), - PrevVRFEpoch: big.NewInt(2), - MinDelegation100Epoch: big.NewInt(2), - MinCommissionRateEpoch: big.NewInt(2), - MinCommissionPromoPeriod: big.NewInt(2), - EPoSBound35Epoch: big.NewInt(2), - EIP155Epoch: big.NewInt(0), - S3Epoch: big.NewInt(0), - DataCopyFixEpoch: big.NewInt(0), - IstanbulEpoch: big.NewInt(0), - ReceiptLogEpoch: big.NewInt(0), - SHA3Epoch: big.NewInt(0), - HIP6And8Epoch: big.NewInt(2), - StakingPrecompileEpoch: big.NewInt(2), - SlotsLimitedEpoch: big.NewInt(2), - ChainIdFixEpoch: big.NewInt(0), - CrossShardXferPrecompileEpoch: big.NewInt(2), - AllowlistEpoch: big.NewInt(2), - LeaderRotationInternalValidatorsEpoch: EpochTBD, - LeaderRotationExternalValidatorsEpoch: EpochTBD, - FeeCollectEpoch: big.NewInt(1296), // 2023-04-28 07:14:20+00:00 - ValidatorCodeFixEpoch: big.NewInt(1296), // 2023-04-28 07:14:20+00:00 - HIP30Epoch: big.NewInt(2176), // 2023-10-12 10:00:00+00:00 - NoNilDelegationsEpoch: EpochTBD, - BlockGas30MEpoch: big.NewInt(2176), // 2023-10-12 10:00:00+00:00 + ChainID: TestnetChainID, + EthCompatibleChainID: EthTestnetShard0ChainID, + EthCompatibleShard0ChainID: EthTestnetShard0ChainID, + EthCompatibleEpoch: big.NewInt(0), + CrossTxEpoch: big.NewInt(0), + CrossLinkEpoch: big.NewInt(2), + AggregatedRewardEpoch: big.NewInt(2), + StakingEpoch: big.NewInt(2), + PreStakingEpoch: big.NewInt(1), + QuickUnlockEpoch: big.NewInt(0), + FiveSecondsEpoch: big.NewInt(0), + TwoSecondsEpoch: big.NewInt(2), + SixtyPercentEpoch: big.NewInt(2), + RedelegationEpoch: big.NewInt(2), + NoEarlyUnlockEpoch: big.NewInt(2), + VRFEpoch: big.NewInt(2), + PrevVRFEpoch: big.NewInt(2), + MinDelegation100Epoch: big.NewInt(2), + MinCommissionRateEpoch: big.NewInt(2), + MinCommissionPromoPeriod: big.NewInt(2), + EPoSBound35Epoch: big.NewInt(2), + EIP155Epoch: big.NewInt(0), + S3Epoch: big.NewInt(0), + DataCopyFixEpoch: big.NewInt(0), + IstanbulEpoch: big.NewInt(0), + ReceiptLogEpoch: big.NewInt(0), + SHA3Epoch: big.NewInt(0), + HIP6And8Epoch: big.NewInt(2), + StakingPrecompileEpoch: big.NewInt(2), + SlotsLimitedEpoch: big.NewInt(2), + ChainIdFixEpoch: big.NewInt(0), + CrossShardXferPrecompileEpoch: big.NewInt(2), + AllowlistEpoch: big.NewInt(2), + LeaderRotationInternalValidatorsEpoch: EpochTBD, + LeaderRotationExternalValidatorsEpoch: EpochTBD, + FeeCollectEpoch: big.NewInt(1296), // 2023-04-28 07:14:20+00:00 + ValidatorCodeFixEpoch: big.NewInt(1296), // 2023-04-28 07:14:20+00:00 + HIP30Epoch: big.NewInt(2176), // 2023-10-12 10:00:00+00:00 + NoNilDelegationsEpoch: EpochTBD, + BlockGas30MEpoch: big.NewInt(2176), // 2023-10-12 10:00:00+00:00 } // PangaeaChainConfig contains the chain parameters for the Pangaea network. // All features except for CrossLink are enabled at launch. PangaeaChainConfig = &ChainConfig{ - ChainID: PangaeaChainID, - EthCompatibleChainID: EthPangaeaShard0ChainID, - EthCompatibleShard0ChainID: EthPangaeaShard0ChainID, - EthCompatibleEpoch: big.NewInt(0), - CrossTxEpoch: big.NewInt(0), - CrossLinkEpoch: big.NewInt(2), - AggregatedRewardEpoch: big.NewInt(3), - StakingEpoch: big.NewInt(2), - PreStakingEpoch: big.NewInt(1), - QuickUnlockEpoch: big.NewInt(0), - FiveSecondsEpoch: big.NewInt(0), - TwoSecondsEpoch: big.NewInt(0), - SixtyPercentEpoch: big.NewInt(0), - RedelegationEpoch: big.NewInt(0), - NoEarlyUnlockEpoch: big.NewInt(0), - VRFEpoch: big.NewInt(0), - PrevVRFEpoch: big.NewInt(0), - MinDelegation100Epoch: big.NewInt(0), - MinCommissionRateEpoch: big.NewInt(0), - MinCommissionPromoPeriod: big.NewInt(10), - EPoSBound35Epoch: big.NewInt(0), - EIP155Epoch: big.NewInt(0), - S3Epoch: big.NewInt(0), - DataCopyFixEpoch: big.NewInt(0), - IstanbulEpoch: big.NewInt(0), - ReceiptLogEpoch: big.NewInt(0), - SHA3Epoch: big.NewInt(0), - HIP6And8Epoch: big.NewInt(0), - StakingPrecompileEpoch: big.NewInt(2), // same as staking - ChainIdFixEpoch: big.NewInt(0), - SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 - CrossShardXferPrecompileEpoch: big.NewInt(1), - AllowlistEpoch: EpochTBD, - LeaderRotationInternalValidatorsEpoch: EpochTBD, - LeaderRotationExternalValidatorsEpoch: EpochTBD, - FeeCollectEpoch: EpochTBD, - ValidatorCodeFixEpoch: EpochTBD, - HIP30Epoch: EpochTBD, - NoNilDelegationsEpoch: EpochTBD, - BlockGas30MEpoch: big.NewInt(0), + ChainID: PangaeaChainID, + EthCompatibleChainID: EthPangaeaShard0ChainID, + EthCompatibleShard0ChainID: EthPangaeaShard0ChainID, + EthCompatibleEpoch: big.NewInt(0), + CrossTxEpoch: big.NewInt(0), + CrossLinkEpoch: big.NewInt(2), + AggregatedRewardEpoch: big.NewInt(3), + StakingEpoch: big.NewInt(2), + PreStakingEpoch: big.NewInt(1), + QuickUnlockEpoch: big.NewInt(0), + FiveSecondsEpoch: big.NewInt(0), + TwoSecondsEpoch: big.NewInt(0), + SixtyPercentEpoch: big.NewInt(0), + RedelegationEpoch: big.NewInt(0), + NoEarlyUnlockEpoch: big.NewInt(0), + VRFEpoch: big.NewInt(0), + PrevVRFEpoch: big.NewInt(0), + MinDelegation100Epoch: big.NewInt(0), + MinCommissionRateEpoch: big.NewInt(0), + MinCommissionPromoPeriod: big.NewInt(10), + EPoSBound35Epoch: big.NewInt(0), + EIP155Epoch: big.NewInt(0), + S3Epoch: big.NewInt(0), + DataCopyFixEpoch: big.NewInt(0), + IstanbulEpoch: big.NewInt(0), + ReceiptLogEpoch: big.NewInt(0), + SHA3Epoch: big.NewInt(0), + HIP6And8Epoch: big.NewInt(0), + StakingPrecompileEpoch: big.NewInt(2), // same as staking + ChainIdFixEpoch: big.NewInt(0), + SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 + CrossShardXferPrecompileEpoch: big.NewInt(1), + AllowlistEpoch: EpochTBD, + LeaderRotationInternalValidatorsEpoch: EpochTBD, + LeaderRotationExternalValidatorsEpoch: EpochTBD, + FeeCollectEpoch: EpochTBD, + ValidatorCodeFixEpoch: EpochTBD, + HIP30Epoch: EpochTBD, + NoNilDelegationsEpoch: EpochTBD, + BlockGas30MEpoch: big.NewInt(0), } // PartnerChainConfig contains the chain parameters for the Partner network. // This is the Devnet config PartnerChainConfig = &ChainConfig{ - ChainID: PartnerChainID, - EthCompatibleChainID: EthPartnerShard0ChainID, - EthCompatibleShard0ChainID: EthPartnerShard0ChainID, - EthCompatibleEpoch: big.NewInt(0), - CrossTxEpoch: big.NewInt(0), - CrossLinkEpoch: big.NewInt(2), - AggregatedRewardEpoch: big.NewInt(3), - StakingEpoch: big.NewInt(2), - PreStakingEpoch: big.NewInt(1), - QuickUnlockEpoch: big.NewInt(0), - FiveSecondsEpoch: big.NewInt(0), - TwoSecondsEpoch: big.NewInt(0), - SixtyPercentEpoch: EpochTBD, - RedelegationEpoch: big.NewInt(0), - NoEarlyUnlockEpoch: big.NewInt(0), - VRFEpoch: big.NewInt(0), - PrevVRFEpoch: big.NewInt(0), - MinDelegation100Epoch: big.NewInt(0), - MinCommissionRateEpoch: big.NewInt(0), - MinCommissionPromoPeriod: big.NewInt(10), - EPoSBound35Epoch: big.NewInt(0), - EIP155Epoch: big.NewInt(0), - S3Epoch: big.NewInt(0), - DataCopyFixEpoch: big.NewInt(0), - IstanbulEpoch: big.NewInt(0), - ReceiptLogEpoch: big.NewInt(0), - SHA3Epoch: big.NewInt(0), - HIP6And8Epoch: big.NewInt(0), - StakingPrecompileEpoch: big.NewInt(5), - ChainIdFixEpoch: big.NewInt(5), - SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 - CrossShardXferPrecompileEpoch: big.NewInt(5), - AllowlistEpoch: EpochTBD, - LeaderRotationInternalValidatorsEpoch: EpochTBD, - LeaderRotationExternalValidatorsEpoch: EpochTBD, - FeeCollectEpoch: big.NewInt(5), - ValidatorCodeFixEpoch: big.NewInt(5), - HIP30Epoch: big.NewInt(7), - BlockGas30MEpoch: big.NewInt(7), - NoNilDelegationsEpoch: EpochTBD, + ChainID: PartnerChainID, + EthCompatibleChainID: EthPartnerShard0ChainID, + EthCompatibleShard0ChainID: EthPartnerShard0ChainID, + EthCompatibleEpoch: big.NewInt(0), + CrossTxEpoch: big.NewInt(0), + CrossLinkEpoch: big.NewInt(2), + AggregatedRewardEpoch: big.NewInt(3), + StakingEpoch: big.NewInt(2), + PreStakingEpoch: big.NewInt(1), + QuickUnlockEpoch: big.NewInt(0), + FiveSecondsEpoch: big.NewInt(0), + TwoSecondsEpoch: big.NewInt(0), + SixtyPercentEpoch: EpochTBD, + RedelegationEpoch: big.NewInt(0), + NoEarlyUnlockEpoch: big.NewInt(0), + VRFEpoch: big.NewInt(0), + PrevVRFEpoch: big.NewInt(0), + MinDelegation100Epoch: big.NewInt(0), + MinCommissionRateEpoch: big.NewInt(0), + MinCommissionPromoPeriod: big.NewInt(10), + EPoSBound35Epoch: big.NewInt(0), + EIP155Epoch: big.NewInt(0), + S3Epoch: big.NewInt(0), + DataCopyFixEpoch: big.NewInt(0), + IstanbulEpoch: big.NewInt(0), + ReceiptLogEpoch: big.NewInt(0), + SHA3Epoch: big.NewInt(0), + HIP6And8Epoch: big.NewInt(0), + StakingPrecompileEpoch: big.NewInt(5), + ChainIdFixEpoch: big.NewInt(5), + SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 + CrossShardXferPrecompileEpoch: big.NewInt(5), + AllowlistEpoch: EpochTBD, + LeaderRotationInternalValidatorsEpoch: EpochTBD, + LeaderRotationExternalValidatorsEpoch: EpochTBD, + FeeCollectEpoch: big.NewInt(5), + ValidatorCodeFixEpoch: big.NewInt(5), + HIP30Epoch: big.NewInt(7), + BlockGas30MEpoch: big.NewInt(7), + NoNilDelegationsEpoch: EpochTBD, } // StressnetChainConfig contains the chain parameters for the Stress test network. // All features except for CrossLink are enabled at launch. StressnetChainConfig = &ChainConfig{ - ChainID: StressnetChainID, - EthCompatibleChainID: EthStressnetShard0ChainID, - EthCompatibleShard0ChainID: EthStressnetShard0ChainID, - EthCompatibleEpoch: big.NewInt(0), - CrossTxEpoch: big.NewInt(0), - CrossLinkEpoch: big.NewInt(2), - AggregatedRewardEpoch: big.NewInt(3), - StakingEpoch: big.NewInt(2), - PreStakingEpoch: big.NewInt(1), - QuickUnlockEpoch: big.NewInt(0), - FiveSecondsEpoch: big.NewInt(0), - TwoSecondsEpoch: big.NewInt(0), - SixtyPercentEpoch: big.NewInt(10), - RedelegationEpoch: big.NewInt(0), - NoEarlyUnlockEpoch: big.NewInt(0), - VRFEpoch: big.NewInt(0), - PrevVRFEpoch: big.NewInt(0), - MinDelegation100Epoch: big.NewInt(0), - MinCommissionRateEpoch: big.NewInt(0), - MinCommissionPromoPeriod: big.NewInt(10), - EPoSBound35Epoch: big.NewInt(0), - EIP155Epoch: big.NewInt(0), - S3Epoch: big.NewInt(0), - DataCopyFixEpoch: big.NewInt(0), - IstanbulEpoch: big.NewInt(0), - ReceiptLogEpoch: big.NewInt(0), - SHA3Epoch: big.NewInt(0), - HIP6And8Epoch: big.NewInt(0), - StakingPrecompileEpoch: big.NewInt(2), - ChainIdFixEpoch: big.NewInt(0), - SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 - CrossShardXferPrecompileEpoch: big.NewInt(1), - AllowlistEpoch: EpochTBD, - FeeCollectEpoch: EpochTBD, + ChainID: StressnetChainID, + EthCompatibleChainID: EthStressnetShard0ChainID, + EthCompatibleShard0ChainID: EthStressnetShard0ChainID, + EthCompatibleEpoch: big.NewInt(0), + CrossTxEpoch: big.NewInt(0), + CrossLinkEpoch: big.NewInt(2), + AggregatedRewardEpoch: big.NewInt(3), + StakingEpoch: big.NewInt(2), + PreStakingEpoch: big.NewInt(1), + QuickUnlockEpoch: big.NewInt(0), + FiveSecondsEpoch: big.NewInt(0), + TwoSecondsEpoch: big.NewInt(0), + SixtyPercentEpoch: big.NewInt(10), + RedelegationEpoch: big.NewInt(0), + NoEarlyUnlockEpoch: big.NewInt(0), + VRFEpoch: big.NewInt(0), + PrevVRFEpoch: big.NewInt(0), + MinDelegation100Epoch: big.NewInt(0), + MinCommissionRateEpoch: big.NewInt(0), + MinCommissionPromoPeriod: big.NewInt(10), + EPoSBound35Epoch: big.NewInt(0), + EIP155Epoch: big.NewInt(0), + S3Epoch: big.NewInt(0), + DataCopyFixEpoch: big.NewInt(0), + IstanbulEpoch: big.NewInt(0), + ReceiptLogEpoch: big.NewInt(0), + SHA3Epoch: big.NewInt(0), + HIP6And8Epoch: big.NewInt(0), + StakingPrecompileEpoch: big.NewInt(2), + ChainIdFixEpoch: big.NewInt(0), + SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 + CrossShardXferPrecompileEpoch: big.NewInt(1), + AllowlistEpoch: EpochTBD, + FeeCollectEpoch: EpochTBD, LeaderRotationInternalValidatorsEpoch: EpochTBD, LeaderRotationExternalValidatorsEpoch: EpochTBD, - ValidatorCodeFixEpoch: EpochTBD, - HIP30Epoch: EpochTBD, - NoNilDelegationsEpoch: big.NewInt(2), - BlockGas30MEpoch: big.NewInt(0), + ValidatorCodeFixEpoch: EpochTBD, + HIP30Epoch: EpochTBD, + NoNilDelegationsEpoch: big.NewInt(2), + BlockGas30MEpoch: big.NewInt(0), } // LocalnetChainConfig contains the chain parameters to run for local development. LocalnetChainConfig = &ChainConfig{ - ChainID: TestnetChainID, - EthCompatibleChainID: EthTestnetShard0ChainID, - EthCompatibleShard0ChainID: EthTestnetShard0ChainID, - EthCompatibleEpoch: big.NewInt(0), - CrossTxEpoch: big.NewInt(0), - CrossLinkEpoch: big.NewInt(2), - AggregatedRewardEpoch: big.NewInt(3), - StakingEpoch: big.NewInt(2), - PreStakingEpoch: big.NewInt(0), - QuickUnlockEpoch: big.NewInt(0), - FiveSecondsEpoch: big.NewInt(0), - TwoSecondsEpoch: big.NewInt(0), - SixtyPercentEpoch: EpochTBD, // Never enable it for localnet as localnet has no external validator setup - RedelegationEpoch: big.NewInt(0), - NoEarlyUnlockEpoch: big.NewInt(0), - VRFEpoch: big.NewInt(0), - PrevVRFEpoch: big.NewInt(0), - MinDelegation100Epoch: big.NewInt(0), - MinCommissionRateEpoch: big.NewInt(0), - MinCommissionPromoPeriod: big.NewInt(10), - EPoSBound35Epoch: big.NewInt(0), - EIP155Epoch: big.NewInt(0), - S3Epoch: big.NewInt(0), - DataCopyFixEpoch: big.NewInt(0), - IstanbulEpoch: big.NewInt(0), - ReceiptLogEpoch: big.NewInt(0), - SHA3Epoch: big.NewInt(0), - HIP6And8Epoch: EpochTBD, // Never enable it for localnet as localnet has no external validator setup - StakingPrecompileEpoch: big.NewInt(2), - ChainIdFixEpoch: big.NewInt(0), - SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 - CrossShardXferPrecompileEpoch: big.NewInt(1), - AllowlistEpoch: EpochTBD, - LeaderRotationInternalValidatorsEpoch: big.NewInt(5), - LeaderRotationExternalValidatorsEpoch: big.NewInt(6), - FeeCollectEpoch: big.NewInt(2), - ValidatorCodeFixEpoch: big.NewInt(2), - HIP30Epoch: EpochTBD, - NoNilDelegationsEpoch: big.NewInt(2), - BlockGas30MEpoch: big.NewInt(0), + ChainID: TestnetChainID, + EthCompatibleChainID: EthTestnetShard0ChainID, + EthCompatibleShard0ChainID: EthTestnetShard0ChainID, + EthCompatibleEpoch: big.NewInt(0), + CrossTxEpoch: big.NewInt(0), + CrossLinkEpoch: big.NewInt(2), + AggregatedRewardEpoch: big.NewInt(3), + StakingEpoch: big.NewInt(2), + PreStakingEpoch: big.NewInt(0), + QuickUnlockEpoch: big.NewInt(0), + FiveSecondsEpoch: big.NewInt(0), + TwoSecondsEpoch: big.NewInt(0), + SixtyPercentEpoch: EpochTBD, // Never enable it for localnet as localnet has no external validator setup + RedelegationEpoch: big.NewInt(0), + NoEarlyUnlockEpoch: big.NewInt(0), + VRFEpoch: big.NewInt(0), + PrevVRFEpoch: big.NewInt(0), + MinDelegation100Epoch: big.NewInt(0), + MinCommissionRateEpoch: big.NewInt(0), + MinCommissionPromoPeriod: big.NewInt(10), + EPoSBound35Epoch: big.NewInt(0), + EIP155Epoch: big.NewInt(0), + S3Epoch: big.NewInt(0), + DataCopyFixEpoch: big.NewInt(0), + IstanbulEpoch: big.NewInt(0), + ReceiptLogEpoch: big.NewInt(0), + SHA3Epoch: big.NewInt(0), + HIP6And8Epoch: EpochTBD, // Never enable it for localnet as localnet has no external validator setup + StakingPrecompileEpoch: big.NewInt(2), + ChainIdFixEpoch: big.NewInt(0), + SlotsLimitedEpoch: EpochTBD, // epoch to enable HIP-16 + CrossShardXferPrecompileEpoch: big.NewInt(1), + AllowlistEpoch: EpochTBD, + LeaderRotationInternalValidatorsEpoch: big.NewInt(5), + LeaderRotationExternalValidatorsEpoch: big.NewInt(6), + FeeCollectEpoch: big.NewInt(2), + ValidatorCodeFixEpoch: big.NewInt(2), + HIP30Epoch: EpochTBD, + NoNilDelegationsEpoch: big.NewInt(2), + BlockGas30MEpoch: big.NewInt(0), } // AllProtocolChanges ... @@ -575,7 +575,7 @@ func (c *ChainConfig) String() string { "StakingPrecompileEpoch: %v "+ "ChainIdFixEpoch: %v "+ "CrossShardXferPrecompileEpoch: %v "+ - "NoNilDelegationsEpoch: %v}", + "NoNilDelegationsEpoch: %v}", c.ChainID, c.EthCompatibleChainID, c.EIP155Epoch, @@ -793,7 +793,6 @@ func (c *ChainConfig) IsNoNilDelegations(epoch *big.Int) bool { return isForked(c.NoNilDelegationsEpoch, epoch) } - // IsCrossShardXferPrecompile determines whether the // Cross Shard Transfer Precompile is available in the EVM func (c *ChainConfig) IsCrossShardXferPrecompile(epoch *big.Int) bool { diff --git a/node/worker/worker.go b/node/worker/worker.go index b3f8d9bd7..36f252cc7 100644 --- a/node/worker/worker.go +++ b/node/worker/worker.go @@ -32,20 +32,20 @@ import ( // environment is the worker's current environment and holds all of the current state information. type environment struct { - signer types.Signer - ethSigner types.Signer - state *state.DB // apply state changes here - gasPool *core.GasPool // available gas used to pack transactions - header *block.Header - txs []*types.Transaction - stakingTxs []*staking.StakingTransaction - receipts []*types.Receipt - logs []*types.Log - reward reward.Reader - outcxs []*types.CXReceipt // cross shard transaction receipts (source shard) - incxs []*types.CXReceiptsProof // cross shard receipts and its proof (desitinatin shard) - slashes slash.Records - stakeMsgs []staking.StakeMsg + signer types.Signer + ethSigner types.Signer + state *state.DB // apply state changes here + gasPool *core.GasPool // available gas used to pack transactions + header *block.Header + txs []*types.Transaction + stakingTxs []*staking.StakingTransaction + receipts []*types.Receipt + logs []*types.Log + reward reward.Reader + outcxs []*types.CXReceipt // cross shard transaction receipts (source shard) + incxs []*types.CXReceiptsProof // cross shard receipts and its proof (desitinatin shard) + slashes slash.Records + stakeMsgs []staking.StakeMsg delegationsToRemove map[common.Address][]common.Address } @@ -408,13 +408,13 @@ func makeEnvironment(chain core.BlockChain, parent *block.Header, header *block. // GetCurrentResult gets the current block processing result. func (w *Worker) GetCurrentResult() *core.ProcessorResult { return &core.ProcessorResult{ - Receipts: w.current.receipts, - CxReceipts: w.current.outcxs, - Logs: w.current.logs, - UsedGas: w.current.header.GasUsed(), - Reward: w.current.reward, - State: w.current.state, - StakeMsgs: w.current.stakeMsgs, + Receipts: w.current.receipts, + CxReceipts: w.current.outcxs, + Logs: w.current.logs, + UsedGas: w.current.header.GasUsed(), + Reward: w.current.reward, + State: w.current.state, + StakeMsgs: w.current.stakeMsgs, DelegationsToRemove: w.current.delegationsToRemove, } } diff --git a/staking/types/delegation_test.go b/staking/types/delegation_test.go index c40750e4c..e8b8a68b1 100644 --- a/staking/types/delegation_test.go +++ b/staking/types/delegation_test.go @@ -19,7 +19,7 @@ var ( func TestUndelegate(t *testing.T) { epoch1 := big.NewInt(10) amount1 := big.NewInt(1000) - delegation.Undelegate(epoch1, amount1) + delegation.Undelegate(epoch1, amount1, nil) // check the undelegation's Amount if delegation.Undelegations[0].Amount.Cmp(amount1) != 0 { @@ -32,7 +32,7 @@ func TestUndelegate(t *testing.T) { epoch2 := big.NewInt(12) amount2 := big.NewInt(2000) - delegation.Undelegate(epoch2, amount2) + delegation.Undelegate(epoch2, amount2, nil) // check the number of undelegations if len(delegation.Undelegations) != 2 { @@ -54,7 +54,7 @@ func TestDeleteEntry(t *testing.T) { // Undelegations[]: 1000, 2000, 3000 epoch3 := big.NewInt(15) amount3 := big.NewInt(3000) - delegation.Undelegate(epoch3, amount3) + delegation.Undelegate(epoch3, amount3, nil) // delete the second undelegation entry // Undelegations[]: 1000, 3000 @@ -73,7 +73,7 @@ func TestUnlockedLastEpochInCommittee(t *testing.T) { epoch4 := big.NewInt(21) amount4 := big.NewInt(4000) - delegation.Undelegate(epoch4, amount4) + delegation.Undelegate(epoch4, amount4, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, false) if result.Cmp(big.NewInt(8000)) != 0 { @@ -88,7 +88,7 @@ func TestUnlockedLastEpochInCommitteeFail(t *testing.T) { epoch4 := big.NewInt(21) amount4 := big.NewInt(4000) - delegation.Undelegate(epoch4, amount4) + delegation.Undelegate(epoch4, amount4, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, false) if result.Cmp(big.NewInt(0)) != 0 { @@ -102,7 +102,7 @@ func TestUnlockedFullPeriod(t *testing.T) { epoch5 := big.NewInt(27) amount5 := big.NewInt(4000) - delegation.Undelegate(epoch5, amount5) + delegation.Undelegate(epoch5, amount5, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, false) if result.Cmp(big.NewInt(4000)) != 0 { @@ -116,7 +116,7 @@ func TestQuickUnlock(t *testing.T) { epoch7 := big.NewInt(44) amount7 := big.NewInt(4000) - delegation.Undelegate(epoch7, amount7) + delegation.Undelegate(epoch7, amount7, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 0, false) if result.Cmp(big.NewInt(4000)) != 0 { @@ -131,7 +131,7 @@ func TestUnlockedFullPeriodFail(t *testing.T) { epoch5 := big.NewInt(28) amount5 := big.NewInt(4000) - delegation.Undelegate(epoch5, amount5) + delegation.Undelegate(epoch5, amount5, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, false) if result.Cmp(big.NewInt(0)) != 0 { @@ -145,7 +145,7 @@ func TestUnlockedPremature(t *testing.T) { epoch6 := big.NewInt(42) amount6 := big.NewInt(4000) - delegation.Undelegate(epoch6, amount6) + delegation.Undelegate(epoch6, amount6, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, false) if result.Cmp(big.NewInt(0)) != 0 { @@ -159,7 +159,7 @@ func TestNoEarlyUnlock(t *testing.T) { epoch4 := big.NewInt(21) amount4 := big.NewInt(4000) - delegation.Undelegate(epoch4, amount4) + delegation.Undelegate(epoch4, amount4, nil) result := delegation.RemoveUnlockedUndelegations(curEpoch, lastEpochInCommittee, 7, true) if result.Cmp(big.NewInt(0)) != 0 { diff --git a/test/chain/reward/main.go b/test/chain/reward/main.go index 17be3b271..165b61e36 100644 --- a/test/chain/reward/main.go +++ b/test/chain/reward/main.go @@ -139,7 +139,7 @@ func main() { fmt.Printf("Time required to calc percentage %d delegations: %f seconds\n", len(validator.Delegations), endTime.Sub(startTime).Seconds()) startTime = time.Now() - statedb.AddReward(validator, big.NewInt(1000), shares) + statedb.AddReward(validator, big.NewInt(1000), shares, false) endTime = time.Now() fmt.Printf("Time required to reward a validator with %d delegations: %f seconds\n", len(validator.Delegations), endTime.Sub(startTime).Seconds())