mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
code refactor for performance (#782)
Co-authored-by: liam.lai <liam.lai@us>
This commit is contained in:
parent
911fe219df
commit
f8decab061
6 changed files with 74 additions and 41 deletions
7
.github/workflows/deploy_rpc_image.yml
vendored
7
.github/workflows/deploy_rpc_image.yml
vendored
|
|
@ -6,19 +6,19 @@ on:
|
||||||
network:
|
network:
|
||||||
type: choice
|
type: choice
|
||||||
description: 'devnet, testnet, or mainnet'
|
description: 'devnet, testnet, or mainnet'
|
||||||
options:
|
options:
|
||||||
- devnet
|
- devnet
|
||||||
- testnet
|
- testnet
|
||||||
- mainnet
|
- mainnet
|
||||||
rpc_image:
|
rpc_image:
|
||||||
description: 'full image name'
|
description: 'full image name'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ansible:
|
ansible:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Update RPC nodes image
|
- name: Update RPC nodes image
|
||||||
uses: dawidd6/action-ansible-playbook@v2
|
uses: dawidd6/action-ansible-playbook@v2
|
||||||
with:
|
with:
|
||||||
|
|
@ -38,4 +38,3 @@ jobs:
|
||||||
- name: Send deployment notification
|
- name: Send deployment notification
|
||||||
run: |
|
run: |
|
||||||
curl --location --request POST "66.94.98.186:8080/deploy?environment=${{inputs.network}}&service=xdc_rpc&version=${{inputs.rpc_image}}"
|
curl --location --request POST "66.94.98.186:8080/deploy?environment=${{inputs.network}}&service=xdc_rpc&version=${{inputs.rpc_image}}"
|
||||||
|
|
||||||
|
|
@ -98,7 +98,7 @@ func (x *XDPoS_v2) getEpochSwitchInfo(chain consensus.ChainReader, header *types
|
||||||
|
|
||||||
// IsEpochSwitchAtRound() is used by miner to check whether it mines a block in the same epoch with parent
|
// IsEpochSwitchAtRound() is used by miner to check whether it mines a block in the same epoch with parent
|
||||||
func (x *XDPoS_v2) isEpochSwitchAtRound(round types.Round, parentHeader *types.Header) (bool, uint64, error) {
|
func (x *XDPoS_v2) isEpochSwitchAtRound(round types.Round, parentHeader *types.Header) (bool, uint64, error) {
|
||||||
epochNum := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(round)/x.config.Epoch
|
epochNum := x.config.V2.SwitchEpoch + uint64(round)/x.config.Epoch
|
||||||
// if parent is last v1 block and this is first v2 block, this is treated as epoch switch
|
// if parent is last v1 block and this is first v2 block, this is treated as epoch switch
|
||||||
if parentHeader.Number.Cmp(x.config.V2.SwitchBlock) == 0 {
|
if parentHeader.Number.Cmp(x.config.V2.SwitchBlock) == 0 {
|
||||||
return true, epochNum, nil
|
return true, epochNum, nil
|
||||||
|
|
@ -127,7 +127,7 @@ func (x *XDPoS_v2) GetCurrentEpochSwitchBlock(chain consensus.ChainReader, block
|
||||||
}
|
}
|
||||||
|
|
||||||
currentCheckpointNumber := epochSwitchInfo.EpochSwitchBlockInfo.Number.Uint64()
|
currentCheckpointNumber := epochSwitchInfo.EpochSwitchBlockInfo.Number.Uint64()
|
||||||
epochNum := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(epochSwitchInfo.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
epochNum := x.config.V2.SwitchEpoch + uint64(epochSwitchInfo.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
||||||
return currentCheckpointNumber, epochNum, nil
|
return currentCheckpointNumber, epochNum, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,7 +145,7 @@ func (x *XDPoS_v2) IsEpochSwitch(header *types.Header) (bool, uint64, error) {
|
||||||
}
|
}
|
||||||
parentRound := quorumCert.ProposedBlockInfo.Round
|
parentRound := quorumCert.ProposedBlockInfo.Round
|
||||||
epochStartRound := round - round%types.Round(x.config.Epoch)
|
epochStartRound := round - round%types.Round(x.config.Epoch)
|
||||||
epochNum := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(round)/x.config.Epoch
|
epochNum := x.config.V2.SwitchEpoch + uint64(round)/x.config.Epoch
|
||||||
// if parent is last v1 block and this is first v2 block, this is treated as epoch switch
|
// if parent is last v1 block and this is first v2 block, this is treated as epoch switch
|
||||||
if quorumCert.ProposedBlockInfo.Number.Cmp(x.config.V2.SwitchBlock) == 0 {
|
if quorumCert.ProposedBlockInfo.Number.Cmp(x.config.V2.SwitchBlock) == 0 {
|
||||||
log.Info("[IsEpochSwitch] true, parent equals V2.SwitchBlock", "round", round, "number", header.Number.Uint64(), "hash", header.Hash())
|
log.Info("[IsEpochSwitch] true, parent equals V2.SwitchBlock", "round", round, "number", header.Number.Uint64(), "hash", header.Hash())
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,43 @@ func (x *XDPoS_v2) onTimeoutPoolThresholdReached(blockChainReader consensus.Chai
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *XDPoS_v2) getTCEpochInfo(chain consensus.ChainReader, timeoutCert *types.TimeoutCert) (*types.EpochSwitchInfo, error) {
|
||||||
|
|
||||||
|
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, (chain.CurrentHeader()), (chain.CurrentHeader()).Hash())
|
||||||
|
if err != nil {
|
||||||
|
log.Error("[getTCEpochInfo] Error when getting epoch switch info", "error", err)
|
||||||
|
return nil, fmt.Errorf("fail on getTCEpochInfo due to failure in getting epoch switch info, %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
epochRound := epochSwitchInfo.EpochSwitchBlockInfo.Round
|
||||||
|
tempTCEpoch := x.config.V2.SwitchEpoch + uint64(epochRound)/x.config.Epoch
|
||||||
|
|
||||||
|
epochBlockInfo := &types.BlockInfo{
|
||||||
|
Hash: epochSwitchInfo.EpochSwitchBlockInfo.Hash,
|
||||||
|
Round: epochRound,
|
||||||
|
Number: epochSwitchInfo.EpochSwitchBlockInfo.Number,
|
||||||
|
}
|
||||||
|
log.Info("[getTCEpochInfo] Init epochInfo", "number", epochBlockInfo.Number, "round", epochRound, "tcRound", timeoutCert.Round, "tcEpoch", tempTCEpoch)
|
||||||
|
for epochBlockInfo.Round > timeoutCert.Round {
|
||||||
|
tempTCEpoch--
|
||||||
|
epochBlockInfo, err = x.GetBlockByEpochNumber(chain, tempTCEpoch)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("[getTCEpochInfo] Error when getting epoch block info by tc round", "error", err)
|
||||||
|
return nil, fmt.Errorf("fail on getTCEpochInfo due to failure in getting epoch block info tc round, %s", err)
|
||||||
|
}
|
||||||
|
log.Debug("[getTCEpochInfo] Loop to get right epochInfo", "number", epochBlockInfo.Number, "round", epochBlockInfo.Round, "tcRound", timeoutCert.Round, "tcEpoch", tempTCEpoch)
|
||||||
|
}
|
||||||
|
tcEpoch := tempTCEpoch
|
||||||
|
log.Info("[getTCEpochInfo] Final TC epochInfo", "number", epochBlockInfo.Number, "round", epochBlockInfo.Round, "tcRound", timeoutCert.Round, "tcEpoch", tcEpoch)
|
||||||
|
|
||||||
|
epochInfo, err := x.getEpochSwitchInfo(chain, nil, epochBlockInfo.Hash)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("[getTCEpochInfo] Error when getting epoch switch info", "error", err)
|
||||||
|
return nil, fmt.Errorf("fail on getTCEpochInfo due to failure in getting epoch switch info, %s", err)
|
||||||
|
}
|
||||||
|
return epochInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (x *XDPoS_v2) verifyTC(chain consensus.ChainReader, timeoutCert *types.TimeoutCert) error {
|
func (x *XDPoS_v2) verifyTC(chain consensus.ChainReader, timeoutCert *types.TimeoutCert) error {
|
||||||
/*
|
/*
|
||||||
1. Get epoch master node list by gapNumber
|
1. Get epoch master node list by gapNumber
|
||||||
|
|
@ -110,37 +147,9 @@ func (x *XDPoS_v2) verifyTC(chain consensus.ChainReader, timeoutCert *types.Time
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
epochSwitchInfo, err := x.getEpochSwitchInfo(chain, (chain.CurrentHeader()), (chain.CurrentHeader()).Hash())
|
epochInfo, err := x.getTCEpochInfo(chain, timeoutCert)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("[verifyTC] Error when getting epoch switch info", "error", err)
|
return err
|
||||||
return fmt.Errorf("fail on verifyTC due to failure in getting epoch switch info, %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
epochRound := epochSwitchInfo.EpochSwitchBlockInfo.Round
|
|
||||||
tempTCEpoch := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(epochRound)/x.config.Epoch
|
|
||||||
|
|
||||||
epochBlockInfo := &types.BlockInfo{
|
|
||||||
Hash: epochSwitchInfo.EpochSwitchBlockInfo.Hash,
|
|
||||||
Round: epochRound,
|
|
||||||
Number: epochSwitchInfo.EpochSwitchBlockInfo.Number,
|
|
||||||
}
|
|
||||||
log.Info("[verifyTC] Init epochInfo", "number", epochBlockInfo.Number, "round", epochRound, "tcRound", timeoutCert.Round, "tcEpoch", tempTCEpoch)
|
|
||||||
for epochBlockInfo.Round > timeoutCert.Round {
|
|
||||||
tempTCEpoch--
|
|
||||||
epochBlockInfo, err = x.GetBlockByEpochNumber(chain, tempTCEpoch)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("[verifyTC] Error when getting epoch block info by tc round", "error", err)
|
|
||||||
return fmt.Errorf("fail on verifyTC due to failure in getting epoch block info tc round, %s", err)
|
|
||||||
}
|
|
||||||
log.Debug("[verifyTC] Loop to get right epochInfo", "number", epochBlockInfo.Number, "round", epochBlockInfo.Round, "tcRound", timeoutCert.Round, "tcEpoch", tempTCEpoch)
|
|
||||||
}
|
|
||||||
tcEpoch := tempTCEpoch
|
|
||||||
log.Info("[verifyTC] Final TC epochInfo", "number", epochBlockInfo.Number, "round", epochBlockInfo.Round, "tcRound", timeoutCert.Round, "tcEpoch", tcEpoch)
|
|
||||||
|
|
||||||
epochInfo, err := x.getEpochSwitchInfo(chain, nil, epochBlockInfo.Hash)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("[verifyTC] Error when getting epoch switch info", "error", err)
|
|
||||||
return fmt.Errorf("fail on verifyTC due to failure in getting epoch switch info, %s", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
certThreshold := x.config.V2.Config(uint64(timeoutCert.Round)).CertThreshold
|
certThreshold := x.config.V2.Config(uint64(timeoutCert.Round)).CertThreshold
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ func (x *XDPoS_v2) GetBlockByEpochNumber(chain consensus.ChainReader, targetEpoc
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
epochNum := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(epochSwitchInfo.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
epochNum := x.config.V2.SwitchEpoch + uint64(epochSwitchInfo.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
||||||
// if current epoch is this epoch, we early return the result
|
// if current epoch is this epoch, we early return the result
|
||||||
if targetEpochNum == epochNum {
|
if targetEpochNum == epochNum {
|
||||||
return epochSwitchInfo.EpochSwitchBlockInfo, nil
|
return epochSwitchInfo.EpochSwitchBlockInfo, nil
|
||||||
|
|
@ -304,11 +304,11 @@ func (x *XDPoS_v2) GetBlockByEpochNumber(chain consensus.ChainReader, targetEpoc
|
||||||
if targetEpochNum > epochNum {
|
if targetEpochNum > epochNum {
|
||||||
return nil, errors.New("input epoch number > current epoch number")
|
return nil, errors.New("input epoch number > current epoch number")
|
||||||
}
|
}
|
||||||
if targetEpochNum < x.config.V2.SwitchBlock.Uint64()/x.config.Epoch {
|
if targetEpochNum < x.config.V2.SwitchEpoch {
|
||||||
return nil, errors.New("input epoch number < v2 begin epoch number")
|
return nil, errors.New("input epoch number < v2 begin epoch number")
|
||||||
}
|
}
|
||||||
// the block's round should be in [estRound,estRound+Epoch-1]
|
// the block's round should be in [estRound,estRound+Epoch-1]
|
||||||
estRound := types.Round((targetEpochNum - x.config.V2.SwitchBlock.Uint64()/x.config.Epoch) * x.config.Epoch)
|
estRound := types.Round((targetEpochNum - x.config.V2.SwitchEpoch) * x.config.Epoch)
|
||||||
// check the round2epochBlockInfo cache
|
// check the round2epochBlockInfo cache
|
||||||
blockInfo := x.getBlockByEpochNumberInCache(chain, estRound)
|
blockInfo := x.getBlockByEpochNumberInCache(chain, estRound)
|
||||||
if blockInfo != nil {
|
if blockInfo != nil {
|
||||||
|
|
@ -330,7 +330,7 @@ func (x *XDPoS_v2) GetBlockByEpochNumber(chain consensus.ChainReader, targetEpoc
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, info := range epochSwitchInfos {
|
for _, info := range epochSwitchInfos {
|
||||||
epochNum := x.config.V2.SwitchBlock.Uint64()/x.config.Epoch + uint64(info.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
epochNum := x.config.V2.SwitchEpoch + uint64(info.EpochSwitchBlockInfo.Round)/x.config.Epoch
|
||||||
if epochNum == targetEpochNum {
|
if epochNum == targetEpochNum {
|
||||||
return info.EpochSwitchBlockInfo, nil
|
return info.EpochSwitchBlockInfo, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,7 @@ var (
|
||||||
Gap: 450,
|
Gap: 450,
|
||||||
FoudationWalletAddr: common.HexToAddress("xdc92a289fe95a85c53b8d0d113cbaef0c1ec98ac65"),
|
FoudationWalletAddr: common.HexToAddress("xdc92a289fe95a85c53b8d0d113cbaef0c1ec98ac65"),
|
||||||
V2: &V2{
|
V2: &V2{
|
||||||
|
SwitchEpoch: common.TIPV2SwitchBlock.Uint64() / 900,
|
||||||
SwitchBlock: common.TIPV2SwitchBlock,
|
SwitchBlock: common.TIPV2SwitchBlock,
|
||||||
CurrentConfig: MainnetV2Configs[0],
|
CurrentConfig: MainnetV2Configs[0],
|
||||||
AllConfigs: MainnetV2Configs,
|
AllConfigs: MainnetV2Configs,
|
||||||
|
|
@ -222,6 +223,7 @@ var (
|
||||||
Gap: 450,
|
Gap: 450,
|
||||||
FoudationWalletAddr: common.HexToAddress("xdc746249c61f5832c5eed53172776b460491bdcd5c"),
|
FoudationWalletAddr: common.HexToAddress("xdc746249c61f5832c5eed53172776b460491bdcd5c"),
|
||||||
V2: &V2{
|
V2: &V2{
|
||||||
|
SwitchEpoch: common.TIPV2SwitchBlock.Uint64() / 900,
|
||||||
SwitchBlock: common.TIPV2SwitchBlock,
|
SwitchBlock: common.TIPV2SwitchBlock,
|
||||||
CurrentConfig: TestnetV2Configs[0],
|
CurrentConfig: TestnetV2Configs[0],
|
||||||
AllConfigs: TestnetV2Configs,
|
AllConfigs: TestnetV2Configs,
|
||||||
|
|
@ -246,6 +248,7 @@ var (
|
||||||
Gap: 450,
|
Gap: 450,
|
||||||
FoudationWalletAddr: common.HexToAddress("0x746249c61f5832c5eed53172776b460491bdcd5c"),
|
FoudationWalletAddr: common.HexToAddress("0x746249c61f5832c5eed53172776b460491bdcd5c"),
|
||||||
V2: &V2{
|
V2: &V2{
|
||||||
|
SwitchEpoch: common.TIPV2SwitchBlock.Uint64() / 900,
|
||||||
SwitchBlock: common.TIPV2SwitchBlock,
|
SwitchBlock: common.TIPV2SwitchBlock,
|
||||||
CurrentConfig: DevnetV2Configs[0],
|
CurrentConfig: DevnetV2Configs[0],
|
||||||
AllConfigs: DevnetV2Configs,
|
AllConfigs: DevnetV2Configs,
|
||||||
|
|
@ -269,6 +272,7 @@ var (
|
||||||
Period: 15,
|
Period: 15,
|
||||||
Epoch: 900,
|
Epoch: 900,
|
||||||
V2: &V2{
|
V2: &V2{
|
||||||
|
SwitchEpoch: 9999999999 / 900,
|
||||||
SwitchBlock: big.NewInt(9999999999),
|
SwitchBlock: big.NewInt(9999999999),
|
||||||
CurrentConfig: MainnetV2Configs[0],
|
CurrentConfig: MainnetV2Configs[0],
|
||||||
AllConfigs: MainnetV2Configs,
|
AllConfigs: MainnetV2Configs,
|
||||||
|
|
@ -355,6 +359,7 @@ var (
|
||||||
FoudationWalletAddr: common.HexToAddress("0x0000000000000000000000000000000000000068"),
|
FoudationWalletAddr: common.HexToAddress("0x0000000000000000000000000000000000000068"),
|
||||||
Reward: 250,
|
Reward: 250,
|
||||||
V2: &V2{
|
V2: &V2{
|
||||||
|
SwitchEpoch: 1,
|
||||||
SwitchBlock: big.NewInt(900),
|
SwitchBlock: big.NewInt(900),
|
||||||
CurrentConfig: UnitTestV2Configs[0],
|
CurrentConfig: UnitTestV2Configs[0],
|
||||||
AllConfigs: UnitTestV2Configs,
|
AllConfigs: UnitTestV2Configs,
|
||||||
|
|
@ -451,6 +456,7 @@ type XDPoSConfig struct {
|
||||||
type V2 struct {
|
type V2 struct {
|
||||||
lock sync.RWMutex // Protects the signer fields
|
lock sync.RWMutex // Protects the signer fields
|
||||||
|
|
||||||
|
SwitchEpoch uint64
|
||||||
SwitchBlock *big.Int `json:"switchBlock"`
|
SwitchBlock *big.Int `json:"switchBlock"`
|
||||||
CurrentConfig *V2Config `json:"config"`
|
CurrentConfig *V2Config `json:"config"`
|
||||||
AllConfigs map[uint64]*V2Config `json:"allConfigs"`
|
AllConfigs map[uint64]*V2Config `json:"allConfigs"`
|
||||||
|
|
|
||||||
|
|
@ -117,3 +117,22 @@ func TestBuildConfigIndex(t *testing.T) {
|
||||||
expected := []uint64{900, 10, 0}
|
expected := []uint64{900, 10, 0}
|
||||||
assert.Equal(t, expected, index)
|
assert.Equal(t, expected, index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test switch epoch is switchblock divide into epoch per block
|
||||||
|
func TestSwitchEpoch(t *testing.T) {
|
||||||
|
config := XDCMainnetChainConfig.XDPoS
|
||||||
|
epoch := config.Epoch
|
||||||
|
assert.Equal(t, config.V2.SwitchEpoch, config.V2.SwitchBlock.Uint64()/epoch)
|
||||||
|
|
||||||
|
config = TestnetChainConfig.XDPoS
|
||||||
|
epoch = config.Epoch
|
||||||
|
assert.Equal(t, config.V2.SwitchEpoch, config.V2.SwitchBlock.Uint64()/epoch)
|
||||||
|
|
||||||
|
config = DevnetChainConfig.XDPoS
|
||||||
|
epoch = config.Epoch
|
||||||
|
assert.Equal(t, config.V2.SwitchEpoch, config.V2.SwitchBlock.Uint64()/epoch)
|
||||||
|
|
||||||
|
config = TestXDPoSMockChainConfig.XDPoS
|
||||||
|
epoch = config.Epoch
|
||||||
|
assert.Equal(t, config.V2.SwitchEpoch, config.V2.SwitchBlock.Uint64()/epoch)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue