mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-28 15:46:43 +00:00
* Adding in Mumbai/Mainnet precursor deb packaging for tests to use during upgrade(iterations to come) * Added changes per discussion in PR, more changes may be necessary * Adding prerelease true * Disabling goreleaser * Removing README swap file * change bor_dir and add bor user for v0.3.0 release * rollback bor user and use root * metrics: handle equal to separated config flag (#596) * metrics: handle based config path * internal/cli/server: add more context to logs * use space separated flag and value in bor.service * fixed static-nodes related buf (os independent) (#598) * fixed static-nodes related buf (os independent) * taking static-nodes as input if default not present * Update default flags (#600) * internal/cli/server: use geth's default for txpool.pricelimit and add comments * builder/files: update config.toml for mainnet * packaging/templates: update defaults for mainnet and mumbai * internal/cli/server: skip overriding cache * packaging/templates: update cache value for mainnet * packaging/templates: update gcmode for archive mumbai node * metrics: handle nil telemetry config (#601) * resolve merge conflicts * update go version in release.yml * update goversion in makefile * update Docker login for goreleaser-cross v1.19 * Cleanup for the packager to use git tag in the package profile naming. Added conditional check for directory structure, this is in prep for v0.3.1, as this will create a failure on upgrade path in package due to file exist * added a toml configuration file with comments describing each flag (#607) * added a toml configuration file with comments describing each flag * internal/cli/server: update flag description * docs/cli: update example config and description of flags * docs: update new-cli docs Co-authored-by: Manav Darji <manavdarji.india@gmail.com> * Adding of 0.3.0 package changes, control file updates, postinst changes, and packager update * added ancient datadir flag and toml field, need to decide on default value and update the conversion script * updated toml files with ancient field * Add support for new flags in new config.toml, which were present in old config.toml (#612) * added HTTPTimeouts, and TrieTimeout flag in new tol, from old toml * added RAW fields for these time.Duration flags * updated the conversion script to support these extra 4 flags * removed hcl and json config tests as we are only supporting toml config files * updated toml files with cache.timeout field * updated toml files with jsonrpc.timeouts field * tests/bor: expect a call for latest checkpoint * tests/bor: expect a call for latest checkpoint * packaging/templates: update cache values for archive nodes Co-authored-by: Manav Darji <manavdarji.india@gmail.com> * remove unwanted code * Fix docker publish authentication issue In gorelease-cross 1.19+, dockerhub authentication will require docker logion action followed by mounting docker config file. See https://github.com/goreleaser/goreleaser-cross#github-actions. * Revert "update Docker login for goreleaser-cross v1.19" This reverts commit4d19cf5342. * Bump version to stable * Revert "Merge pull request #435 from maticnetwork/POS-553" This reverts commit657d262def, reversing changes made to88dbfa1c13. * revert change for release for go1.19 * Add default values to CLI helper and docs This commit adds default values to CLI helper and docs. When the default value of a string flag, slice string flag, or map string flag is empty, its helper message won't show any default value. * Add a summary of new CLI in docs * Updating packager as binutils changed version so that apt-get installs current versions * Add state pruning to new CLI * Minor wording fix in prune state description * Bumping control file versions * Mainnet Delhi fork * Set version to stable * change delhi hardfork block number * handle future chain import and skip peer drop (#650) * handle future chain import and skip peer drop * add block import metric * params: bump version to v0.3.3-stable * Bump bor version in control files for v0.3.3 mainnet release Co-authored-by: Daniel Jones <djones@polygon.technology> Co-authored-by: Will Button <wbutton@polygon.technology> Co-authored-by: Will Button <will@willbutton.com> Co-authored-by: Manav Darji <manavdarji.india@gmail.com> Co-authored-by: Daniel Jones <105369507+djpolygon@users.noreply.github.com> Co-authored-by: Pratik Patil <pratikspatil024@gmail.com> Co-authored-by: Arpit Temani <temaniarpit27@gmail.com> Co-authored-by: Jerry <jerrycgh@gmail.com>
121 lines
4.4 KiB
Go
121 lines
4.4 KiB
Go
// Copyright 2021 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package core
|
|
|
|
import (
|
|
"errors"
|
|
"math/big"
|
|
|
|
"github.com/maticnetwork/crand"
|
|
|
|
"github.com/ethereum/go-ethereum"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
"github.com/ethereum/go-ethereum/params"
|
|
)
|
|
|
|
// ChainReader defines a small collection of methods needed to access the local
|
|
// blockchain during header verification. It's implemented by both blockchain
|
|
// and lightchain.
|
|
type ChainReader interface {
|
|
// Config retrieves the header chain's chain configuration.
|
|
Config() *params.ChainConfig
|
|
|
|
// GetTd returns the total difficulty of a local block.
|
|
GetTd(common.Hash, uint64) *big.Int
|
|
}
|
|
|
|
// ForkChoice is the fork chooser based on the highest total difficulty of the
|
|
// chain(the fork choice used in the eth1) and the external fork choice (the fork
|
|
// choice used in the eth2). This main goal of this ForkChoice is not only for
|
|
// offering fork choice during the eth1/2 merge phase, but also keep the compatibility
|
|
// for all other proof-of-work networks.
|
|
type ForkChoice struct {
|
|
chain ChainReader
|
|
rand Floater
|
|
|
|
// preserve is a helper function used in td fork choice.
|
|
// Miners will prefer to choose the local mined block if the
|
|
// local td is equal to the extern one. It can be nil for light
|
|
// client
|
|
preserve func(header *types.Header) bool
|
|
|
|
validator ethereum.ChainValidator
|
|
}
|
|
|
|
type Floater interface {
|
|
Float64() float64
|
|
}
|
|
|
|
func NewForkChoice(chainReader ChainReader, preserve func(header *types.Header) bool, validator ethereum.ChainValidator) *ForkChoice {
|
|
// Seed a fast but crypto originating random generator
|
|
r := crand.NewRand()
|
|
return &ForkChoice{
|
|
chain: chainReader,
|
|
rand: r,
|
|
preserve: preserve,
|
|
validator: validator,
|
|
}
|
|
}
|
|
|
|
// ReorgNeeded returns whether the reorg should be applied
|
|
// based on the given external header and local canonical chain.
|
|
// In the td mode, the new head is chosen if the corresponding
|
|
// total difficulty is higher. In the extern mode, the trusted
|
|
// header is always selected as the head.
|
|
func (f *ForkChoice) ReorgNeeded(current *types.Header, header *types.Header) (bool, error) {
|
|
var (
|
|
localTD = f.chain.GetTd(current.Hash(), current.Number.Uint64())
|
|
externTd = f.chain.GetTd(header.Hash(), header.Number.Uint64())
|
|
)
|
|
if localTD == nil || externTd == nil {
|
|
return false, errors.New("missing td")
|
|
}
|
|
// Accept the new header as the chain head if the transition
|
|
// is already triggered. We assume all the headers after the
|
|
// transition come from the trusted consensus layer.
|
|
if ttd := f.chain.Config().TerminalTotalDifficulty; ttd != nil && ttd.Cmp(externTd) <= 0 {
|
|
return true, nil
|
|
}
|
|
// If the total difficulty is higher than our known, add it to the canonical chain
|
|
// Second clause in the if statement reduces the vulnerability to selfish mining.
|
|
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
|
|
reorg := externTd.Cmp(localTD) > 0
|
|
if !reorg && externTd.Cmp(localTD) == 0 {
|
|
number, headNumber := header.Number.Uint64(), current.Number.Uint64()
|
|
if number < headNumber {
|
|
reorg = true
|
|
} else if number == headNumber {
|
|
var currentPreserve, externPreserve bool
|
|
if f.preserve != nil {
|
|
currentPreserve, externPreserve = f.preserve(current), f.preserve(header)
|
|
}
|
|
reorg = !currentPreserve && (externPreserve || f.rand.Float64() < 0.5)
|
|
}
|
|
}
|
|
return reorg, nil
|
|
}
|
|
|
|
// ValidateReorg calls the chain validator service to check if the reorg is valid or not
|
|
func (f *ForkChoice) ValidateReorg(current *types.Header, chain []*types.Header) (bool, error) {
|
|
// Call the bor chain validator service
|
|
if f.validator != nil {
|
|
return f.validator.IsValidChain(current, chain)
|
|
}
|
|
|
|
return true, nil
|
|
}
|