Skip to content

Commit

Permalink
Port Arianee network related bug fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan-Ethernal committed May 7, 2024
1 parent 36fa7a6 commit 217d234
Show file tree
Hide file tree
Showing 39 changed files with 1,822 additions and 100 deletions.
6 changes: 6 additions & 0 deletions chain/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package chain

import (
"errors"
"fmt"
"sort"

"github.com/0xPolygon/polygon-edge/helper/common"
Expand Down Expand Up @@ -167,6 +168,11 @@ type ForksInTime struct {
EIP155 bool
}

func (f ForksInTime) String() string {
return fmt.Sprintf("Homestead: %t, Byzantium: %t, Constantinople: %t, Petersburg: %t, Istanbul: %t, London: %t, EIP150: %t, EIP158: %t, EIP155: %t",
f.Homestead, f.Byzantium, f.Constantinople, f.Petersburg, f.Istanbul, f.London, f.EIP150, f.EIP158, f.EIP155)
}

// AllForksEnabled should contain all supported forks by current edge version
var AllForksEnabled = &Forks{
Homestead: NewFork(0),
Expand Down
7 changes: 7 additions & 0 deletions command/genesis/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,13 @@ func setFlags(cmd *cobra.Command) {
defaultBlockTimeDrift,
"configuration for block time drift value (in seconds)",
)

cmd.Flags().DurationVar(
&params.blockTrackerPollInterval,
blockTrackerPollIntervalFlag,
defaultBlockTrackerPollInterval,
"interval (number of seconds) at which block tracker polls for latest block at rootchain",
)
}

// Access Control Lists
Expand Down
48 changes: 33 additions & 15 deletions command/genesis/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,21 @@ import (
)

const (
dirFlag = "dir"
nameFlag = "name"
premineFlag = "premine"
chainIDFlag = "chain-id"
epochSizeFlag = "epoch-size"
epochRewardFlag = "epoch-reward"
blockGasLimitFlag = "block-gas-limit"
burnContractFlag = "burn-contract"
posFlag = "pos"
minValidatorCount = "min-validator-count"
maxValidatorCount = "max-validator-count"
nativeTokenConfigFlag = "native-token-config"
rewardTokenCodeFlag = "reward-token-code"
rewardWalletFlag = "reward-wallet"
dirFlag = "dir"
nameFlag = "name"
premineFlag = "premine"
chainIDFlag = "chain-id"
epochSizeFlag = "epoch-size"
epochRewardFlag = "epoch-reward"
blockGasLimitFlag = "block-gas-limit"
burnContractFlag = "burn-contract"
posFlag = "pos"
minValidatorCount = "min-validator-count"
maxValidatorCount = "max-validator-count"
nativeTokenConfigFlag = "native-token-config"
rewardTokenCodeFlag = "reward-token-code"
rewardWalletFlag = "reward-wallet"
blockTrackerPollIntervalFlag = "block-tracker-poll-interval"

defaultNativeTokenName = "Polygon"
defaultNativeTokenSymbol = "MATIC"
Expand All @@ -61,7 +62,8 @@ var (
errInvalidEpochSize = errors.New("epoch size must be greater than 1")
errInvalidTokenParams = errors.New("native token params were not submitted in proper format " +
"(<name:symbol:decimals count:mintable flag:[mintable token owner address]>)")
errRewardWalletAmountZero = errors.New("reward wallet amount can not be zero or negative")
errRewardWalletAmountZero = errors.New("reward wallet amount can not be zero or negative")
errBlockTrackerPollInterval = errors.New("block tracker poll interval must be greater than 0")
)

type genesisParams struct {
Expand Down Expand Up @@ -127,6 +129,8 @@ type genesisParams struct {
// rewards
rewardTokenCode string
rewardWallet string

blockTrackerPollInterval time.Duration
}

func (p *genesisParams) validateFlags() error {
Expand Down Expand Up @@ -154,6 +158,10 @@ func (p *genesisParams) validateFlags() error {
if err := p.validateRewardWallet(); err != nil {
return err
}

if err := p.validateBlockTrackerPollInterval(); err != nil {
return err
}
}

// Check if the genesis file already exists
Expand Down Expand Up @@ -476,6 +484,16 @@ func (p *genesisParams) validateRewardWallet() error {
return nil
}

// validateBlockTrackerPollInterval validates block tracker block interval
// which can not be 0
func (p *genesisParams) validateBlockTrackerPollInterval() error {
if p.blockTrackerPollInterval == 0 {
return errBlockTrackerPollInterval
}

return nil
}

// validateBurnContract validates burn contract. If native token is mintable,
// burn contract flag must not be set. If native token is non mintable only one burn contract
// can be set and the specified address will be used to predeploy default EIP1559 burn contract.
Expand Down
16 changes: 9 additions & 7 deletions command/genesis/polybft_params.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,13 @@ const (

blockTimeDriftFlag = "block-time-drift"

defaultEpochSize = uint64(10)
defaultSprintSize = uint64(5)
defaultValidatorSetSize = 100
defaultBlockTime = 2 * time.Second
defaultEpochReward = 1
defaultBlockTimeDrift = uint64(10)
defaultEpochSize = uint64(10)
defaultSprintSize = uint64(5)
defaultValidatorSetSize = 100
defaultBlockTime = 2 * time.Second
defaultEpochReward = 1
defaultBlockTimeDrift = uint64(10)
defaultBlockTrackerPollInterval = time.Second

contractDeployerAllowListAdminFlag = "contract-deployer-allow-list-admin"
contractDeployerAllowListEnabledFlag = "contract-deployer-allow-list-enabled"
Expand Down Expand Up @@ -153,7 +154,8 @@ func (p *genesisParams) generatePolyBftChainConfig(o command.OutputFormatter) er
WalletAddress: walletPremineInfo.address,
WalletAmount: walletPremineInfo.amount,
},
BlockTimeDrift: p.blockTimeDrift,
BlockTimeDrift: p.blockTimeDrift,
BlockTrackerPollInterval: common.Duration{Duration: p.blockTrackerPollInterval},
}

// Disable london hardfork if burn contract address is not provided
Expand Down
1 change: 1 addition & 0 deletions consensus/polybft/block_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ func (b *BlockBuilder) WriteTx(tx *types.Transaction) error {
return txpool.ErrBlockLimitExceeded
}

b.params.Logger.Debug(fmt.Sprintf("[BlockBuilder.WriteTx] tx: %s", tx))
if err := b.state.Write(tx); err != nil {
return err
}
Expand Down
30 changes: 28 additions & 2 deletions consensus/polybft/blockchain_wrapper.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package polybft

import (
"bytes"
"errors"
"fmt"
"math/big"
Expand Down Expand Up @@ -67,6 +68,7 @@ type blockchainBackend interface {
var _ blockchainBackend = &blockchainWrapper{}

type blockchainWrapper struct {
logger hclog.Logger
executor *state.Executor
blockchain *blockchain.Blockchain
}
Expand All @@ -86,27 +88,51 @@ func (p *blockchainWrapper) ProcessBlock(parent *types.Header, block *types.Bloc
header := block.Header.Copy()
start := time.Now().UTC()

p.logger.Debug("[BlockchainWrapper.ProcessBlock]",
"block number", block.Number(),
"block hash", block.Hash(),
"parent hash", parent.Hash,
"parent state root", parent.StateRoot,
"block state root", block.Header.StateRoot,
"miner", types.BytesToAddress(header.Miner))
defer p.logger.Debug("[BlockchainWrapper.ProcessBlock] finished",
"block number", block.Number(),
"block hash", block.Hash(),
"parent hash", parent.Hash,
"parent state root", parent.StateRoot,
"block state root", block.Header.StateRoot,
"miner", types.BytesToAddress(header.Miner))

transition, err := p.executor.BeginTxn(parent.StateRoot, header, types.BytesToAddress(header.Miner))
if err != nil {
return nil, err
}

var buf bytes.Buffer
// apply transactions from block
for _, tx := range block.Transactions {
if p.logger.IsDebug() {
buf.WriteString(fmt.Sprintf("%s\n", tx))
}

if err = transition.Write(tx); err != nil {
return nil, fmt.Errorf("process block tx error, tx = %v, err = %w", tx.Hash, err)
}
}

if p.logger.IsDebug() {
p.logger.Debug(fmt.Sprintf("Block txs %s", buf.String()))
}

_, root, err := transition.Commit()
if err != nil {
return nil, fmt.Errorf("failed to commit the state changes: %w", err)
}

updateBlockExecutionMetric(start)

if root != block.Header.StateRoot {
return nil, fmt.Errorf("incorrect state root: (%s, %s)", root, block.Header.StateRoot)
if root != header.StateRoot {
return nil, fmt.Errorf("incorrect state root: (%s, %s)", root, header.StateRoot)
}

// build the block
Expand Down
29 changes: 17 additions & 12 deletions consensus/polybft/checkpoint_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,18 +122,13 @@ func (c *checkpointManager) submitCheckpoint(latestHeader *types.Header, isEndOf
"latest checkpoint block", lastCheckpointBlockNumber,
"checkpoint block", latestHeader.Number)

checkpointManagerAddr := ethgo.Address(c.checkpointManagerAddr)
txn := &ethgo.Transaction{
To: &checkpointManagerAddr,
From: c.key.Address(),
}
initialBlockNumber := lastCheckpointBlockNumber + 1

var (
parentExtra *Extra
parentHeader *types.Header
currentExtra *Extra
found bool
checkpointManagerAddr = ethgo.Address(c.checkpointManagerAddr)
initialBlockNumber = lastCheckpointBlockNumber + 1
parentExtra *Extra
parentHeader *types.Header
currentExtra *Extra
found bool
)

if initialBlockNumber < latestHeader.Number {
Expand Down Expand Up @@ -170,6 +165,11 @@ func (c *checkpointManager) submitCheckpoint(latestHeader *types.Header, isEndOf
continue
}

txn := &ethgo.Transaction{
To: &checkpointManagerAddr,
From: c.key.Address(),
}

if err = c.encodeAndSendCheckpoint(txn, parentHeader, parentExtra, true); err != nil {
return err
}
Expand All @@ -188,6 +188,11 @@ func (c *checkpointManager) submitCheckpoint(latestHeader *types.Header, isEndOf
}
}

txn := &ethgo.Transaction{
To: &checkpointManagerAddr,
From: c.key.Address(),
}

return c.encodeAndSendCheckpoint(txn, latestHeader, currentExtra, isEndOfEpoch)
}

Expand Down Expand Up @@ -226,7 +231,7 @@ func (c *checkpointManager) encodeAndSendCheckpoint(txn *ethgo.Transaction,

// update checkpoint block number metrics
metrics.SetGauge([]string{"bridge", "checkpoint_block_number"}, float32(header.Number))
c.logger.Debug("send checkpoint txn success", "block number", header.Number)
c.logger.Debug("send checkpoint txn success", "block number", header.Number, "gasUsed", receipt.GasUsed)

return nil
}
Expand Down
45 changes: 33 additions & 12 deletions consensus/polybft/consensus_runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ func newConsensusRuntime(log hcf.Logger, config *runtimeConfig) (*consensusRunti
return nil, fmt.Errorf("consensus runtime creation - restart epoch failed: %w", err)
}

runtime.logger.Debug("consensus runtime initialized",
"block hash", runtime.lastBuiltBlock.Hash,
"block number", runtime.lastBuiltBlock.Number,
"state root", runtime.lastBuiltBlock.StateRoot)

return runtime, nil
}

Expand All @@ -171,14 +176,15 @@ func (c *consensusRuntime) initStateSyncManager(logger hcf.Logger) error {
logger.Named("state-sync-manager"),
c.config.State,
&stateSyncConfig{
key: c.config.Key,
stateSenderAddr: stateSenderAddr,
stateSenderStartBlock: c.config.PolyBFTConfig.Bridge.EventTrackerStartBlocks[stateSenderAddr],
jsonrpcAddr: c.config.PolyBFTConfig.Bridge.JSONRPCEndpoint,
dataDir: c.config.DataDir,
topic: c.config.bridgeTopic,
maxCommitmentSize: maxCommitmentSize,
numBlockConfirmations: c.config.numBlockConfirmations,
key: c.config.Key,
stateSenderAddr: stateSenderAddr,
stateSenderStartBlock: c.config.PolyBFTConfig.Bridge.EventTrackerStartBlocks[stateSenderAddr],
jsonrpcAddr: c.config.PolyBFTConfig.Bridge.JSONRPCEndpoint,
dataDir: c.config.DataDir,
topic: c.config.bridgeTopic,
maxCommitmentSize: maxCommitmentSize,
numBlockConfirmations: c.config.numBlockConfirmations,
blockTrackerPollInterval: c.config.PolyBFTConfig.BlockTrackerPollInterval,
},
)

Expand All @@ -195,7 +201,9 @@ func (c *consensusRuntime) initStateSyncManager(logger hcf.Logger) error {
func (c *consensusRuntime) initCheckpointManager(logger hcf.Logger) error {
if c.IsBridgeEnabled() {
// enable checkpoint manager
txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithIPAddress(c.config.PolyBFTConfig.Bridge.JSONRPCEndpoint))
txRelayer, err := txrelayer.NewTxRelayer(
txrelayer.WithIPAddress(c.config.PolyBFTConfig.Bridge.JSONRPCEndpoint),
txrelayer.WithWriter(logger.StandardWriter(&hcf.StandardLoggerOptions{})))
if err != nil {
return err
}
Expand Down Expand Up @@ -263,13 +271,26 @@ func (c *consensusRuntime) IsBridgeEnabled() bool {
}

// OnBlockInserted is called whenever fsm or syncer inserts new block
func (c *consensusRuntime) OnBlockInserted(fullBlock *types.FullBlock) {
func (c *consensusRuntime) OnBlockInserted(fullBlock *types.FullBlock, source string) {
c.lock.Lock()
defer c.lock.Unlock()

c.logger.Debug(
"OnBlockInserted",
"source", source,
"header number", fullBlock.Block.Number(),
"header hash", fullBlock.Block.Hash(),
"state root", fullBlock.Block.Header.StateRoot)
defer c.logger.Debug(
"OnBlockInserted finished",
"source", source,
"header number", fullBlock.Block.Number(),
"header hash", fullBlock.Block.Hash(),
"state root", fullBlock.Block.Header.StateRoot)

if c.lastBuiltBlock != nil && c.lastBuiltBlock.Number >= fullBlock.Block.Number() {
c.logger.Debug("on block inserted already handled",
"current", c.lastBuiltBlock.Number, "block", fullBlock.Block.Number())
"current", c.lastBuiltBlock.Number, "block", fullBlock.Block.Number(), "source", source)

return
}
Expand Down Expand Up @@ -752,7 +773,7 @@ func (c *consensusRuntime) InsertProposal(proposal *proto.Proposal, committedSea
return
}

c.OnBlockInserted(fullBlock)
c.OnBlockInserted(fullBlock, "consensus")
}

// ID return ID (address actually) of the current node
Expand Down
4 changes: 2 additions & 2 deletions consensus/polybft/consensus_runtime_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ func TestConsensusRuntime_OnBlockInserted_EndOfEpoch(t *testing.T) {
checkpointManager: &dummyCheckpointManager{},
stakeManager: &dummyStakeManager{},
}
runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock})
runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock}, "")

require.True(t, runtime.state.EpochStore.isEpochInserted(currentEpochNumber+1))
require.Equal(t, newEpochNumber, runtime.epoch.Number)
Expand Down Expand Up @@ -285,7 +285,7 @@ func TestConsensusRuntime_OnBlockInserted_MiddleOfEpoch(t *testing.T) {
logger: hclog.NewNullLogger(),
proposerCalculator: NewProposerCalculatorFromSnapshot(snapshot, config, hclog.NewNullLogger()),
}
runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock})
runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock}, "")

require.Equal(t, header.Number, runtime.lastBuiltBlock.Number)
}
Expand Down
Loading

0 comments on commit 217d234

Please sign in to comment.