2022-05-24 13:39:40 -05:00
|
|
|
// Copyright 2021 The go-ethereum Authors
|
2021-04-16 14:29:22 -05:00
|
|
|
// 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 catalyst
|
|
|
|
|
|
|
|
import (
|
2022-05-20 03:12:12 -05:00
|
|
|
"bytes"
|
2022-01-20 05:29:06 -06:00
|
|
|
"fmt"
|
2021-04-16 14:29:22 -05:00
|
|
|
"math/big"
|
|
|
|
"testing"
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
"time"
|
2021-04-16 14:29:22 -05:00
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2022-03-17 10:20:03 -05:00
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
2021-04-16 14:29:22 -05:00
|
|
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
|
|
|
"github.com/ethereum/go-ethereum/core"
|
2022-01-31 06:22:35 -06:00
|
|
|
"github.com/ethereum/go-ethereum/core/beacon"
|
2021-04-16 14:29:22 -05:00
|
|
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
|
|
"github.com/ethereum/go-ethereum/eth"
|
2022-05-20 03:12:12 -05:00
|
|
|
"github.com/ethereum/go-ethereum/eth/downloader"
|
2021-04-16 14:29:22 -05:00
|
|
|
"github.com/ethereum/go-ethereum/eth/ethconfig"
|
|
|
|
"github.com/ethereum/go-ethereum/node"
|
2022-05-20 03:12:12 -05:00
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
2021-04-16 14:29:22 -05:00
|
|
|
"github.com/ethereum/go-ethereum/params"
|
2022-05-20 03:12:12 -05:00
|
|
|
"github.com/ethereum/go-ethereum/trie"
|
2021-04-16 14:29:22 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// testKey is a private key to use for funding a tester account.
|
|
|
|
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
|
|
|
|
|
|
|
// testAddr is the Ethereum address of the tester account.
|
|
|
|
testAddr = crypto.PubkeyToAddress(testKey.PublicKey)
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
testBalance = big.NewInt(2e18)
|
2021-04-16 14:29:22 -05:00
|
|
|
)
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) {
|
2021-04-16 14:29:22 -05:00
|
|
|
db := rawdb.NewMemoryDatabase()
|
|
|
|
config := params.AllEthashProtocolChanges
|
|
|
|
genesis := &core.Genesis{
|
2022-03-17 10:20:03 -05:00
|
|
|
Config: config,
|
|
|
|
Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}},
|
|
|
|
ExtraData: []byte("test genesis"),
|
|
|
|
Timestamp: 9000,
|
|
|
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
|
|
|
Difficulty: big.NewInt(0),
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
testNonce := uint64(0)
|
2021-04-16 14:29:22 -05:00
|
|
|
generate := func(i int, g *core.BlockGen) {
|
|
|
|
g.OffsetTime(5)
|
|
|
|
g.SetExtra([]byte("test"))
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
tx, _ := types.SignTx(types.NewTransaction(testNonce, common.HexToAddress("0x9a9070028361F7AAbeB3f2F2Dc07F82C4a98A02a"), big.NewInt(1), params.TxGas, big.NewInt(params.InitialBaseFee*2), nil), types.LatestSigner(config), testKey)
|
|
|
|
g.AddTx(tx)
|
|
|
|
testNonce++
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
2022-08-09 04:44:39 -05:00
|
|
|
gblock := genesis.MustCommit(db)
|
2021-04-16 14:29:22 -05:00
|
|
|
engine := ethash.NewFaker()
|
|
|
|
blocks, _ := core.GenerateChain(config, gblock, engine, db, n, generate)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
totalDifficulty := big.NewInt(0)
|
|
|
|
for _, b := range blocks {
|
|
|
|
totalDifficulty.Add(totalDifficulty, b.Difficulty())
|
|
|
|
}
|
|
|
|
config.TerminalTotalDifficulty = totalDifficulty
|
|
|
|
return genesis, blocks
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestEth2AssembleBlock(t *testing.T) {
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
genesis, blocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, blocks)
|
2021-04-16 14:29:22 -05:00
|
|
|
defer n.Close()
|
|
|
|
|
2022-01-31 06:22:35 -06:00
|
|
|
api := NewConsensusAPI(ethservice)
|
2021-04-16 14:29:22 -05:00
|
|
|
signer := types.NewEIP155Signer(ethservice.BlockChain().Config().ChainID)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
tx, err := types.SignTx(types.NewTransaction(uint64(10), blocks[9].Coinbase(), big.NewInt(1000), params.TxGas, big.NewInt(params.InitialBaseFee), nil), signer, testKey)
|
2021-04-16 14:29:22 -05:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error signing transaction, err=%v", err)
|
|
|
|
}
|
|
|
|
ethservice.TxPool().AddLocal(tx)
|
2022-01-31 06:22:35 -06:00
|
|
|
blockParams := beacon.PayloadAttributesV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
Timestamp: blocks[9].Time() + 5,
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
2022-05-18 09:33:37 -05:00
|
|
|
execData, err := assembleBlock(api, blocks[9].Hash(), &blockParams)
|
2021-04-16 14:29:22 -05:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error producing block, err=%v", err)
|
|
|
|
}
|
|
|
|
if len(execData.Transactions) != 1 {
|
|
|
|
t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestEth2AssembleBlockWithAnotherBlocksTxs(t *testing.T) {
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
genesis, blocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, blocks[:9])
|
2021-04-16 14:29:22 -05:00
|
|
|
defer n.Close()
|
|
|
|
|
2022-01-31 06:22:35 -06:00
|
|
|
api := NewConsensusAPI(ethservice)
|
2021-04-16 14:29:22 -05:00
|
|
|
|
|
|
|
// Put the 10th block's tx in the pool and produce a new block
|
2022-05-06 04:19:30 -05:00
|
|
|
api.eth.TxPool().AddRemotesSync(blocks[9].Transactions())
|
2022-01-31 06:22:35 -06:00
|
|
|
blockParams := beacon.PayloadAttributesV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
Timestamp: blocks[8].Time() + 5,
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
2022-05-18 09:33:37 -05:00
|
|
|
execData, err := assembleBlock(api, blocks[8].Hash(), &blockParams)
|
2021-04-16 14:29:22 -05:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error producing block, err=%v", err)
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if len(execData.Transactions) != blocks[9].Transactions().Len() {
|
|
|
|
t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions))
|
|
|
|
}
|
|
|
|
}
|
2021-04-16 14:29:22 -05:00
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
func TestSetHeadBeforeTotalDifficulty(t *testing.T) {
|
|
|
|
genesis, blocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, blocks)
|
|
|
|
defer n.Close()
|
|
|
|
|
2022-01-31 06:22:35 -06:00
|
|
|
api := NewConsensusAPI(ethservice)
|
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
HeadBlockHash: blocks[5].Hash(),
|
|
|
|
SafeBlockHash: common.Hash{},
|
|
|
|
FinalizedBlockHash: common.Hash{},
|
|
|
|
}
|
2022-03-17 10:20:03 -05:00
|
|
|
if resp, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
|
|
|
t.Errorf("fork choice updated should not error: %v", err)
|
2022-05-17 04:32:55 -05:00
|
|
|
} else if resp.PayloadStatus.Status != beacon.INVALID_TERMINAL_BLOCK.Status {
|
2022-03-17 10:20:03 -05:00
|
|
|
t.Errorf("fork choice updated before total terminal difficulty should be INVALID")
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestEth2PrepareAndGetPayload(t *testing.T) {
|
2022-05-20 03:12:12 -05:00
|
|
|
genesis, blocks := generatePreMergeChain(10)
|
|
|
|
// We need to properly set the terminal total difficulty
|
|
|
|
genesis.Config.TerminalTotalDifficulty.Sub(genesis.Config.TerminalTotalDifficulty, blocks[9].Difficulty())
|
|
|
|
n, ethservice := startEthService(t, genesis, blocks[:9])
|
|
|
|
defer n.Close()
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
|
2022-05-20 03:12:12 -05:00
|
|
|
api := NewConsensusAPI(ethservice)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
|
2022-05-20 03:12:12 -05:00
|
|
|
// Put the 10th block's tx in the pool and produce a new block
|
|
|
|
ethservice.TxPool().AddLocals(blocks[9].Transactions())
|
|
|
|
blockParams := beacon.PayloadAttributesV1{
|
|
|
|
Timestamp: blocks[8].Time() + 5,
|
|
|
|
}
|
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
|
|
|
HeadBlockHash: blocks[8].Hash(),
|
|
|
|
SafeBlockHash: common.Hash{},
|
|
|
|
FinalizedBlockHash: common.Hash{},
|
|
|
|
}
|
|
|
|
_, err := api.ForkchoiceUpdatedV1(fcState, &blockParams)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error preparing payload, err=%v", err)
|
|
|
|
}
|
|
|
|
payloadID := computePayloadId(fcState.HeadBlockHash, &blockParams)
|
|
|
|
execData, err := api.GetPayloadV1(payloadID)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error getting payload, err=%v", err)
|
|
|
|
}
|
|
|
|
if len(execData.Transactions) != blocks[9].Transactions().Len() {
|
|
|
|
t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions))
|
|
|
|
}
|
|
|
|
// Test invalid payloadID
|
|
|
|
var invPayload beacon.PayloadID
|
|
|
|
copy(invPayload[:], payloadID[:])
|
|
|
|
invPayload[0] = ^invPayload[0]
|
|
|
|
_, err = api.GetPayloadV1(invPayload)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("expected error retrieving invalid payload")
|
|
|
|
}
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
func checkLogEvents(t *testing.T, logsCh <-chan []*types.Log, rmLogsCh <-chan core.RemovedLogsEvent, wantNew, wantRemoved int) {
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
if len(logsCh) != wantNew {
|
|
|
|
t.Fatalf("wrong number of log events: got %d, want %d", len(logsCh), wantNew)
|
|
|
|
}
|
|
|
|
if len(rmLogsCh) != wantRemoved {
|
|
|
|
t.Fatalf("wrong number of removed log events: got %d, want %d", len(rmLogsCh), wantRemoved)
|
|
|
|
}
|
|
|
|
// Drain events.
|
|
|
|
for i := 0; i < len(logsCh); i++ {
|
|
|
|
<-logsCh
|
|
|
|
}
|
|
|
|
for i := 0; i < len(rmLogsCh); i++ {
|
|
|
|
<-rmLogsCh
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-20 05:29:06 -06:00
|
|
|
func TestInvalidPayloadTimestamp(t *testing.T) {
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
var (
|
2022-01-31 06:22:35 -06:00
|
|
|
api = NewConsensusAPI(ethservice)
|
2022-01-20 05:29:06 -06:00
|
|
|
parent = ethservice.BlockChain().CurrentBlock()
|
|
|
|
)
|
|
|
|
tests := []struct {
|
|
|
|
time uint64
|
|
|
|
shouldErr bool
|
|
|
|
}{
|
|
|
|
{0, true},
|
|
|
|
{parent.Time(), true},
|
|
|
|
{parent.Time() - 1, true},
|
2022-03-11 06:14:45 -06:00
|
|
|
|
|
|
|
// TODO (MariusVanDerWijden) following tests are currently broken,
|
|
|
|
// fixed in upcoming merge-kiln-v2 pr
|
|
|
|
//{parent.Time() + 1, false},
|
|
|
|
//{uint64(time.Now().Unix()) + uint64(time.Minute), false},
|
2022-01-20 05:29:06 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
for i, test := range tests {
|
|
|
|
t.Run(fmt.Sprintf("Timestamp test: %v", i), func(t *testing.T) {
|
2022-01-31 06:22:35 -06:00
|
|
|
params := beacon.PayloadAttributesV1{
|
2022-01-20 05:29:06 -06:00
|
|
|
Timestamp: test.time,
|
|
|
|
Random: crypto.Keccak256Hash([]byte{byte(123)}),
|
|
|
|
SuggestedFeeRecipient: parent.Coinbase(),
|
|
|
|
}
|
2022-01-31 06:22:35 -06:00
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
2022-01-20 05:29:06 -06:00
|
|
|
HeadBlockHash: parent.Hash(),
|
|
|
|
SafeBlockHash: common.Hash{},
|
|
|
|
FinalizedBlockHash: common.Hash{},
|
|
|
|
}
|
|
|
|
_, err := api.ForkchoiceUpdatedV1(fcState, ¶ms)
|
|
|
|
if test.shouldErr && err == nil {
|
|
|
|
t.Fatalf("expected error preparing payload with invalid timestamp, err=%v", err)
|
|
|
|
} else if !test.shouldErr && err != nil {
|
|
|
|
t.Fatalf("error preparing payload with valid timestamp, err=%v", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-16 14:29:22 -05:00
|
|
|
func TestEth2NewBlock(t *testing.T) {
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
2021-04-16 14:29:22 -05:00
|
|
|
defer n.Close()
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
var (
|
2022-01-31 06:22:35 -06:00
|
|
|
api = NewConsensusAPI(ethservice)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
parent = preMergeBlocks[len(preMergeBlocks)-1]
|
|
|
|
|
|
|
|
// This EVM code generates a log when the contract is created.
|
|
|
|
logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00")
|
|
|
|
)
|
|
|
|
// The event channels.
|
|
|
|
newLogCh := make(chan []*types.Log, 10)
|
|
|
|
rmLogsCh := make(chan core.RemovedLogsEvent, 10)
|
|
|
|
ethservice.BlockChain().SubscribeLogsEvent(newLogCh)
|
|
|
|
ethservice.BlockChain().SubscribeRemovedLogsEvent(rmLogsCh)
|
|
|
|
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
statedb, _ := ethservice.BlockChain().StateAt(parent.Root())
|
|
|
|
nonce := statedb.GetNonce(testAddr)
|
|
|
|
tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey)
|
|
|
|
ethservice.TxPool().AddLocal(tx)
|
|
|
|
|
2022-05-18 09:33:37 -05:00
|
|
|
execData, err := assembleBlock(api, parent.Hash(), &beacon.PayloadAttributesV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
Timestamp: parent.Time() + 5,
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to create the executable data %v", err)
|
|
|
|
}
|
2022-01-31 06:22:35 -06:00
|
|
|
block, err := beacon.ExecutableDataToBlock(*execData)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to convert executable data to block %v", err)
|
|
|
|
}
|
2022-03-17 10:20:03 -05:00
|
|
|
newResp, err := api.NewPayloadV1(*execData)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if err != nil || newResp.Status != "VALID" {
|
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64()-1 {
|
|
|
|
t.Fatalf("Chain head shouldn't be updated")
|
|
|
|
}
|
|
|
|
checkLogEvents(t, newLogCh, rmLogsCh, 0, 0)
|
2022-01-31 06:22:35 -06:00
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
HeadBlockHash: block.Hash(),
|
|
|
|
SafeBlockHash: block.Hash(),
|
|
|
|
FinalizedBlockHash: block.Hash(),
|
|
|
|
}
|
|
|
|
if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
2021-04-16 14:29:22 -05:00
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() {
|
|
|
|
t.Fatalf("Chain head should be updated")
|
|
|
|
}
|
|
|
|
checkLogEvents(t, newLogCh, rmLogsCh, 1, 0)
|
|
|
|
|
|
|
|
parent = block
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
// Introduce fork chain
|
|
|
|
var (
|
|
|
|
head = ethservice.BlockChain().CurrentBlock().NumberU64()
|
|
|
|
)
|
|
|
|
parent = preMergeBlocks[len(preMergeBlocks)-1]
|
|
|
|
for i := 0; i < 10; i++ {
|
2022-05-18 09:33:37 -05:00
|
|
|
execData, err := assembleBlock(api, parent.Hash(), &beacon.PayloadAttributesV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
Timestamp: parent.Time() + 6,
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
})
|
2021-04-16 14:29:22 -05:00
|
|
|
if err != nil {
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
t.Fatalf("Failed to create the executable data %v", err)
|
|
|
|
}
|
2022-01-31 06:22:35 -06:00
|
|
|
block, err := beacon.ExecutableDataToBlock(*execData)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to convert executable data to block %v", err)
|
|
|
|
}
|
2022-03-17 10:20:03 -05:00
|
|
|
newResp, err := api.NewPayloadV1(*execData)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
if err != nil || newResp.Status != "VALID" {
|
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != head {
|
|
|
|
t.Fatalf("Chain head shouldn't be updated")
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
|
2022-01-31 06:22:35 -06:00
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
2021-12-03 09:26:28 -06:00
|
|
|
HeadBlockHash: block.Hash(),
|
|
|
|
SafeBlockHash: block.Hash(),
|
|
|
|
FinalizedBlockHash: block.Hash(),
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
}
|
2021-12-03 09:26:28 -06:00
|
|
|
if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() {
|
|
|
|
t.Fatalf("Chain head should be updated")
|
|
|
|
}
|
|
|
|
parent, head = block, block.NumberU64()
|
2021-04-16 14:29:22 -05:00
|
|
|
}
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
|
|
|
|
func TestEth2DeepReorg(t *testing.T) {
|
|
|
|
// TODO (MariusVanDerWijden) TestEth2DeepReorg is currently broken, because it tries to reorg
|
|
|
|
// before the totalTerminalDifficulty threshold
|
|
|
|
/*
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(core.TriesInMemory * 2)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
|
|
|
|
var (
|
|
|
|
api = NewConsensusAPI(ethservice, nil)
|
|
|
|
parent = preMergeBlocks[len(preMergeBlocks)-core.TriesInMemory-1]
|
|
|
|
head = ethservice.BlockChain().CurrentBlock().NumberU64()
|
|
|
|
)
|
|
|
|
if ethservice.BlockChain().HasBlockAndState(parent.Hash(), parent.NumberU64()) {
|
|
|
|
t.Errorf("Block %d not pruned", parent.NumberU64())
|
|
|
|
}
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
execData, err := api.assembleBlock(AssembleBlockParams{
|
|
|
|
ParentHash: parent.Hash(),
|
|
|
|
Timestamp: parent.Time() + 5,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to create the executable data %v", err)
|
|
|
|
}
|
|
|
|
block, err := ExecutableDataToBlock(ethservice.BlockChain().Config(), parent.Header(), *execData)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to convert executable data to block %v", err)
|
|
|
|
}
|
|
|
|
newResp, err := api.ExecutePayload(*execData)
|
|
|
|
if err != nil || newResp.Status != "VALID" {
|
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != head {
|
|
|
|
t.Fatalf("Chain head shouldn't be updated")
|
|
|
|
}
|
|
|
|
if err := api.setHead(block.Hash()); err != nil {
|
|
|
|
t.Fatalf("Failed to set head: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() {
|
|
|
|
t.Fatalf("Chain head should be updated")
|
|
|
|
}
|
|
|
|
parent, head = block, block.NumberU64()
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
2021-04-16 14:29:22 -05:00
|
|
|
|
|
|
|
// startEthService creates a full node instance for testing.
|
|
|
|
func startEthService(t *testing.T, genesis *core.Genesis, blocks []*types.Block) (*node.Node, *eth.Ethereum) {
|
|
|
|
t.Helper()
|
|
|
|
|
2022-05-20 03:12:12 -05:00
|
|
|
n, err := node.New(&node.Config{
|
|
|
|
P2P: p2p.Config{
|
|
|
|
ListenAddr: "0.0.0.0:0",
|
|
|
|
NoDiscovery: true,
|
|
|
|
MaxPeers: 25,
|
|
|
|
}})
|
2021-04-16 14:29:22 -05:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal("can't create node:", err)
|
|
|
|
}
|
2022-05-20 03:12:12 -05:00
|
|
|
|
2022-07-01 06:38:26 -05:00
|
|
|
ethcfg := ðconfig.Config{Genesis: genesis, Ethash: ethash.Config{PowMode: ethash.ModeFake}, SyncMode: downloader.FullSync, TrieTimeout: time.Minute, TrieDirtyCache: 256, TrieCleanCache: 256}
|
2021-04-16 14:29:22 -05:00
|
|
|
ethservice, err := eth.New(n, ethcfg)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("can't create eth service:", err)
|
|
|
|
}
|
|
|
|
if err := n.Start(); err != nil {
|
|
|
|
t.Fatal("can't start node:", err)
|
|
|
|
}
|
|
|
|
if _, err := ethservice.BlockChain().InsertChain(blocks); err != nil {
|
|
|
|
n.Close()
|
|
|
|
t.Fatal("can't import test blocks:", err)
|
|
|
|
}
|
2022-05-17 03:19:51 -05:00
|
|
|
time.Sleep(500 * time.Millisecond) // give txpool enough time to consume head event
|
|
|
|
|
2021-04-16 14:29:22 -05:00
|
|
|
ethservice.SetEtherbase(testAddr)
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
ethservice.SetSynced()
|
2021-04-16 14:29:22 -05:00
|
|
|
return n, ethservice
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
|
|
|
|
func TestFullAPI(t *testing.T) {
|
2022-03-17 10:20:03 -05:00
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
var (
|
|
|
|
parent = ethservice.BlockChain().CurrentBlock()
|
|
|
|
// This EVM code generates a log when the contract is created.
|
|
|
|
logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00")
|
|
|
|
)
|
2022-05-20 03:12:12 -05:00
|
|
|
|
|
|
|
callback := func(parent *types.Block) {
|
2022-03-17 10:20:03 -05:00
|
|
|
statedb, _ := ethservice.BlockChain().StateAt(parent.Root())
|
|
|
|
nonce := statedb.GetNonce(testAddr)
|
|
|
|
tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey)
|
|
|
|
ethservice.TxPool().AddLocal(tx)
|
2022-05-20 03:12:12 -05:00
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
|
2022-05-20 03:12:12 -05:00
|
|
|
setupBlocks(t, ethservice, 10, parent, callback)
|
|
|
|
}
|
|
|
|
|
|
|
|
func setupBlocks(t *testing.T, ethservice *eth.Ethereum, n int, parent *types.Block, callback func(parent *types.Block)) {
|
|
|
|
api := NewConsensusAPI(ethservice)
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
callback(parent)
|
|
|
|
|
|
|
|
payload := getNewPayload(t, api, parent)
|
2022-03-17 10:20:03 -05:00
|
|
|
|
|
|
|
execResp, err := api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("can't execute payload: %v", err)
|
|
|
|
}
|
|
|
|
if execResp.Status != beacon.VALID {
|
|
|
|
t.Fatalf("invalid status: %v", execResp.Status)
|
|
|
|
}
|
2022-05-20 03:12:12 -05:00
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
2022-03-17 10:20:03 -05:00
|
|
|
HeadBlockHash: payload.BlockHash,
|
|
|
|
SafeBlockHash: payload.ParentHash,
|
|
|
|
FinalizedBlockHash: payload.ParentHash,
|
|
|
|
}
|
|
|
|
if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != payload.Number {
|
2022-05-18 09:30:42 -05:00
|
|
|
t.Fatal("Chain head should be updated")
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentFinalizedBlock().NumberU64() != payload.Number-1 {
|
|
|
|
t.Fatal("Finalized block should be updated")
|
2022-03-17 10:20:03 -05:00
|
|
|
}
|
|
|
|
parent = ethservice.BlockChain().CurrentBlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestExchangeTransitionConfig(t *testing.T) {
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
var (
|
|
|
|
api = NewConsensusAPI(ethservice)
|
|
|
|
)
|
|
|
|
// invalid ttd
|
|
|
|
config := beacon.TransitionConfigurationV1{
|
|
|
|
TerminalTotalDifficulty: (*hexutil.Big)(big.NewInt(0)),
|
|
|
|
TerminalBlockHash: common.Hash{},
|
|
|
|
TerminalBlockNumber: 0,
|
|
|
|
}
|
|
|
|
if _, err := api.ExchangeTransitionConfigurationV1(config); err == nil {
|
|
|
|
t.Fatal("expected error on invalid config, invalid ttd")
|
|
|
|
}
|
|
|
|
// invalid terminal block hash
|
|
|
|
config = beacon.TransitionConfigurationV1{
|
|
|
|
TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty),
|
|
|
|
TerminalBlockHash: common.Hash{1},
|
|
|
|
TerminalBlockNumber: 0,
|
|
|
|
}
|
|
|
|
if _, err := api.ExchangeTransitionConfigurationV1(config); err == nil {
|
|
|
|
t.Fatal("expected error on invalid config, invalid hash")
|
|
|
|
}
|
|
|
|
// valid config
|
|
|
|
config = beacon.TransitionConfigurationV1{
|
|
|
|
TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty),
|
|
|
|
TerminalBlockHash: common.Hash{},
|
|
|
|
TerminalBlockNumber: 0,
|
|
|
|
}
|
|
|
|
if _, err := api.ExchangeTransitionConfigurationV1(config); err != nil {
|
|
|
|
t.Fatalf("expected no error on valid config, got %v", err)
|
|
|
|
}
|
|
|
|
// valid config
|
|
|
|
config = beacon.TransitionConfigurationV1{
|
|
|
|
TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty),
|
|
|
|
TerminalBlockHash: preMergeBlocks[5].Hash(),
|
|
|
|
TerminalBlockNumber: 6,
|
|
|
|
}
|
|
|
|
if _, err := api.ExchangeTransitionConfigurationV1(config); err != nil {
|
|
|
|
t.Fatalf("expected no error on valid config, got %v", err)
|
|
|
|
}
|
all: core rework for the merge transition (#23761)
* all: work for eth1/2 transtition
* consensus/beacon, eth: change beacon difficulty to 0
* eth: updates
* all: add terminalBlockDifficulty config, fix rebasing issues
* eth: implemented merge interop spec
* internal/ethapi: update to v1.0.0.alpha.2
This commit updates the code to the new spec, moving payloadId into
it's own object. It also fixes an issue with finalizing an empty blockhash.
It also properly sets the basefee
* all: sync polishes, other fixes + refactors
* core, eth: correct semantics for LeavePoW, EnterPoS
* core: fixed rebasing artifacts
* core: light: performance improvements
* core: use keyed field (f)
* core: eth: fix compilation issues + tests
* eth/catalyst: dbetter error codes
* all: move Merger to consensus/, remove reliance on it in bc
* all: renamed EnterPoS and LeavePoW to ReachTDD and FinalizePoS
* core: make mergelogs a function
* core: use InsertChain instead of InsertBlock
* les: drop merger from lightchain object
* consensus: add merger
* core: recoverAncestors in catalyst mode
* core: fix nitpick
* all: removed merger from beacon, use TTD, nitpicks
* consensus: eth: add docstring, removed unnecessary code duplication
* consensus/beacon: better comment
* all: easy to fix nitpicks by karalabe
* consensus/beacon: verify known headers to be sure
* core: comments
* core: eth: don't drop peers who advertise blocks, nitpicks
* core: never add beacon blocks to the future queue
* core: fixed nitpicks
* consensus/beacon: simplify IsTTDReached check
* consensus/beacon: correct IsTTDReached check
Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2021-11-26 05:23:02 -06:00
|
|
|
}
|
2022-05-18 09:33:37 -05:00
|
|
|
|
2022-05-20 03:12:12 -05:00
|
|
|
/*
|
|
|
|
TestNewPayloadOnInvalidChain sets up a valid chain and tries to feed blocks
|
|
|
|
from an invalid chain to test if latestValidHash (LVH) works correctly.
|
|
|
|
|
|
|
|
We set up the following chain where P1 ... Pn and P1'' are valid while
|
|
|
|
P1' is invalid.
|
|
|
|
We expect
|
|
|
|
(1) The LVH to point to the current inserted payload if it was valid.
|
|
|
|
(2) The LVH to point to the valid parent on an invalid payload (if the parent is available).
|
|
|
|
(3) If the parent is unavailable, the LVH should not be set.
|
|
|
|
|
|
|
|
CommonAncestor◄─▲── P1 ◄── P2 ◄─ P3 ◄─ ... ◄─ Pn
|
|
|
|
│
|
|
|
|
└── P1' ◄─ P2' ◄─ P3' ◄─ ... ◄─ Pn'
|
|
|
|
│
|
|
|
|
└── P1''
|
|
|
|
*/
|
|
|
|
func TestNewPayloadOnInvalidChain(t *testing.T) {
|
2022-05-18 09:33:37 -05:00
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
2022-05-20 03:12:12 -05:00
|
|
|
|
2022-05-18 09:33:37 -05:00
|
|
|
var (
|
|
|
|
api = NewConsensusAPI(ethservice)
|
|
|
|
parent = ethservice.BlockChain().CurrentBlock()
|
|
|
|
// This EVM code generates a log when the contract is created.
|
|
|
|
logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00")
|
|
|
|
)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
statedb, _ := ethservice.BlockChain().StateAt(parent.Root())
|
|
|
|
nonce := statedb.GetNonce(testAddr)
|
|
|
|
tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey)
|
|
|
|
ethservice.TxPool().AddLocal(tx)
|
|
|
|
|
|
|
|
params := beacon.PayloadAttributesV1{
|
|
|
|
Timestamp: parent.Time() + 1,
|
|
|
|
Random: crypto.Keccak256Hash([]byte{byte(i)}),
|
|
|
|
SuggestedFeeRecipient: parent.Coinbase(),
|
|
|
|
}
|
|
|
|
|
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
|
|
|
HeadBlockHash: parent.Hash(),
|
|
|
|
SafeBlockHash: common.Hash{},
|
|
|
|
FinalizedBlockHash: common.Hash{},
|
|
|
|
}
|
|
|
|
resp, err := api.ForkchoiceUpdatedV1(fcState, ¶ms)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error preparing payload, err=%v", err)
|
|
|
|
}
|
|
|
|
if resp.PayloadStatus.Status != beacon.VALID {
|
|
|
|
t.Fatalf("error preparing payload, invalid status: %v", resp.PayloadStatus.Status)
|
|
|
|
}
|
|
|
|
payload, err := api.GetPayloadV1(*resp.PayloadID)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("can't get payload: %v", err)
|
|
|
|
}
|
|
|
|
// TODO(493456442, marius) this test can be flaky since we rely on a 100ms
|
|
|
|
// allowance for block generation internally.
|
|
|
|
if len(payload.Transactions) == 0 {
|
|
|
|
t.Fatalf("payload should not be empty")
|
|
|
|
}
|
|
|
|
execResp, err := api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("can't execute payload: %v", err)
|
|
|
|
}
|
|
|
|
if execResp.Status != beacon.VALID {
|
|
|
|
t.Fatalf("invalid status: %v", execResp.Status)
|
|
|
|
}
|
|
|
|
fcState = beacon.ForkchoiceStateV1{
|
|
|
|
HeadBlockHash: payload.BlockHash,
|
|
|
|
SafeBlockHash: payload.ParentHash,
|
|
|
|
FinalizedBlockHash: payload.ParentHash,
|
|
|
|
}
|
|
|
|
if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil {
|
|
|
|
t.Fatalf("Failed to insert block: %v", err)
|
|
|
|
}
|
|
|
|
if ethservice.BlockChain().CurrentBlock().NumberU64() != payload.Number {
|
|
|
|
t.Fatalf("Chain head should be updated")
|
|
|
|
}
|
|
|
|
parent = ethservice.BlockChain().CurrentBlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func assembleBlock(api *ConsensusAPI, parentHash common.Hash, params *beacon.PayloadAttributesV1) (*beacon.ExecutableDataV1, error) {
|
|
|
|
block, err := api.eth.Miner().GetSealingBlockSync(parentHash, params.Timestamp, params.SuggestedFeeRecipient, params.Random, false)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return beacon.BlockToExecutableData(block), nil
|
|
|
|
}
|
2022-05-20 03:12:12 -05:00
|
|
|
|
|
|
|
func TestEmptyBlocks(t *testing.T) {
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
|
|
|
|
commonAncestor := ethservice.BlockChain().CurrentBlock()
|
|
|
|
api := NewConsensusAPI(ethservice)
|
|
|
|
|
|
|
|
// Setup 10 blocks on the canonical chain
|
|
|
|
setupBlocks(t, ethservice, 10, commonAncestor, func(parent *types.Block) {})
|
|
|
|
|
|
|
|
// (1) check LatestValidHash by sending a normal payload (P1'')
|
|
|
|
payload := getNewPayload(t, api, commonAncestor)
|
|
|
|
|
|
|
|
status, err := api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if status.Status != beacon.VALID {
|
|
|
|
t.Errorf("invalid status: expected VALID got: %v", status.Status)
|
|
|
|
}
|
|
|
|
if !bytes.Equal(status.LatestValidHash[:], payload.BlockHash[:]) {
|
|
|
|
t.Fatalf("invalid LVH: got %v want %v", status.LatestValidHash, payload.BlockHash)
|
|
|
|
}
|
|
|
|
|
|
|
|
// (2) Now send P1' which is invalid
|
|
|
|
payload = getNewPayload(t, api, commonAncestor)
|
|
|
|
payload.GasUsed += 1
|
|
|
|
payload = setBlockhash(payload)
|
|
|
|
// Now latestValidHash should be the common ancestor
|
|
|
|
status, err = api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if status.Status != beacon.INVALID {
|
|
|
|
t.Errorf("invalid status: expected INVALID got: %v", status.Status)
|
|
|
|
}
|
2022-06-02 06:15:17 -05:00
|
|
|
// Expect 0x0 on INVALID block on top of PoW block
|
|
|
|
expected := common.Hash{}
|
2022-05-20 03:12:12 -05:00
|
|
|
if !bytes.Equal(status.LatestValidHash[:], expected[:]) {
|
|
|
|
t.Fatalf("invalid LVH: got %v want %v", status.LatestValidHash, expected)
|
|
|
|
}
|
|
|
|
|
|
|
|
// (3) Now send a payload with unknown parent
|
|
|
|
payload = getNewPayload(t, api, commonAncestor)
|
|
|
|
payload.ParentHash = common.Hash{1}
|
|
|
|
payload = setBlockhash(payload)
|
|
|
|
// Now latestValidHash should be the common ancestor
|
|
|
|
status, err = api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2022-07-28 08:01:35 -05:00
|
|
|
if status.Status != beacon.SYNCING {
|
|
|
|
t.Errorf("invalid status: expected SYNCING got: %v", status.Status)
|
2022-05-20 03:12:12 -05:00
|
|
|
}
|
|
|
|
if status.LatestValidHash != nil {
|
|
|
|
t.Fatalf("invalid LVH: got %v wanted nil", status.LatestValidHash)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getNewPayload(t *testing.T, api *ConsensusAPI, parent *types.Block) *beacon.ExecutableDataV1 {
|
|
|
|
params := beacon.PayloadAttributesV1{
|
|
|
|
Timestamp: parent.Time() + 1,
|
|
|
|
Random: crypto.Keccak256Hash([]byte{byte(1)}),
|
|
|
|
SuggestedFeeRecipient: parent.Coinbase(),
|
|
|
|
}
|
|
|
|
|
|
|
|
payload, err := assembleBlock(api, parent.Hash(), ¶ms)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
return payload
|
|
|
|
}
|
|
|
|
|
|
|
|
// setBlockhash sets the blockhash of a modified ExecutableData.
|
|
|
|
// Can be used to make modified payloads look valid.
|
|
|
|
func setBlockhash(data *beacon.ExecutableDataV1) *beacon.ExecutableDataV1 {
|
|
|
|
txs, _ := decodeTransactions(data.Transactions)
|
|
|
|
number := big.NewInt(0)
|
|
|
|
number.SetUint64(data.Number)
|
|
|
|
header := &types.Header{
|
|
|
|
ParentHash: data.ParentHash,
|
|
|
|
UncleHash: types.EmptyUncleHash,
|
|
|
|
Coinbase: data.FeeRecipient,
|
|
|
|
Root: data.StateRoot,
|
|
|
|
TxHash: types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)),
|
|
|
|
ReceiptHash: data.ReceiptsRoot,
|
|
|
|
Bloom: types.BytesToBloom(data.LogsBloom),
|
|
|
|
Difficulty: common.Big0,
|
|
|
|
Number: number,
|
|
|
|
GasLimit: data.GasLimit,
|
|
|
|
GasUsed: data.GasUsed,
|
|
|
|
Time: data.Timestamp,
|
|
|
|
BaseFee: data.BaseFeePerGas,
|
|
|
|
Extra: data.ExtraData,
|
|
|
|
MixDigest: data.Random,
|
|
|
|
}
|
|
|
|
block := types.NewBlockWithHeader(header).WithBody(txs, nil /* uncles */)
|
|
|
|
data.BlockHash = block.Hash()
|
|
|
|
return data
|
|
|
|
}
|
|
|
|
|
|
|
|
func decodeTransactions(enc [][]byte) ([]*types.Transaction, error) {
|
|
|
|
var txs = make([]*types.Transaction, len(enc))
|
|
|
|
for i, encTx := range enc {
|
|
|
|
var tx types.Transaction
|
|
|
|
if err := tx.UnmarshalBinary(encTx); err != nil {
|
|
|
|
return nil, fmt.Errorf("invalid transaction %d: %v", i, err)
|
|
|
|
}
|
|
|
|
txs[i] = &tx
|
|
|
|
}
|
|
|
|
return txs, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTrickRemoteBlockCache(t *testing.T) {
|
|
|
|
// Setup two nodes
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
nodeA, ethserviceA := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
nodeB, ethserviceB := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer nodeA.Close()
|
|
|
|
defer nodeB.Close()
|
|
|
|
for nodeB.Server().NodeInfo().Ports.Listener == 0 {
|
|
|
|
time.Sleep(250 * time.Millisecond)
|
|
|
|
}
|
|
|
|
nodeA.Server().AddPeer(nodeB.Server().Self())
|
|
|
|
nodeB.Server().AddPeer(nodeA.Server().Self())
|
|
|
|
apiA := NewConsensusAPI(ethserviceA)
|
|
|
|
apiB := NewConsensusAPI(ethserviceB)
|
|
|
|
|
|
|
|
commonAncestor := ethserviceA.BlockChain().CurrentBlock()
|
|
|
|
|
|
|
|
// Setup 10 blocks on the canonical chain
|
|
|
|
setupBlocks(t, ethserviceA, 10, commonAncestor, func(parent *types.Block) {})
|
|
|
|
commonAncestor = ethserviceA.BlockChain().CurrentBlock()
|
|
|
|
|
|
|
|
var invalidChain []*beacon.ExecutableDataV1
|
|
|
|
// create a valid payload (P1)
|
|
|
|
//payload1 := getNewPayload(t, apiA, commonAncestor)
|
|
|
|
//invalidChain = append(invalidChain, payload1)
|
|
|
|
|
|
|
|
// create an invalid payload2 (P2)
|
|
|
|
payload2 := getNewPayload(t, apiA, commonAncestor)
|
|
|
|
//payload2.ParentHash = payload1.BlockHash
|
|
|
|
payload2.GasUsed += 1
|
|
|
|
payload2 = setBlockhash(payload2)
|
|
|
|
invalidChain = append(invalidChain, payload2)
|
|
|
|
|
|
|
|
head := payload2
|
|
|
|
// create some valid payloads on top
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
payload := getNewPayload(t, apiA, commonAncestor)
|
|
|
|
payload.ParentHash = head.BlockHash
|
|
|
|
payload = setBlockhash(payload)
|
|
|
|
invalidChain = append(invalidChain, payload)
|
|
|
|
head = payload
|
|
|
|
}
|
|
|
|
|
|
|
|
// feed the payloads to node B
|
|
|
|
for _, payload := range invalidChain {
|
|
|
|
status, err := apiB.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2022-07-25 08:51:04 -05:00
|
|
|
if status.Status == beacon.VALID {
|
|
|
|
t.Error("invalid status: VALID on an invalid chain")
|
2022-05-20 03:12:12 -05:00
|
|
|
}
|
|
|
|
// Now reorg to the head of the invalid chain
|
|
|
|
resp, err := apiB.ForkchoiceUpdatedV1(beacon.ForkchoiceStateV1{HeadBlockHash: payload.BlockHash, SafeBlockHash: payload.BlockHash, FinalizedBlockHash: payload.ParentHash}, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if resp.PayloadStatus.Status == beacon.VALID {
|
2022-07-25 08:51:04 -05:00
|
|
|
t.Error("invalid status: VALID on an invalid chain")
|
2022-05-20 03:12:12 -05:00
|
|
|
}
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
}
|
|
|
|
}
|
2022-05-30 06:28:15 -05:00
|
|
|
|
2022-05-31 04:11:50 -05:00
|
|
|
func TestInvalidBloom(t *testing.T) {
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(10)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
ethservice.Merger().ReachTTD()
|
|
|
|
defer n.Close()
|
|
|
|
|
|
|
|
commonAncestor := ethservice.BlockChain().CurrentBlock()
|
|
|
|
api := NewConsensusAPI(ethservice)
|
|
|
|
|
|
|
|
// Setup 10 blocks on the canonical chain
|
|
|
|
setupBlocks(t, ethservice, 10, commonAncestor, func(parent *types.Block) {})
|
|
|
|
|
|
|
|
// (1) check LatestValidHash by sending a normal payload (P1'')
|
|
|
|
payload := getNewPayload(t, api, commonAncestor)
|
|
|
|
payload.LogsBloom = append(payload.LogsBloom, byte(1))
|
|
|
|
status, err := api.NewPayloadV1(*payload)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if status.Status != beacon.INVALIDBLOCKHASH {
|
|
|
|
t.Errorf("invalid status: expected VALID got: %v", status.Status)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-30 06:28:15 -05:00
|
|
|
func TestNewPayloadOnInvalidTerminalBlock(t *testing.T) {
|
|
|
|
genesis, preMergeBlocks := generatePreMergeChain(100)
|
|
|
|
fmt.Println(genesis.Config.TerminalTotalDifficulty)
|
|
|
|
genesis.Config.TerminalTotalDifficulty = preMergeBlocks[0].Difficulty() //.Sub(genesis.Config.TerminalTotalDifficulty, preMergeBlocks[len(preMergeBlocks)-1].Difficulty())
|
|
|
|
|
|
|
|
fmt.Println(genesis.Config.TerminalTotalDifficulty)
|
|
|
|
n, ethservice := startEthService(t, genesis, preMergeBlocks)
|
|
|
|
defer n.Close()
|
|
|
|
|
|
|
|
var (
|
|
|
|
api = NewConsensusAPI(ethservice)
|
|
|
|
parent = preMergeBlocks[len(preMergeBlocks)-1]
|
|
|
|
)
|
|
|
|
|
|
|
|
// Test parent already post TTD in FCU
|
|
|
|
fcState := beacon.ForkchoiceStateV1{
|
|
|
|
HeadBlockHash: parent.Hash(),
|
|
|
|
SafeBlockHash: common.Hash{},
|
|
|
|
FinalizedBlockHash: common.Hash{},
|
|
|
|
}
|
|
|
|
resp, err := api.ForkchoiceUpdatedV1(fcState, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error sending forkchoice, err=%v", err)
|
|
|
|
}
|
|
|
|
if resp.PayloadStatus != beacon.INVALID_TERMINAL_BLOCK {
|
|
|
|
t.Fatalf("error sending invalid forkchoice, invalid status: %v", resp.PayloadStatus.Status)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test parent already post TTD in NewPayload
|
|
|
|
params := beacon.PayloadAttributesV1{
|
|
|
|
Timestamp: parent.Time() + 1,
|
|
|
|
Random: crypto.Keccak256Hash([]byte{byte(1)}),
|
|
|
|
SuggestedFeeRecipient: parent.Coinbase(),
|
|
|
|
}
|
|
|
|
empty, err := api.eth.Miner().GetSealingBlockSync(parent.Hash(), params.Timestamp, params.SuggestedFeeRecipient, params.Random, true)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error preparing payload, err=%v", err)
|
|
|
|
}
|
|
|
|
data := *beacon.BlockToExecutableData(empty)
|
|
|
|
resp2, err := api.NewPayloadV1(data)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error sending NewPayload, err=%v", err)
|
|
|
|
}
|
|
|
|
if resp2 != beacon.INVALID_TERMINAL_BLOCK {
|
|
|
|
t.Fatalf("error sending invalid forkchoice, invalid status: %v", resp.PayloadStatus.Status)
|
|
|
|
}
|
|
|
|
}
|