mirror of https://github.com/status-im/evmc.git
docs: VM Implementation Guide
This commit is contained in:
parent
d54035828a
commit
a7f93cf307
19
docs/EVMC.md
19
docs/EVMC.md
|
@ -2,13 +2,14 @@
|
||||||
|
|
||||||
The EVMC is the low-level ABI between Ethereum Virtual Machines (EVMs) and
|
The EVMC is the low-level ABI between Ethereum Virtual Machines (EVMs) and
|
||||||
Ethereum Clients. On the EVM-side it supports classic EVM1 and [eWASM].
|
Ethereum Clients. On the EVM-side it supports classic EVM1 and [eWASM].
|
||||||
On the Client-side it defines the interface for EVM implementations
|
On the Client-side it defines the interface for EVM implementations
|
||||||
to access Ethereum environment and state.
|
to access Ethereum environment and state.
|
||||||
|
|
||||||
|
|
||||||
# Guides
|
# Guides
|
||||||
|
|
||||||
- [Host Implementation Guide](@ref hostguide)
|
- [Host Implementation Guide](@ref hostguide)
|
||||||
|
- [VM Implementation Guide](@ref vmguide)
|
||||||
|
|
||||||
|
|
||||||
# Versioning {#versioning}
|
# Versioning {#versioning}
|
||||||
|
@ -22,13 +23,13 @@ can be referenced as EVMC ABIv3 or just EVMC 3.
|
||||||
|
|
||||||
# Modules
|
# Modules
|
||||||
|
|
||||||
- [EVMC](@ref EVMC)
|
- [EVMC](@ref EVMC)
|
||||||
– the main component that defines API for VMs and Clients (Hosts).
|
– the main component that defines API for VMs and Clients (Hosts).
|
||||||
- [EVMC Loader](@ref loader)
|
- [EVMC Loader](@ref loader)
|
||||||
– the library for loading VMs implemented as Dynamically Loaded Libraries (DLLs, shared objects).
|
– the library for loading VMs implemented as Dynamically Loaded Libraries (DLLs, shared objects).
|
||||||
- [EVMC Helpers](@ref helpers)
|
- [EVMC Helpers](@ref helpers)
|
||||||
– a collection of utility functions for easier integration with EVMC.
|
– a collection of utility functions for easier integration with EVMC.
|
||||||
- [EVM Instructions](@ref instructions)
|
- [EVM Instructions](@ref instructions)
|
||||||
– the library with collection of metrics for EVM1 instruction set.
|
– the library with collection of metrics for EVM1 instruction set.
|
||||||
- [EVMC VM Tester](@ref vmtester)
|
- [EVMC VM Tester](@ref vmtester)
|
||||||
– the EVMC-compatibility testing tool for VM implementations.
|
– the EVMC-compatibility testing tool for VM implementations.
|
||||||
|
@ -42,10 +43,10 @@ can be referenced as EVMC ABIv3 or just EVMC 3.
|
||||||
## Terms
|
## Terms
|
||||||
|
|
||||||
1. **VM** – An Ethereum Virtual Machine instance/implementation.
|
1. **VM** – An Ethereum Virtual Machine instance/implementation.
|
||||||
2. **Host** – An entity controlling the VM.
|
2. **Host** – An entity controlling the VM.
|
||||||
The Host requests code execution and responses to VM queries by callback
|
The Host requests code execution and responses to VM queries by callback
|
||||||
functions. This usually represents an Ethereum Client.
|
functions. This usually represents an Ethereum Client.
|
||||||
|
|
||||||
|
|
||||||
## Responsibilities
|
## Responsibilities
|
||||||
|
|
||||||
|
@ -56,8 +57,8 @@ can be referenced as EVMC ABIv3 or just EVMC 3.
|
||||||
counter.
|
counter.
|
||||||
- Controls the call depth, including the exceptional termination of execution
|
- Controls the call depth, including the exceptional termination of execution
|
||||||
in case the maximum depth is reached.
|
in case the maximum depth is reached.
|
||||||
|
|
||||||
|
|
||||||
### Host
|
### Host
|
||||||
|
|
||||||
- Provides access to State.
|
- Provides access to State.
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
# EVMC VM Implementation Guide {#vmguide}
|
||||||
|
|
||||||
|
> How to add EVMC interface to Your Ethereum VM implementation.
|
||||||
|
|
||||||
|
## An example
|
||||||
|
|
||||||
|
You can start with [the example implementation of EVMC VM interface in C](@ref example_vm.c).
|
||||||
|
|
||||||
|
## VM instance
|
||||||
|
|
||||||
|
The VM instance is described by the ::evmc_instance struct. It contains the
|
||||||
|
basic static information about the VM like name and version. The struct also
|
||||||
|
includes the VM methods (in form of function pointers) to allow the Host
|
||||||
|
to interact with the VM.
|
||||||
|
|
||||||
|
Some methods are optional. The VM must implement at least all mandatory ones.
|
||||||
|
|
||||||
|
The instance struct must also include the EVMC ABI version (::EVMC_ABI_VERSION)
|
||||||
|
it was build with. This allows the Host to check the ABI compatibility when
|
||||||
|
loading VMs dynamically.
|
||||||
|
|
||||||
|
The VM instance is created and returned as a pointer from a special "create"
|
||||||
|
function. The EVMC recommends to name the function by the VM codename,
|
||||||
|
e.g. ::evmc_create_example_vm().
|
||||||
|
|
||||||
|
## VM methods implementation
|
||||||
|
|
||||||
|
Each VM methods takes the pointer to the ::evmc_instance as the first argument.
|
||||||
|
The VM implementation can extend the ::evmc_instance struct for storing internal
|
||||||
|
data. This allow implementing the VM in object-oriented manner.
|
||||||
|
|
||||||
|
The most important method is ::evmc_instance::execute() because it executes EVM code.
|
||||||
|
Remember that the Host is allowed to invoke the execute method concurrently
|
||||||
|
so do not store data related to a particular execution context in the VM instance.
|
||||||
|
|
||||||
|
## Resource management
|
||||||
|
|
||||||
|
All additional resources allocated when the VM instance is created must be
|
||||||
|
freed when the destroy method is invoked.
|
||||||
|
|
||||||
|
The VM implementation can also attach additional resources to the ::evmc_result
|
||||||
|
of an execution. These resource must be freed when the ::evmc_result::release()
|
||||||
|
method is invoked.
|
||||||
|
|
||||||
|
|
||||||
|
*Have fun!*
|
Loading…
Reference in New Issue