Skip to content

Commit

Permalink
Merge pull request #159 from ethereum/host-guide
Browse files Browse the repository at this point in the history
docs: Host Implementation Guide
  • Loading branch information
chfast committed Oct 15, 2018
2 parents a43a93f + 765bafb commit 1933836
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
2 changes: 1 addition & 1 deletion circle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
command: |
sudo pip3 install --upgrade pip setuptools
sudo pip3 install codespell
codespell --skip=".git" --ignore-words=./.codespell-whitelist
codespell --quiet-level=4 --ignore-words=./.codespell-whitelist
build: &build
docker:
Expand Down
5 changes: 5 additions & 0 deletions docs/EVMC.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ On the Client-side it defines the interface for EVM implementations
to access Ethereum environment and state.


# Guides

- [Host Implementation Guide](@ref hostguide)


# Versioning {#versioning}

The EVMC project uses [Semantic Versioning](https://semver.org).
Expand Down
43 changes: 43 additions & 0 deletions docs/Host_Guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# EVMC Host Implementation Guide {#hostguide}

> How to bring EVMC support to Your Ethereum Client.
## Host interface

First of all, you have to implement the Host interface. The Host interface
allows VMs to query and modify Ethereum state during the execution.

The implementation can be done in object-oriented manner.
The ::evmc_host_interface lists the methods any Host must implement.

Moreover, each of the methods has a pointer to ::evmc_context
as a parameter. The context is owned entirely by the Host allowing a Host instance
to behave as an object with data.

## VM usage

When Host implementation is ready it's time to start using EVMC VMs.

1. Firstly, create a VM instance. You need to know what is the name of the "create"
function in particular VM implementation. The EVMC recommends to name the
function by the VM codename, e.g. ::evmc_create_examplevm().
Invoking the create function will give you the VM instance (::evmc_instance).
It is recommended to create the VM instance once.

2. If you are interested in loading VMs dynamically (i.e. to use DLLs)
check out the [EVMC Loader](@ref loader) library.

3. The ::evmc_instance contains information about the VM like
name (::evmc_instance::name) or ABI version (::evmc_instance::abi_version)
and methods.

4. To execute code in the VM use the "execute()" method (::evmc_instance::execute).
You will need:
- the code to execute,
- the message (::evmc_message) object that describes the execution context,
- the Host instance, passed as ::evmc_context pointer.

5. When execution finishes you will receive ::evmc_result object that describes
the results of the execution.

Have fun!

0 comments on commit 1933836

Please sign in to comment.