README
¶
Subnet EVM
Avalanche 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.
Subnet EVM is the Virtual Machine (VM) that defines the Subnet Contract Chains. Subnet EVM is a simplified version of Coreth VM (C-Chain).
This chain implements the Ethereum Virtual Machine and supports Solidity smart contracts as well as most other Ethereum client functionality.
Building
The Subnet EVM runs in a separate process from the main AvalancheGo process and communicates with it over a local gRPC connection.
AvalancheGo Compatibility
[v0.6.0] AvalancheGo@v1.11.0-v1.11.1 (Protocol Version: 33)
[v0.6.1] AvalancheGo@v1.11.0-v1.11.1 (Protocol Version: 33)
[v0.6.2] AvalancheGo@v1.11.2 (Protocol Version: 34)
[v0.6.3] AvalancheGo@v1.11.3-v1.11.9 (Protocol Version: 35)
[v0.6.4] AvalancheGo@v1.11.3-v1.11.9 (Protocol Version: 35)
[v0.6.5] AvalancheGo@v1.11.3-v1.11.9 (Protocol Version: 35)
[v0.6.6] AvalancheGo@v1.11.3-v1.11.9 (Protocol Version: 35)
[v0.6.7] AvalancheGo@v1.11.3-v1.11.9 (Protocol Version: 35)
[v0.6.8] AvalancheGo@v1.11.10 (Protocol Version: 36)
[v0.6.9] AvalancheGo@v1.11.11-v1.11.12 (Protocol Version: 37)
[v0.6.10] AvalancheGo@v1.11.11-v1.11.12 (Protocol Version: 37)
[v0.6.11] AvalancheGo@v1.11.11-v1.11.12 (Protocol Version: 37)
[v0.6.12] AvalancheGo@v1.11.13/v1.12.0-fuji (Protocol Version: 38)
API
The Subnet EVM supports the following API namespaces:
eth
personal
txpool
debug
Only the eth
namespace is enabled by default.
Subnet EVM is a simplified version of Coreth VM (C-Chain).
Full documentation for the C-Chain's API can be found here.
Compatibility
The Subnet EVM is compatible with almost all Ethereum tooling, including Remix, Metamask, and Foundry.
Differences Between Subnet EVM and Coreth
- Added configurable fees and gas limits in genesis
- Merged Avalanche hardforks into the single "Subnet 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 SubnetEVM 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.22.8 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 subnet-evm
repository into your $GOPATH
:
cd $GOPATH
mkdir -p src/github.com/ava-labs
cd src/github.com/ava-labs
git clone git@github.com:ava-labs/subnet-evm.git
cd subnet-evm
This will clone and checkout to master
branch.
Run Local Network
To run a local network, it is recommended to use the avalanche-cli to set up an instance of Subnet-EVM on a local Avalanche Network.
There are two options when using the Avalanche-CLI:
- Use an official Subnet-EVM release: https://docs.avax.network/subnets/build-first-subnet
- Build and deploy a locally built (and optionally modified) version of Subnet-EVM: https://docs.avax.network/subnets/create-custom-subnet
Directories
¶
Path | Synopsis |
---|---|
Package accounts implements high level Ethereum account management.
|
Package accounts implements high level Ethereum account management. |
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
(c) 2023, Ava Labs, Inc.
|
(c) 2023, Ava Labs, Inc. |
evm
evm executes EVM code snippets.
|
evm executes EVM code snippets. |
utils
Package utils contains internal helper functions for go-ethereum commands.
|
Package utils contains internal helper functions for go-ethereum commands. |
simulator
Module
|
|
Package consensus implements different Ethereum consensus engines.
|
Package consensus implements different Ethereum consensus engines. |
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. |
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. |
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. |
Package ethclient provides a client for the Ethereum RPC API.
|
Package ethclient provides a client for the Ethereum RPC API. |
subnetevmclient
Package subnetevmclient provides an RPC client for subnet-evm-specific APIs.
|
Package subnetevmclient provides an RPC client for subnet-evm-specific APIs. |
examples
|
|
Package ethereum defines interfaces for interacting with Ethereum.
|
Package ethereum defines interfaces for interacting with Ethereum. |
internal
|
|
Go port of Coda Hale's Metrics library
|
Go port of Coda Hale's Metrics library |
Package miner implements Ethereum block creation and mining.
|
Package miner implements Ethereum block creation and mining. |
evm/validators/state/interfaces
Package interfaces is a generated GoMock package.
|
Package interfaces is a generated GoMock package. |
precompile
|
|
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 |
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. |
runner
module
|
|
scripts
|
|
parser
Module
|
|
signer
|
|
sync
|
|
precompile/solidity
Implements solidity tests.
|
Implements solidity tests. |
Package trie implements Merkle Patricia Tries.
|
Package trie implements Merkle Patricia Tries. |
aggregator
Package aggregator is a generated GoMock package.
|
Package aggregator is a generated GoMock package. |
warptest
warptest exposes common functionality for testing the warp package.
|
warptest exposes common functionality for testing the warp package. |