evm

package module
v2.0.0-alpha.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2025 License: GPL-3.0, LGPL-3.0 Imports: 0 Imported by: 0

README

Lux EVM

Go Reference Go Report Card CodeQL

Overview

The Lux EVM is a high-performance Ethereum Virtual Machine implementation optimized for the Lux Network. It provides full Ethereum compatibility while leveraging Lux's advanced consensus and networking capabilities.

Lux is a network composed of multiple blockchains. Each blockchain is an instance of a Virtual Machine (VM), much like an object in an object-oriented language is an instance of a class. That is, the VM defines the behavior of the blockchain.

EVM is the Virtual Machine (VM) that defines the EVM Contract Chains. Lux EVM is a customizable version of Lux Ethereum VM (C-Chain).

This chain implements the Ethereum Virtual Machine and supports Solidity smart contracts as well as most other Ethereum client functionality.

Key Features
  • ⚡ High Performance: Sub-second finality with high throughput
  • 🔄 Full EVM Compatibility: Deploy existing Ethereum dApps without modification
  • 🏗️ Customizable: Configure gas limits, fees, and network parameters
  • 🔐 Secure: Built on Avalanche consensus for maximum security
  • 📊 Efficient: Optimized state management and storage

Building

The EVM runs in a separate process from the main Lux process and communicates with it over a local gRPC connection.

Lux Compatibility
[v0.1.0] Lux@v1.7.0-v1.7.4 (Protocol Version: 9)
[v0.1.1-v0.1.2] Lux@v1.7.5-v1.7.6 (Protocol Version: 10)
[v0.2.0] Lux@v1.7.7-v1.7.9 (Protocol Version: 11)
[v0.2.1] Lux@v1.7.10 (Protocol Version: 12)
[v0.2.2] Lux@v1.7.11-v1.7.12 (Protocol Version: 14)
[v0.2.3] Lux@v1.7.13-v1.7.16 (Protocol Version: 15)
[v0.2.4] Lux@v1.7.13-v1.7.16 (Protocol Version: 15)
[v0.2.5] Lux@v1.7.13-v1.7.16 (Protocol Version: 15)
[v0.2.6] Lux@v1.7.13-v1.7.16 (Protocol Version: 15)
[v0.2.7] Lux@v1.7.13-v1.7.16 (Protocol Version: 15)
[v0.2.8] Lux@v1.7.13-v1.7.18 (Protocol Version: 15)
[v0.2.9] Lux@v1.7.13-v1.7.18 (Protocol Version: 15)
[v0.3.0] Lux@v1.8.0-v1.8.6 (Protocol Version: 16)
[v0.4.0] Lux@v1.9.0 (Protocol Version: 17)
[v0.4.1] Lux@v1.9.1 (Protocol Version: 18)
[v0.4.2] Lux@v1.9.1 (Protocol Version: 18)
[v0.4.3] Lux@v1.9.2-v1.9.3 (Protocol Version: 19)
[v0.4.4] Lux@v1.9.2-v1.9.3 (Protocol Version: 19)
[v0.4.5] Lux@v1.9.4 (Protocol Version: 20)
[v0.4.6] Lux@v1.9.4 (Protocol Version: 20)
[v0.4.7] Lux@v1.9.5 (Protocol Version: 21)
[v0.4.8] Lux@v1.9.6-v1.9.8 (Protocol Version: 22)
[v0.4.9] Lux@v1.9.9 (Protocol Version: 23)
[v0.4.10] Lux@v1.9.9 (Protocol Version: 23)
[v0.4.11] Lux@v1.9.10-v1.9.16 (Protocol Version: 24)
[v0.4.12] Lux@v1.9.10-v1.9.16 (Protocol Version: 24)
[v0.5.0] Lux@v1.10.0 (Protocol Version: 25)
[v0.5.1] Lux@v1.10.1-v1.10.4 (Protocol Version: 26)
[v0.5.2] Lux@v1.10.1-v1.10.4 (Protocol Version: 26)
[v0.5.3] Lux@v1.10.5-v1.10.8 (Protocol Version: 27)
[v0.5.4] Lux@v1.10.9-v1.10.12 (Protocol Version: 28)
[v0.5.5] Lux@v1.10.9-v1.10.12 (Protocol Version: 28)
[v0.5.6] Lux@v1.10.9-v1.10.12 (Protocol Version: 28)
[v0.5.7] Lux@v1.10.13-v1.10.14 (Protocol Version: 29)
[v0.5.8] Lux@v1.10.13-v1.10.14 (Protocol Version: 29)
[v0.5.9] Lux@v1.10.15-v1.10.17 (Protocol Version: 30)
[v0.5.10] Lux@v1.10.15-v1.10.17 (Protocol Version: 30)

API

The Lux EVM supports the following API namespaces:

  • eth
  • personal
  • txpool
  • debug

Only the eth namespace is enabled by default. Lux EVM is a simplified version of Geth VM (C-Chain). Full documentation for the C-Chain's API can be found here.

Compatibility

The Lux EVM is compatible with almost all Ethereum tooling, including Remix, Metamask, and Foundry.

Differences Between Lux EVM and Lux Geth

  • Added configurable fees and gas limits in genesis
  • Merged Lux hardforks into the single "Lux EVM" hardfork
  • Removed Atomic Txs and Shared Memory
  • Removed Multicoin Contract and State

Block Format

To support these changes, there have been a number of changes to the EVM block format compared to what exists on the C-Chain and Ethereum. Here we list the changes to the block format as compared to Ethereum.

Block Header
  • BaseFee: Added by EIP-1559 to represent the base fee of the block (present in Ethereum as of EIP-1559)
  • BlockGasCost: surcharge for producing a block faster than the target rate

Create an EVM Subnet on a Local Network

Clone Subnet-evm

First install Go 1.23.9 or later. Follow the instructions here. You can verify by running go version.

Set $GOPATH environment variable properly for Go to look for Go Workspaces. Please read this for details. You can verify by running echo $GOPATH.

As a few software will be installed into $GOPATH/bin, please make sure that $GOPATH/bin is in your $PATH, otherwise, you may get error running the commands below.

Download the evm repository into your $GOPATH:

cd $GOPATH
mkdir -p src/github.com/luxfi
cd src/github.com/luxfi
git clone git@github.com:luxdefi/evm.git
cd evm

This will clone and checkout to master branch.

Run Local Network

To run a local network, it is recommended to use the lux-cli to set up an instance of EVM on a local Lux Network.

There are two options when using the Lux-CLI:

  1. Use an official EVM release: https://docs.lux.network/subnets/build-first-subnet
  2. Build and deploy a locally built (and optionally modified) version of EVM: https://docs.lux.network/subnets/create-custom-subnet

Configuration

Genesis Configuration

Configure your EVM instance through the genesis file:

{
  "config": {
    "chainId": 7777,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "muirGlacierBlock": 0,
    "subnetEVMTimestamp": 0,
    "feeConfig": {
      "gasLimit": 15000000,
      "targetBlockRate": 2,
      "minBaseFee": 25000000000,
      "targetGas": 15000000,
      "baseFeeChangeDenominator": 36,
      "minBlockGasCost": 0,
      "maxBlockGasCost": 1000000,
      "blockGasCostStep": 200000
    }
  }
}
Network Upgrades (v2.0.0+)

Starting with version 2.0.0, all network upgrades are active from genesis. For adding future upgrades, see NETWORK_UPGRADES.md.

Development

Testing
# Run all tests
go test ./...

# Run tests with coverage
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

# Run specific package tests
go test ./core/...
go test ./eth/...
Benchmarking
# Run benchmarks
go test -bench=. ./core/vm/...
go test -bench=. ./core/state/...
Debugging

Enable debug APIs in your configuration:

{
  "eth-apis": ["eth", "debug", "net", "web3"]
}

Performance Tuning

Database Backend

The EVM uses BadgerDB by default for optimal performance:

{
  "database-type": "badgerdb",
  "database-cache-size": 2048
}
State Management

Configure state pruning for efficient storage:

{
  "pruning-enabled": true,
  "pruning-blocks-to-keep": 1000,
  "pruning-interval": 3600
}

Security

  • Always run nodes with appropriate firewall rules
  • Use secure RPC endpoints with authentication
  • Keep your node software up to date
  • Monitor for security advisories

Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Resources

License

This project is licensed under the BSD 3-Clause License. See the LICENSE file for details.

Documentation

Overview

Package evm implements the Ethereum Virtual Machine for the Lux network.

Directories

Path Synopsis
accounts
abi
Package abi implements the Ethereum ABI (Application Binary Interface).
Package abi implements the Ethereum ABI (Application Binary Interface).
abi/bind
Package bind generates Ethereum contract Go bindings.
Package bind generates Ethereum contract Go bindings.
abi/bind/precompilebind
Package bind generates Ethereum contract Go bindings.
Package bind generates Ethereum contract Go bindings.
keystore
Package keystore implements encrypted storage of secp256k1 private keys.
Package keystore implements encrypted storage of secp256k1 private keys.
cmd
abigen command
(c) 2023, Lux Industries, Inc.
(c) 2023, Lux Industries, Inc.
dbmigrate command
precompilegen command
simulator/main command
utils
Package utils contains internal helper functions for go-ethereum commands.
Package utils contains internal helper functions for go-ethereum commands.
common
forks
Package forks provides a centralized registry for network upgrades and forks.
Package forks provides a centralized registry for network upgrades and forks.
validators
Package validators is a generated GoMock package.
Package validators is a generated GoMock package.
Package core implements the Ethereum consensus protocol.
Package core implements the Ethereum consensus protocol.
bloombits
Package bloombits implements bloom filtering on batches of data.
Package bloombits implements bloom filtering on batches of data.
extstate/testhelpers
(c) 2023, Lux Industries, Inc.
(c) 2023, Lux Industries, Inc.
rawdb
Package rawdb contains a collection of low level database accessors.
Package rawdb contains a collection of low level database accessors.
state
Package state provides a caching layer atop the Ethereum state trie.
Package state provides a caching layer atop the Ethereum state trie.
state/snapshot
Package snapshot implements a journalled, dynamic state dump.
Package snapshot implements a journalled, dynamic state dump.
txpool/blobpool
Package blobpool implements the EIP-4844 blob transaction pool.
Package blobpool implements the EIP-4844 blob transaction pool.
txpool/legacypool
Package legacypool implements the normal EVM execution transaction pool.
Package legacypool implements the normal EVM execution transaction pool.
types
Package types contains data types related to Ethereum consensus.
Package types contains data types related to Ethereum consensus.
vm
Package vm implements the Ethereum Virtual Machine.
Package vm implements the Ethereum Virtual Machine.
vm/runtime
Package runtime provides a basic execution model for executing EVM code.
Package runtime provides a basic execution model for executing EVM code.
eth
Package eth implements the Ethereum protocol.
Package eth implements the Ethereum protocol.
filters
Package filters implements an ethereum filtering system for block, transactions and log events.
Package filters implements an ethereum filtering system for block, transactions and log events.
tracers
Package tracers is a manager for transaction tracing engines.
Package tracers is a manager for transaction tracing engines.
tracers/internal/tracetest
(c) 2023, Lux Industries, Inc.
(c) 2023, Lux Industries, Inc.
tracers/js/internal/tracers
Package tracers contains the actual JavaScript tracer assets.
Package tracers contains the actual JavaScript tracer assets.
Package ethclient provides a client for the Ethereum RPC API.
Package ethclient provides a client for the Ethereum RPC API.
corethclient
Package gethclient provides an RPC client for geth-specific APIs.
Package gethclient provides an RPC client for geth-specific APIs.
subnetevmclient
Package subnetevmclient provides an RPC client for evm-specific APIs.
Package subnetevmclient provides an RPC client for evm-specific APIs.
ethdb
memorydb
Package memorydb implements an in-memory key-value database.
Package memorydb implements an in-memory key-value database.
Package ids provides common identifier types used throughout the EVM codebase.
Package ids provides common identifier types used throughout the EVM codebase.
Package iface provides neutral interfaces to break import cycles.
Package iface provides neutral interfaces to break import cycles.
internal
debug
Package debug interfaces Go runtime debugging facilities.
Package debug interfaces Go runtime debugging facilities.
ethapi
Package ethapi implements the general Ethereum API functions.
Package ethapi implements the general Ethereum API functions.
reexec
This file originates from Docker/Moby, https://github.com/moby/moby/blob/master/pkg/reexec/reexec.go Licensed under Apache License 2.0: https://github.com/moby/moby/blob/master/LICENSE Copyright 2013-2018 Docker, Inc.
This file originates from Docker/Moby, https://github.com/moby/moby/blob/master/pkg/reexec/reexec.go Licensed under Apache License 2.0: https://github.com/moby/moby/blob/master/LICENSE Copyright 2013-2018 Docker, Inc.
stub
Package stub provides minimal node-level interfaces when building the EVM library.
Package stub provides minimal node-level interfaces when building the EVM library.
version
Package version implements reading of build version information.
Package version implements reading of build version information.
Package log provides a compatibility layer for go-ethereum style logging that redirects to luxfi/log
Package log provides a compatibility layer for go-ethereum style logging that redirects to luxfi/log
metrics
prometheus
(c) 2025 Lux Industries, Inc.
(c) 2025 Lux Industries, Inc.
Package miner implements Ethereum block creation and mining.
Package miner implements Ethereum block creation and mining.
evm
evm/blockgascost
blockgascost implements the block gas cost logic
blockgascost implements the block gas cost logic
evm/customlogs
(c) 2025, Lux Industries, Inc.
(c) 2025, Lux Industries, Inc.
evm/validators
manager is a no-op stub that allows the EVM library to compile without node-level dependencies.
manager is a no-op stub that allows the EVM library to compile without node-level dependencies.
contract
Defines the interface for the configuration and execution of a precompile contract
Defines the interface for the configuration and execution of a precompile contract
modules
Package modules provides backward compatibility aliases for the registry package.
Package modules provides backward compatibility aliases for the registry package.
precompileconfig
Defines the stateless interface for unmarshalling an arbitrary config of a precompile
Defines the stateless interface for unmarshalling an arbitrary config of a precompile
registry
Module to facilitate the registration of precompiles and their configuration.
Module to facilitate the registration of precompiles and their configuration.
Package rpc implements bi-directional JSON-RPC 2.0 on multiple transports.
Package rpc implements bi-directional JSON-RPC 2.0 on multiple transports.
signer
precompile/solidity
Implements solidity tests.
Implements solidity tests.
Package trie implements Merkle Patricia Tries.
Package trie implements Merkle Patricia Tries.
triedb
upgrade
ap0
AP0 defines constants used during the initial network launch.
AP0 defines constants used during the initial network launch.
ap1
AP1 defines constants used after the Apricot Phase 1 upgrade.
AP1 defines constants used after the Apricot Phase 1 upgrade.
ap3
AP3 defines the dynamic fee window used after the Apricot Phase 3 upgrade.
AP3 defines the dynamic fee window used after the Apricot Phase 3 upgrade.
ap4
AP4 implements the block gas cost logic activated by the Apricot Phase 4 upgrade.
AP4 implements the block gas cost logic activated by the Apricot Phase 4 upgrade.
ap5
AP5 defines constants used after the Apricot Phase 5 upgrade.
AP5 defines constants used after the Apricot Phase 5 upgrade.
etna
Etna defines constants used after the Etna upgrade.
Etna defines constants used after the Etna upgrade.
lp176
LP176 implements the fee logic specified here: https://github.com/luxfi/LPs/blob/main/LPs/176-dynamic-evm-gas-limit-and-price-discovery-updates/README.md
LP176 implements the fee logic specified here: https://github.com/luxfi/LPs/blob/main/LPs/176-dynamic-evm-gas-limit-and-price-discovery-updates/README.md
subnetevm
subnetevm defines the dynamic fee window used after subnetevm upgrade.
subnetevm defines the dynamic fee window used after subnetevm upgrade.
set
x

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL