mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 07:06:42 +00:00
Enforce parallel evm via flag (#1425)
* (feat): implement --parallelevm.enforce to force using block-stm * core: debug log * docs: update docs with new flag * update all config files * core: modify chain import test to enforce parallel processing
This commit is contained in:
parent
9da0432ec2
commit
8a1e0ec125
25 changed files with 111 additions and 8 deletions
|
|
@ -179,6 +179,7 @@ syncmode = "full"
|
||||||
# [parallelevm]
|
# [parallelevm]
|
||||||
# enable = true
|
# enable = true
|
||||||
# procs = 8
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
|
|
|
||||||
|
|
@ -281,6 +281,7 @@ type BlockChain struct {
|
||||||
processor Processor // Block transaction processor interface
|
processor Processor // Block transaction processor interface
|
||||||
parallelProcessor Processor // Parallel block transaction processor interface
|
parallelProcessor Processor // Parallel block transaction processor interface
|
||||||
parallelSpeculativeProcesses int // Number of parallel speculative processes
|
parallelSpeculativeProcesses int // Number of parallel speculative processes
|
||||||
|
enforceParallelProcessor bool
|
||||||
forker *ForkChoice
|
forker *ForkChoice
|
||||||
vmConfig vm.Config
|
vmConfig vm.Config
|
||||||
logger *tracing.Hooks
|
logger *tracing.Hooks
|
||||||
|
|
@ -551,7 +552,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewParallelBlockChain , similar to NewBlockChain, creates a new blockchain object, but with a parallel state processor
|
// NewParallelBlockChain , similar to NewBlockChain, creates a new blockchain object, but with a parallel state processor
|
||||||
func NewParallelBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis, overrides *ChainOverrides, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(header *types.Header) bool, txLookupLimit *uint64, checker ethereum.ChainValidator, numprocs int) (*BlockChain, error) {
|
func NewParallelBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis, overrides *ChainOverrides, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(header *types.Header) bool, txLookupLimit *uint64, checker ethereum.ChainValidator, numprocs int, enforce bool) (*BlockChain, error) {
|
||||||
bc, err := NewBlockChain(db, cacheConfig, genesis, overrides, engine, vmConfig, shouldPreserve, txLookupLimit, checker)
|
bc, err := NewBlockChain(db, cacheConfig, genesis, overrides, engine, vmConfig, shouldPreserve, txLookupLimit, checker)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -569,6 +570,7 @@ func NewParallelBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis
|
||||||
|
|
||||||
bc.parallelProcessor = NewParallelStateProcessor(chainConfig, bc, engine)
|
bc.parallelProcessor = NewParallelStateProcessor(chainConfig, bc, engine)
|
||||||
bc.parallelSpeculativeProcesses = numprocs
|
bc.parallelSpeculativeProcesses = numprocs
|
||||||
|
bc.enforceParallelProcessor = enforce
|
||||||
|
|
||||||
return bc, nil
|
return bc, nil
|
||||||
}
|
}
|
||||||
|
|
@ -604,7 +606,12 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
|
||||||
parallel bool
|
parallel bool
|
||||||
}
|
}
|
||||||
|
|
||||||
resultChan := make(chan Result, 2)
|
var resultChanLen int = 2
|
||||||
|
if bc.enforceParallelProcessor {
|
||||||
|
log.Debug("Processing block using Block STM only", "number", block.NumberU64())
|
||||||
|
resultChanLen = 1
|
||||||
|
}
|
||||||
|
resultChan := make(chan Result, resultChanLen)
|
||||||
|
|
||||||
processorCount := 0
|
processorCount := 0
|
||||||
|
|
||||||
|
|
@ -631,7 +638,7 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
if bc.processor != nil {
|
if bc.processor != nil && !bc.enforceParallelProcessor {
|
||||||
statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps)
|
statedb, err := state.New(parent.Root, bc.stateCache, bc.snaps)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, 0, nil, 0, err
|
return nil, nil, 0, nil, 0, err
|
||||||
|
|
|
||||||
|
|
@ -195,11 +195,14 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error {
|
||||||
func TestParallelBlockChainImport(t *testing.T) {
|
func TestParallelBlockChainImport(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
testParallelBlockChainImport(t, rawdb.HashScheme)
|
testParallelBlockChainImport(t, rawdb.HashScheme, false)
|
||||||
testParallelBlockChainImport(t, rawdb.PathScheme)
|
testParallelBlockChainImport(t, rawdb.PathScheme, false)
|
||||||
|
|
||||||
|
testParallelBlockChainImport(t, rawdb.HashScheme, true)
|
||||||
|
testParallelBlockChainImport(t, rawdb.PathScheme, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testParallelBlockChainImport(t *testing.T, scheme string) {
|
func testParallelBlockChainImport(t *testing.T, scheme string, enforceParallelProcessor bool) {
|
||||||
db, _, blockchain, err := newCanonical(ethash.NewFaker(), 10, true, scheme)
|
db, _, blockchain, err := newCanonical(ethash.NewFaker(), 10, true, scheme)
|
||||||
blockchain.parallelProcessor = NewParallelStateProcessor(blockchain.chainConfig, blockchain, blockchain.engine)
|
blockchain.parallelProcessor = NewParallelStateProcessor(blockchain.chainConfig, blockchain, blockchain.engine)
|
||||||
|
|
||||||
|
|
@ -207,6 +210,8 @@ func testParallelBlockChainImport(t *testing.T, scheme string) {
|
||||||
t.Fatalf("failed to make new canonical chain: %v", err)
|
t.Fatalf("failed to make new canonical chain: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If required, enforce parallel block processing and skip serial processing completely
|
||||||
|
blockchain.enforceParallelProcessor = enforceParallelProcessor
|
||||||
defer blockchain.Stop()
|
defer blockchain.Stop()
|
||||||
|
|
||||||
block := blockchain.GetBlockByHash(blockchain.CurrentBlock().Hash())
|
block := blockchain.GetBlockByHash(blockchain.CurrentBlock().Hash())
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ import (
|
||||||
type ParallelEVMConfig struct {
|
type ParallelEVMConfig struct {
|
||||||
Enable bool
|
Enable bool
|
||||||
SpeculativeProcesses int
|
SpeculativeProcesses int
|
||||||
|
Enforce bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateProcessor is a basic Processor, which takes care of transitioning
|
// StateProcessor is a basic Processor, which takes care of transitioning
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,11 @@ devfakeauthor = false # Run miner without validator set authorization
|
||||||
period = 0 # Block period to use in developer mode (0 = mine only if transaction pending)
|
period = 0 # Block period to use in developer mode (0 = mine only if transaction pending)
|
||||||
gaslimit = 11500000 # Initial block gas limit
|
gaslimit = 11500000 # Initial block gas limit
|
||||||
|
|
||||||
|
[parallelevm]
|
||||||
|
enable = true # Enables parallel execution using Block STM
|
||||||
|
procs = 8 # Number of speculative processes (cores) in Block STM
|
||||||
|
enforce = false # Use only Block STM for execution and skip serial execution
|
||||||
|
|
||||||
[pprof]
|
[pprof]
|
||||||
pprof = false # Enable the pprof HTTP server
|
pprof = false # Enable the pprof HTTP server
|
||||||
port = 6060 # pprof HTTP server listening port
|
port = 6060 # pprof HTTP server listening port
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,8 @@ The ```bor server``` command runs the Bor client.
|
||||||
|
|
||||||
- ```parallelevm.enable```: Enable Block STM (default: true)
|
- ```parallelevm.enable```: Enable Block STM (default: true)
|
||||||
|
|
||||||
|
- ```parallelevm.enforce```: Enforce block processing via Block STM (default: false)
|
||||||
|
|
||||||
- ```parallelevm.procs```: Number of speculative processes (cores) in Block STM (default: 8)
|
- ```parallelevm.procs```: Number of speculative processes (cores) in Block STM (default: 8)
|
||||||
|
|
||||||
- ```pprof```: Enable the pprof HTTP server (default: false)
|
- ```pprof```: Enable the pprof HTTP server (default: false)
|
||||||
|
|
|
||||||
|
|
@ -258,7 +258,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) {
|
||||||
// check if Parallel EVM is enabled
|
// check if Parallel EVM is enabled
|
||||||
// if enabled, use parallel state processor
|
// if enabled, use parallel state processor
|
||||||
if config.ParallelEVM.Enable {
|
if config.ParallelEVM.Enable {
|
||||||
eth.blockchain, err = core.NewParallelBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit, checker, config.ParallelEVM.SpeculativeProcesses)
|
eth.blockchain, err = core.NewParallelBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit, checker, config.ParallelEVM.SpeculativeProcesses, config.ParallelEVM.Enforce)
|
||||||
} else {
|
} else {
|
||||||
eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit, checker)
|
eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit, checker)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -597,6 +597,8 @@ type ParallelEVMConfig struct {
|
||||||
Enable bool `hcl:"enable,optional" toml:"enable,optional"`
|
Enable bool `hcl:"enable,optional" toml:"enable,optional"`
|
||||||
|
|
||||||
SpeculativeProcesses int `hcl:"procs,optional" toml:"procs,optional"`
|
SpeculativeProcesses int `hcl:"procs,optional" toml:"procs,optional"`
|
||||||
|
|
||||||
|
Enforce bool `hcl:"enforce,optional" toml:"enforce,optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func DefaultConfig() *Config {
|
func DefaultConfig() *Config {
|
||||||
|
|
@ -794,6 +796,7 @@ func DefaultConfig() *Config {
|
||||||
ParallelEVM: &ParallelEVMConfig{
|
ParallelEVM: &ParallelEVMConfig{
|
||||||
Enable: true,
|
Enable: true,
|
||||||
SpeculativeProcesses: 8,
|
SpeculativeProcesses: 8,
|
||||||
|
Enforce: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1199,6 +1202,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (*
|
||||||
|
|
||||||
n.ParallelEVM.Enable = c.ParallelEVM.Enable
|
n.ParallelEVM.Enable = c.ParallelEVM.Enable
|
||||||
n.ParallelEVM.SpeculativeProcesses = c.ParallelEVM.SpeculativeProcesses
|
n.ParallelEVM.SpeculativeProcesses = c.ParallelEVM.SpeculativeProcesses
|
||||||
|
n.ParallelEVM.Enforce = c.ParallelEVM.Enforce
|
||||||
n.RPCReturnDataLimit = c.RPCReturnDataLimit
|
n.RPCReturnDataLimit = c.RPCReturnDataLimit
|
||||||
|
|
||||||
if c.Ancient != "" {
|
if c.Ancient != "" {
|
||||||
|
|
|
||||||
|
|
@ -986,6 +986,13 @@ func (c *Command) Flags(config *Config) *flagset.Flagset {
|
||||||
Value: &c.cliConfig.ParallelEVM.SpeculativeProcesses,
|
Value: &c.cliConfig.ParallelEVM.SpeculativeProcesses,
|
||||||
Default: c.cliConfig.ParallelEVM.SpeculativeProcesses,
|
Default: c.cliConfig.ParallelEVM.SpeculativeProcesses,
|
||||||
})
|
})
|
||||||
|
f.BoolFlag(&flagset.BoolFlag{
|
||||||
|
Name: "parallelevm.enforce",
|
||||||
|
Usage: "Enforce block processing via Block STM",
|
||||||
|
Value: &c.cliConfig.ParallelEVM.Enforce,
|
||||||
|
Default: c.cliConfig.ParallelEVM.Enforce,
|
||||||
|
})
|
||||||
|
|
||||||
f.Uint64Flag(&flagset.Uint64Flag{
|
f.Uint64Flag(&flagset.Uint64Flag{
|
||||||
Name: "dev.gaslimit",
|
Name: "dev.gaslimit",
|
||||||
Usage: "Initial block gas limit",
|
Usage: "Initial block gas limit",
|
||||||
|
|
|
||||||
1
internal/cli/server/testdata/default.toml
vendored
1
internal/cli/server/testdata/default.toml
vendored
|
|
@ -185,6 +185,7 @@ devfakeauthor = false
|
||||||
[parallelevm]
|
[parallelevm]
|
||||||
enable = true
|
enable = true
|
||||||
procs = 8
|
procs = 8
|
||||||
|
enforce = false
|
||||||
|
|
||||||
[pprof]
|
[pprof]
|
||||||
pprof = false
|
pprof = false
|
||||||
|
|
|
||||||
|
|
@ -973,7 +973,7 @@ func BenchmarkBorMiningBlockSTMMetadata(b *testing.B) {
|
||||||
db2 := rawdb.NewMemoryDatabase()
|
db2 := rawdb.NewMemoryDatabase()
|
||||||
back.genesis.MustCommit(db2, triedb.NewDatabase(db2, triedb.HashDefaults))
|
back.genesis.MustCommit(db2, triedb.NewDatabase(db2, triedb.HashDefaults))
|
||||||
|
|
||||||
chain, _ := core.NewParallelBlockChain(db2, nil, back.genesis, nil, engine, vm.Config{}, nil, nil, nil, 8)
|
chain, _ := core.NewParallelBlockChain(db2, nil, back.genesis, nil, engine, vm.Config{}, nil, nil, nil, 8, false)
|
||||||
defer chain.Stop()
|
defer chain.Stop()
|
||||||
|
|
||||||
// Ignore empty commit here for less noise.
|
// Ignore empty commit here for less noise.
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,11 @@ gcmode = "archive"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -171,6 +171,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,11 @@ gcmode = "archive"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
# addr = "127.0.0.1"
|
# addr = "127.0.0.1"
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
# addr = "127.0.0.1"
|
# addr = "127.0.0.1"
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,11 @@ syncmode = "full"
|
||||||
# period = 0
|
# period = 0
|
||||||
# gaslimit = 11500000
|
# gaslimit = 11500000
|
||||||
|
|
||||||
|
# [parallelevm]
|
||||||
|
# enable = true
|
||||||
|
# procs = 8
|
||||||
|
# enforce = false
|
||||||
|
|
||||||
# [pprof]
|
# [pprof]
|
||||||
# pprof = false
|
# pprof = false
|
||||||
# port = 6060
|
# port = 6060
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue