chore: rialto network for testing
This commit is contained in:
parent
7ade1d2a5d
commit
5bba0e11e9
@ -1172,10 +1172,13 @@ func (p *Parlia) Finalize(chain consensus.ChainHeaderReader, header *types.Heade
|
|||||||
if parent == nil {
|
if parent == nil {
|
||||||
return errors.New("parent not found")
|
return errors.New("parent not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Info("!!! DEBUG Finalize block time", "number", header.Number, "time", header.Time, "parent time", parent.Time)
|
||||||
if p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
if p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
||||||
err := p.initializeFeynmanContract(state, header, cx, txs, receipts, systemTxs, usedGas, false)
|
err := p.initializeFeynmanContract(state, header, cx, txs, receipts, systemTxs, usedGas, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("init feynman contract failed", "error", err)
|
log.Error("init feynman contract failed", "error", err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1242,11 +1245,13 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *
|
|||||||
|
|
||||||
err := p.distributeIncoming(p.val, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true)
|
err := p.distributeIncoming(p.val, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error("p.distributeIncoming failed", "err", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.chainConfig.IsPlato(header.Number) {
|
if p.chainConfig.IsPlato(header.Number) {
|
||||||
if err := p.distributeFinalityReward(chain, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true); err != nil {
|
if err := p.distributeFinalityReward(chain, state, header, cx, &txs, &receipts, nil, &header.GasUsed, true); err != nil {
|
||||||
|
log.Error("p.p.distributeFinalityReward after Plato failed", "err", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1255,10 +1260,12 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *
|
|||||||
if parent == nil {
|
if parent == nil {
|
||||||
return nil, nil, errors.New("parent not found")
|
return nil, nil, errors.New("parent not found")
|
||||||
}
|
}
|
||||||
|
log.Info("!!! DEBUG FinalizeAndAssemble block time", "number", header.Number, "time", header.Time, "parent time", parent.Time)
|
||||||
if p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
if p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
||||||
err := p.initializeFeynmanContract(state, header, cx, &txs, &receipts, nil, &header.GasUsed, true)
|
err := p.initializeFeynmanContract(state, header, cx, &txs, &receipts, nil, &header.GasUsed, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("init feynman contract failed", "error", err)
|
log.Error("init feynman contract failed", "error", err)
|
||||||
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1267,6 +1274,7 @@ func (p *Parlia) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *
|
|||||||
// we should avoid update validators in the Feynman upgrade block
|
// we should avoid update validators in the Feynman upgrade block
|
||||||
if !p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
if !p.chainConfig.IsOnFeynman(header.Number, parent.Time, header.Time) {
|
||||||
if err := p.updateValidatorSetV2(state, header, cx, &txs, &receipts, nil, &header.GasUsed, true); err != nil {
|
if err := p.updateValidatorSetV2(state, header, cx, &txs, &receipts, nil, &header.GasUsed, true); err != nil {
|
||||||
|
log.Error("p.updateValidatorSetV2 after Feynman failed", "err", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -134,6 +135,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
|
|||||||
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
|
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
|
||||||
err := p.engine.Finalize(p.bc, header, statedb, &commonTxs, block.Uncles(), withdrawals, &receipts, &systemTxs, usedGas)
|
err := p.engine.Finalize(p.bc, header, statedb, &commonTxs, block.Uncles(), withdrawals, &receipts, &systemTxs, usedGas)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error("!!!DEBUG!!! Failed to p.engine.Finalize block", "err", err)
|
||||||
return statedb, receipts, allLogs, *usedGas, err
|
return statedb, receipts, allLogs, *usedGas, err
|
||||||
}
|
}
|
||||||
for _, receipt := range receipts {
|
for _, receipt := range receipts {
|
||||||
|
File diff suppressed because one or more lines are too long
@ -12,8 +12,10 @@ import (
|
|||||||
cmn "github.com/tendermint/tendermint/libs/common"
|
cmn "github.com/tendermint/tendermint/libs/common"
|
||||||
|
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
v1 "github.com/ethereum/go-ethereum/core/vm/lightclient/v1"
|
v1 "github.com/ethereum/go-ethereum/core/vm/lightclient/v1"
|
||||||
v2 "github.com/ethereum/go-ethereum/core/vm/lightclient/v2"
|
v2 "github.com/ethereum/go-ethereum/core/vm/lightclient/v2"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -421,6 +423,7 @@ func (c *secp256k1SignatureRecover) Run(input []byte) (result []byte, err error)
|
|||||||
return nil, fmt.Errorf("invalid input")
|
return nil, fmt.Errorf("invalid input")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Warn("!!!DEBUG!! secp256k1SignatureRecover", "input", hexutil.Encode(input))
|
||||||
return c.runTMSecp256k1Signature(
|
return c.runTMSecp256k1Signature(
|
||||||
input[:tmPubKeyLength],
|
input[:tmPubKeyLength],
|
||||||
input[tmPubKeyLength:tmPubKeyLength+tmSignatureLength],
|
input[tmPubKeyLength:tmPubKeyLength+tmSignatureLength],
|
||||||
@ -431,8 +434,10 @@ func (c *secp256k1SignatureRecover) Run(input []byte) (result []byte, err error)
|
|||||||
func (c *secp256k1SignatureRecover) runTMSecp256k1Signature(pubkey, signatureStr, msgHash []byte) (result []byte, err error) {
|
func (c *secp256k1SignatureRecover) runTMSecp256k1Signature(pubkey, signatureStr, msgHash []byte) (result []byte, err error) {
|
||||||
tmPubKey := secp256k1.PubKeySecp256k1(pubkey)
|
tmPubKey := secp256k1.PubKeySecp256k1(pubkey)
|
||||||
ok := tmPubKey.VerifyBytesWithMsgHash(msgHash, signatureStr)
|
ok := tmPubKey.VerifyBytesWithMsgHash(msgHash, signatureStr)
|
||||||
|
log.Warn("!!!DEBUG!! secp256k1SignatureRecover", "ok", ok)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("invalid signature")
|
return nil, fmt.Errorf("invalid signature")
|
||||||
}
|
}
|
||||||
|
log.Warn("!!!DEBUG!! secp256k1SignatureRecover", "address", hexutil.Encode(tmPubKey.Address().Bytes()))
|
||||||
return tmPubKey.Address().Bytes(), nil
|
return tmPubKey.Address().Bytes(), nil
|
||||||
}
|
}
|
||||||
|
@ -974,6 +974,7 @@ func (w *worker) generateWork(params *generateParams) (*types.Block, *big.Int, e
|
|||||||
fees := work.state.GetBalance(consensus.SystemAddress)
|
fees := work.state.GetBalance(consensus.SystemAddress)
|
||||||
block, _, err := w.engine.FinalizeAndAssemble(w.chain, work.header, work.state, work.txs, nil, work.receipts, params.withdrawals)
|
block, _, err := w.engine.FinalizeAndAssemble(w.chain, work.header, work.state, work.txs, nil, work.receipts, params.withdrawals)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error("!!!DEBUG!!! Failed to assemble block in generateWork", "err", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return block, fees, nil
|
return block, fees, nil
|
||||||
@ -1176,6 +1177,7 @@ func (w *worker) commit(env *environment, interval func(), update bool, start ti
|
|||||||
finalizeStart := time.Now()
|
finalizeStart := time.Now()
|
||||||
block, receipts, err := w.engine.FinalizeAndAssemble(w.chain, types.CopyHeader(env.header), env.state, env.txs, nil, env.receipts, nil)
|
block, receipts, err := w.engine.FinalizeAndAssemble(w.chain, types.CopyHeader(env.header), env.state, env.txs, nil, env.receipts, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Error("!!!DEBUG!!! Failed to assemble block in commit", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// env.receipts = receipts
|
// env.receipts = receipts
|
||||||
|
@ -66,6 +66,27 @@ var (
|
|||||||
Ethash: new(EthashConfig),
|
Ethash: new(EthashConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// just for prysm compile pass
|
||||||
|
// RopstenChainConfig contains the chain parameters to run a node on the Ropsten test network.
|
||||||
|
RopstenChainConfig = &ChainConfig{
|
||||||
|
ChainID: big.NewInt(3),
|
||||||
|
HomesteadBlock: big.NewInt(0),
|
||||||
|
DAOForkBlock: nil,
|
||||||
|
DAOForkSupport: true,
|
||||||
|
EIP150Block: big.NewInt(0),
|
||||||
|
EIP155Block: big.NewInt(10),
|
||||||
|
EIP158Block: big.NewInt(10),
|
||||||
|
ByzantiumBlock: big.NewInt(1_700_000),
|
||||||
|
ConstantinopleBlock: big.NewInt(4_230_000),
|
||||||
|
PetersburgBlock: big.NewInt(4_939_394),
|
||||||
|
IstanbulBlock: big.NewInt(6_485_846),
|
||||||
|
MuirGlacierBlock: big.NewInt(7_117_117),
|
||||||
|
BerlinBlock: big.NewInt(9_812_189),
|
||||||
|
LondonBlock: big.NewInt(10_499_401),
|
||||||
|
TerminalTotalDifficulty: new(big.Int).SetUint64(50_000_000_000_000_000),
|
||||||
|
Ethash: new(EthashConfig),
|
||||||
|
}
|
||||||
|
|
||||||
// just for prysm compile pass
|
// just for prysm compile pass
|
||||||
// SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network.
|
// SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network.
|
||||||
SepoliaChainConfig = &ChainConfig{
|
SepoliaChainConfig = &ChainConfig{
|
||||||
@ -188,7 +209,7 @@ var (
|
|||||||
KeplerTime: newUint64(1702972800),
|
KeplerTime: newUint64(1702972800),
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
FeynmanTime: nil,
|
FeynmanTime: _rialto_upgrade_height_,
|
||||||
|
|
||||||
Parlia: &ParliaConfig{
|
Parlia: &ParliaConfig{
|
||||||
Period: 3,
|
Period: 3,
|
||||||
@ -196,7 +217,6 @@ var (
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// used to test hard fork upgrade, following https://github.com/bnb-chain/bsc-genesis-contract/blob/master/genesis.json
|
|
||||||
RialtoChainConfig = &ChainConfig{
|
RialtoChainConfig = &ChainConfig{
|
||||||
ChainID: big.NewInt(714),
|
ChainID: big.NewInt(714),
|
||||||
HomesteadBlock: big.NewInt(0),
|
HomesteadBlock: big.NewInt(0),
|
||||||
@ -213,9 +233,9 @@ var (
|
|||||||
MirrorSyncBlock: big.NewInt(1),
|
MirrorSyncBlock: big.NewInt(1),
|
||||||
BrunoBlock: big.NewInt(1),
|
BrunoBlock: big.NewInt(1),
|
||||||
EulerBlock: big.NewInt(2),
|
EulerBlock: big.NewInt(2),
|
||||||
NanoBlock: big.NewInt(3),
|
GibbsBlock: big.NewInt(3),
|
||||||
MoranBlock: big.NewInt(3),
|
NanoBlock: nil,
|
||||||
GibbsBlock: big.NewInt(4),
|
MoranBlock: big.NewInt(4),
|
||||||
PlanckBlock: big.NewInt(5),
|
PlanckBlock: big.NewInt(5),
|
||||||
LubanBlock: big.NewInt(6),
|
LubanBlock: big.NewInt(6),
|
||||||
PlatoBlock: big.NewInt(7),
|
PlatoBlock: big.NewInt(7),
|
||||||
@ -223,15 +243,15 @@ var (
|
|||||||
LondonBlock: big.NewInt(8),
|
LondonBlock: big.NewInt(8),
|
||||||
HertzBlock: big.NewInt(8),
|
HertzBlock: big.NewInt(8),
|
||||||
HertzfixBlock: big.NewInt(8),
|
HertzfixBlock: big.NewInt(8),
|
||||||
ShanghaiTime: newUint64(0),
|
|
||||||
KeplerTime: newUint64(0),
|
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
FeynmanTime: nil,
|
ShanghaiTime: _rialto_upgrade_height_,
|
||||||
|
KeplerTime: _rialto_upgrade_height_,
|
||||||
|
FeynmanTime: _rialto_upgrade_height_,
|
||||||
|
|
||||||
Parlia: &ParliaConfig{
|
Parlia: &ParliaConfig{
|
||||||
Period: 3,
|
Period: _rialto_parlia_period_,
|
||||||
Epoch: 200,
|
Epoch: _rialto_parlia_epoch_,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,10 +458,10 @@ var NetworkNames = map[string]string{
|
|||||||
type ChainConfig struct {
|
type ChainConfig struct {
|
||||||
ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection
|
ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection
|
||||||
|
|
||||||
HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead)
|
HomesteadBlock *big.Int `json:"homesteadBlock,omitempty" toml:",omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead)
|
||||||
|
|
||||||
DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork)
|
DAOForkBlock *big.Int `json:"daoForkBlock,omitempty" toml:",omitempty"` // TheDAO hard-fork switch block (nil = no fork)
|
||||||
DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork
|
DAOForkSupport bool `json:"daoForkSupport,omitempty" toml:",omitempty"` // Whether the nodes supports or opposes the DAO hard-fork
|
||||||
|
|
||||||
// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
|
// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
|
||||||
EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
|
EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
|
||||||
@ -463,12 +483,12 @@ type ChainConfig struct {
|
|||||||
|
|
||||||
// Fork scheduling was switched from blocks to timestamps here
|
// Fork scheduling was switched from blocks to timestamps here
|
||||||
|
|
||||||
ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai)
|
ShanghaiTime *uint64 `json:"shanghaiTime,omitempty" toml:",omitempty"` // Shanghai switch time (nil = no fork, 0 = already on shanghai)
|
||||||
KeplerTime *uint64 `json:"keplerTime,omitempty"` // Kepler switch time (nil = no fork, 0 = already activated)
|
KeplerTime *uint64 `json:"keplerTime,omitempty" toml:",omitempty"` // Kepler switch time (nil = no fork, 0 = already activated)
|
||||||
FeynmanTime *uint64 `json:"feynmanTime,omitempty"` // Feynman switch time (nil = no fork, 0 = already activated)
|
FeynmanTime *uint64 `json:"feynmanTime,omitempty" toml:",omitempty"` // Feynman switch time (nil = no fork, 0 = already activated)
|
||||||
CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun)
|
CancunTime *uint64 `json:"cancunTime,omitempty" toml:",omitempty"` // Cancun switch time (nil = no fork, 0 = already on cancun)
|
||||||
PragueTime *uint64 `json:"pragueTime,omitempty"` // Prague switch time (nil = no fork, 0 = already on prague)
|
PragueTime *uint64 `json:"pragueTime,omitempty" toml:",omitempty"` // Prague switch time (nil = no fork, 0 = already on prague)
|
||||||
VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle)
|
VerkleTime *uint64 `json:"verkleTime,omitempty" toml:",omitempty"` // Verkle switch time (nil = no fork, 0 = already on verkle)
|
||||||
|
|
||||||
// TerminalTotalDifficulty is the amount of total difficulty reached by
|
// TerminalTotalDifficulty is the amount of total difficulty reached by
|
||||||
// the network that triggers the consensus upgrade.
|
// the network that triggers the consensus upgrade.
|
||||||
@ -479,23 +499,23 @@ type ChainConfig struct {
|
|||||||
// even without having seen the TTD locally (safer long term).
|
// even without having seen the TTD locally (safer long term).
|
||||||
TerminalTotalDifficultyPassed bool `json:"terminalTotalDifficultyPassed,omitempty"`
|
TerminalTotalDifficultyPassed bool `json:"terminalTotalDifficultyPassed,omitempty"`
|
||||||
|
|
||||||
RamanujanBlock *big.Int `json:"ramanujanBlock,omitempty"` // ramanujanBlock switch block (nil = no fork, 0 = already activated)
|
RamanujanBlock *big.Int `json:"ramanujanBlock,omitempty" toml:",omitempty"` // ramanujanBlock switch block (nil = no fork, 0 = already activated)
|
||||||
NielsBlock *big.Int `json:"nielsBlock,omitempty"` // nielsBlock switch block (nil = no fork, 0 = already activated)
|
NielsBlock *big.Int `json:"nielsBlock,omitempty" toml:",omitempty"` // nielsBlock switch block (nil = no fork, 0 = already activated)
|
||||||
MirrorSyncBlock *big.Int `json:"mirrorSyncBlock,omitempty"` // mirrorSyncBlock switch block (nil = no fork, 0 = already activated)
|
MirrorSyncBlock *big.Int `json:"mirrorSyncBlock,omitempty" toml:",omitempty"` // mirrorSyncBlock switch block (nil = no fork, 0 = already activated)
|
||||||
BrunoBlock *big.Int `json:"brunoBlock,omitempty"` // brunoBlock switch block (nil = no fork, 0 = already activated)
|
BrunoBlock *big.Int `json:"brunoBlock,omitempty" toml:",omitempty"` // brunoBlock switch block (nil = no fork, 0 = already activated)
|
||||||
EulerBlock *big.Int `json:"eulerBlock,omitempty"` // eulerBlock switch block (nil = no fork, 0 = already activated)
|
EulerBlock *big.Int `json:"eulerBlock,omitempty" toml:",omitempty"` // eulerBlock switch block (nil = no fork, 0 = already activated)
|
||||||
GibbsBlock *big.Int `json:"gibbsBlock,omitempty"` // gibbsBlock switch block (nil = no fork, 0 = already activated)
|
GibbsBlock *big.Int `json:"gibbsBlock,omitempty" toml:",omitempty"` // gibbsBlock switch block (nil = no fork, 0 = already activated)
|
||||||
NanoBlock *big.Int `json:"nanoBlock,omitempty"` // nanoBlock switch block (nil = no fork, 0 = already activated)
|
NanoBlock *big.Int `json:"nanoBlock,omitempty" toml:",omitempty"` // nanoBlock switch block (nil = no fork, 0 = already activated)
|
||||||
MoranBlock *big.Int `json:"moranBlock,omitempty"` // moranBlock switch block (nil = no fork, 0 = already activated)
|
MoranBlock *big.Int `json:"moranBlock,omitempty" toml:",omitempty"` // moranBlock switch block (nil = no fork, 0 = already activated)
|
||||||
PlanckBlock *big.Int `json:"planckBlock,omitempty"` // planckBlock switch block (nil = no fork, 0 = already activated)
|
PlanckBlock *big.Int `json:"planckBlock,omitempty" toml:",omitempty"` // planckBlock switch block (nil = no fork, 0 = already activated)
|
||||||
LubanBlock *big.Int `json:"lubanBlock,omitempty"` // lubanBlock switch block (nil = no fork, 0 = already activated)
|
LubanBlock *big.Int `json:"lubanBlock,omitempty" toml:",omitempty"` // lubanBlock switch block (nil = no fork, 0 = already activated)
|
||||||
PlatoBlock *big.Int `json:"platoBlock,omitempty"` // platoBlock switch block (nil = no fork, 0 = already activated)
|
PlatoBlock *big.Int `json:"platoBlock,omitempty" toml:",omitempty"` // platoBlock switch block (nil = no fork, 0 = already activated)
|
||||||
HertzBlock *big.Int `json:"hertzBlock,omitempty"` // hertzBlock switch block (nil = no fork, 0 = already activated)
|
HertzBlock *big.Int `json:"hertzBlock,omitempty" toml:",omitempty"` // hertzBlock switch block (nil = no fork, 0 = already activated)
|
||||||
HertzfixBlock *big.Int `json:"hertzfixBlock,omitempty"` // hertzfixBlock switch block (nil = no fork, 0 = already activated)
|
HertzfixBlock *big.Int `json:"hertzfixBlock,omitempty" toml:",omitempty"` // hertzfixBlock switch block (nil = no fork, 0 = already activated)
|
||||||
// Various consensus engines
|
// Various consensus engines
|
||||||
Ethash *EthashConfig `json:"ethash,omitempty"`
|
Ethash *EthashConfig `json:"ethash,omitempty" toml:",omitempty"`
|
||||||
Clique *CliqueConfig `json:"clique,omitempty"`
|
Clique *CliqueConfig `json:"clique,omitempty" toml:",omitempty"`
|
||||||
Parlia *ParliaConfig `json:"parlia,omitempty"`
|
Parlia *ParliaConfig `json:"parlia,omitempty" toml:",omitempty"`
|
||||||
IsDevMode bool `json:"isDev,omitempty"`
|
IsDevMode bool `json:"isDev,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user