Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/ci_zkevm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,30 @@ jobs:
run: sudo -E make test-e2e
working-directory: test

test-dencun-e2e:
strategy:
fail-fast: false
runs-on: ubuntu-latest
steps:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
- name: Make Foundry available to sudo
run: |
FOUNDRY_DIR=$(dirname $(which cast))
sudo ln -sf "$FOUNDRY_DIR/cast" /usr/local/bin/cast
sudo ln -sf "$FOUNDRY_DIR/forge" /usr/local/bin/forge
sudo ln -sf "$FOUNDRY_DIR/anvil" /usr/local/bin/anvil
sudo cast --version
- name: Checkout code
uses: actions/checkout@v3

- name: Build Docker
run: make build-docker

- name: Test
run: sudo -E make test-dencun-e2e
working-directory: test

test-e2e-prune:
strategy:
fail-fast: false
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ bridge-config-artifact
kurtosis-cli.tar.gz
zk/debug_tools/rpc-cache/cache.db
zk/debug_tools/rpc-cache/rpc-cache
zk/debug_tools/test-contracts/out
cmd/prune-mdbx-data/compact-db-tool
cmd/prune-mdbx-data/prune-chaindata-tool
cmd/prune-mdbx-data/list-tables-tool
cmd/prune-mdbx-data/prune-tool
cmd/prune-mdbx-data/prune-tool
2 changes: 2 additions & 0 deletions core/vm/interpreter_zkevm.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ func NewTracerZkConfig(config Config, counterCollector *CounterCollector) ZkConf
func getJumpTable(cr *chain.Rules) *JumpTable {
var jt *JumpTable
switch {
case cr.IsForkID13Dencun:
jt = &ForkId13DencunInstructionSet
case cr.IsForkID8Elderberry:
jt = &forkID8ElderberryInstructionSet
case cr.IsForkID5Dragonfruit, cr.IsForkID6IncaBerry, cr.IsForkID7Etrog:
Expand Down
13 changes: 13 additions & 0 deletions core/vm/jump_table_zkevm.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ var (
forkID4InstructionSet = newForkID4InstructionSet()
forkID5DragonfruitInstructionSet = newForkID5DragonfruitInstructionSet()
forkID8ElderberryInstructionSet = newForkID8InstructionSet()

ForkId13DencunInstructionSet = newForkID13DencunInstructionSet()
)

// newForkID4InstructionSet returns the instruction set for the forkID4
Expand Down Expand Up @@ -81,6 +83,17 @@ func newForkID8InstructionSet() JumpTable {
return instructionSet
}

func newForkID13DencunInstructionSet() JumpTable {
instructionSet := newForkID8InstructionSet()
// X Layer add the new instructions for the forkID13Dencun
enable1153(&instructionSet) // Transient storage opcodes
enable5656(&instructionSet) // MCOPY opcode
enable6780(&instructionSet) // SELFDESTRUCT only in same transaction

validateAndFillMaxStack(&instructionSet)
return instructionSet
}

func overrideJumpTableForLastOpcodeForkId12(jt *JumpTable) {
jt[BLOCKHASH].execute = opBlockhash_zkevm_lastOpCode
jt[CODESIZE].execute = opCodeSize_lastOpCode
Expand Down
10 changes: 10 additions & 0 deletions erigon-lib/chain/chain_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
// this needs to always be in descending order
// add new forkIds at the beginning of the array
var ForkIdsOrdered = []ForkId{
ForkId13Dencun,
ForkId13Durian,
ForkID12Banana,
ForkID11,
Expand Down Expand Up @@ -117,6 +118,7 @@ type Config struct {
ForkID11 *big.Int `json:"forkID11,omitempty"`
ForkID12BananaBlock *big.Int `json:"forkID12BananaBlock,omitempty"`
ForkId13Durian *big.Int `json:"forkID13Durian,omitempty"`
ForkId13Dencun *big.Int `json:"ForkId13Dencun,omitempty"`
NormalcyBlock *big.Int `json:"normalcyBlock,omitempty"`

AllowFreeTransactions bool `json:"allowFreeTransactions,omitempty"`
Expand Down Expand Up @@ -183,6 +185,8 @@ func (c *Config) SetForkIdBlock(forkIdNumber ForkId, blockNum uint64) error {
c.ForkID12BananaBlock = new(big.Int).SetUint64(blockNum)
case ForkId13Durian:
c.ForkId13Durian = new(big.Int).SetUint64(blockNum)
case ForkId13Dencun:
c.ForkId13Dencun = new(big.Int).SetUint64(blockNum)
default:
return fmt.Errorf("unknown fork id number %d", forkIdNumber)
}
Expand Down Expand Up @@ -387,6 +391,10 @@ func (c *Config) IsForkID13Durian(num uint64) bool {
return isForked(c.ForkId13Durian, num)
}

func (c *Config) IsForkID13Dencun(num uint64) bool {
return isForked(c.ForkId13Dencun, num)
}

// CheckCompatible checks whether scheduled fork transitions have been imported
// with a mismatching chain configuration.
func (c *Config) CheckCompatible(newcfg *Config, height uint64) *ConfigCompatError {
Expand Down Expand Up @@ -633,6 +641,7 @@ type Rules struct {
IsAura bool
IsNormalcy bool
IsForkID4, IsForkID5Dragonfruit, IsForkID6IncaBerry, IsForkID7Etrog, IsForkID8Elderberry, IsForkId10, IsForkId11, IsForkID12Banana, IsForkID13Durian bool
IsForkID13Dencun bool
}

// Rules ensures c's ChainID is not nil and returns a new Rules instance
Expand Down Expand Up @@ -669,6 +678,7 @@ func (c *Config) Rules(num uint64, time uint64) *Rules {
IsForkId11: c.IsForkID11(num),
IsForkID12Banana: c.IsForkID12Banana(num),
IsForkID13Durian: c.IsForkID13Durian(num),
IsForkID13Dencun: c.IsForkID13Dencun(num),
}
}

Expand Down
80 changes: 80 additions & 0 deletions erigon-lib/chain/hardfork_xlayer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package chain

import (
"fmt"

"github.com/ledgerwatch/log/v3"
)

// NetworkType represents different X Layer network environments
type NetworkType int

const (
UnknownNetwork NetworkType = iota
MainnetNetwork
TestnetNetwork
LocalNetwork
)

// XLayerForkConfig defines hard fork activation blocks for different networks
type XLayerForkConfig struct {
MainnetBlock uint64
TestnetBlock uint64
DevnetBlock uint64
}

// Fork configurations
var ForkId13DencunConfig = XLayerForkConfig{
MainnetBlock: 1000000000000, // TODO, need to be updated
TestnetBlock: 1000000000000, // TODO, need to be updated
DevnetBlock: 30,
}

// Fork configurations registry
var forkConfigs = map[ForkId]XLayerForkConfig{
ForkId13Dencun: ForkId13DencunConfig,
// Quickly add new fork configurations
}

// Network identification by zkevm address
var zkevmAddressNetworkMap = map[string]NetworkType{
"0x2B0ee28D4D51bC9aDde5E58E295873F61F4a0507": MainnetNetwork, // Mainnet
"0x7b1472be9a0115c3076b9f30e6bab91b13b3be6b": TestnetNetwork, // Testnet
"0xE45CCD0757670580a4a3600DE5cef1e45F0Ec2bd": LocalNetwork, // Local
}

// Global state
var currentNetwork NetworkType = UnknownNetwork

// InitializeNetworkByZkevmAddress sets the current network based on zkevm address
func InitializeNetworkByZkevmAddress(zkevmAddr string) {
if network, exists := zkevmAddressNetworkMap[zkevmAddr]; exists {
currentNetwork = network
} else {
currentNetwork = UnknownNetwork
}
log.Info(fmt.Sprintf("Current network: %v, zkevmAddr: %v", currentNetwork, zkevmAddr))
for key, _ := range forkConfigs {
block := GetForkBlock(key)
log.Info(fmt.Sprintf("Network: %v, zkevmAddr: %v, ForkId13Dencun:%v block: %v", currentNetwork, zkevmAddr, key, block))
}
}

// GetForkBlock returns the activation block for a given fork ID
func GetForkBlock(forkID ForkId) uint64 {
config, exists := forkConfigs[forkID]
if !exists {
return 0
}

switch currentNetwork {
case MainnetNetwork:
return config.MainnetBlock
case TestnetNetwork:
return config.TestnetBlock
case LocalNetwork:
return config.DevnetBlock
default:
return 0 // Unknown network
}
}
Loading
Loading