• Stars
    star
    193
  • Rank 201,081 (Top 4 %)
  • Language
    C++
  • License
    Other
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Low-Latency, High Performance and Extensible WebAssembly Backend Library

EOS VM - A Low-Latency, High Performance and Extensible WebAssembly Engine

  • Extremely Fast Execution
  • Extremely Fast Parsing/Loading
  • Efficient Time Bound Execution
  • Deterministic Execution (Soft Float & Hardware Floating Point options)
  • Standards Compliant
  • Designed for Parallel Execution
  • C++ / Header Only
  • Simple API for integrating Native Calls

Motivation

EOS VM is designed from the ground up for the high demands of blockchain applications which require far more from a WebAssembly engine than those designed for web browsers or standards development. In the world of blockchain, any non-deterministic behavior, unbounded computation, or unbounded use of RAM can take down the blockchain for everyone, not just a single user's web browser. Single threaded performance, fast compilation/validation of Wasm, and low-overhead calls to native code are critical to blockchains.

While EOS VM was designed for blockchain, we believe it is ideally suited for any application looking to embed a High Performance WebAssembly engine.

We designed EOS VM to meet the needs of EOSIO blockchains after using three of the most common WebAssembly engines: Binaryen, WABT, and WAVM. These WebAssembly engines were the single largest source of security issues impacting EOSIO blockchains. While WAVM provides extremely fast execution, it is not suited to running a live blockchain because it has extremely long and unpredictable compilation times and the need to recompile all contracts every time the process restarts. WABT was designed as a toolkit for manipulating WebAssembly first and as an execution engine second.

We considered the WebAssembly engines used by the largest browsers, but they all come with considerable overhead and assumptions which are inappropriate for a reusable library or to be embedded in a blockchain. It is our hope that one day major browsers will opt to switch to EOS VM.

All of the existing libraries incorporate a large code base designed and implemented by engineers not trained in the rigor of blockchain development. This makes the code difficult to audit and keeping up with upstream changes / security breaches difficult.

With WebAssembly (Wasm) becoming ever more ubiquitous, there is a greater need for a succinct implementation of a Wasm backend. We implemented EOS VM because all existing backends we evaluated fell short in meeting our needs for a Wasm backend best suited for use in a public blockchain environment.

Deterministic Execution

Given that all programs on the blockchain must be deterministic, floating point operations are of particular interest to us. Because of the non-deterministic nature of rounding modes, NaNs and denormals, special care has to be made to ensure a deterministic environment on all supported platforms. This comes in the form of "softfloat", a software implementation of IEEE-754 float point arithmetic, which is constrained further to ensure determinism. If this determinism is not required, hardware based floating point operations are still available through a compile time define.

Any secondary limits/constraints (i.e. stack size, call depth, etc.) can cause consensus failures if these restrictions do not match any previous backend that was in place, EOS VM has all of these constraints user definable through either a compile-time system or run-time based on the use case and data type involved.

Time Bounded Execution

The ability to ensure that execution doesn't over run the CPU time that is allotted for a given program is a central component of a resource limited blockchain. This is satisfied by the watchdog timer system (as mentioned below, this mechanism is also useful for general security). EOS VM's implementation is both fast and efficient compared to prior solutions.

Two mechanisms are available to the user to bound the execution of Wasm:

  1. A simple instruction counter based bounding, this incurs a performance penalty, but doesn't require multi-threading.
  2. A watchdog timer solution that incurs no noticeable overhead during Wasm execution.

Secure by Design

WebAssembly was designed to run untrusted code in a browser environment where the worst that can happen is a hung browser. Existing libraries such as WABT, WAVM, and Binaryen were designed with assumptions which can lead to unbounded memory allocation, extremely long load times, and stack overflows from recursive descent parsing or execution.

The fundamental data types that make up EOS VM are built with certain invariants from the onset. This means that explicit checks and validations, which can be error-prone because of programmer forgetfulness, are not needed as the data types themselves maintain these invariants and kill the execution if violated.

In addition to these core data types, some of the special purpose allocators utilize the security of the CPU and core OS to satisfy that memory is properly sandboxed (a guard paging mechanism).

Because of the utilization of guard paging for the memory operations, host function calls that execute natively don't have to explicitly validate pointers that are passed into these functions if access outside of the sandboxed memory occurs, please note special care should be made to ensure that the host function can fail hard, i.e. not call destructors and have no negative impact.

At no point during parsing or evaluation does EOS-VM use unbounded recursion or loops, everything is tightly bound to limit or eliminate the ability for a bad or corrupt Wasm to cause a crash or infinitely hang the machine.

All of these solutions are transparent to the developer and allow for more succinct functions that are not cluttered with external checks and only the core logic is needed in most places.

High-Performance Execution

Host functions are callable through a thin layer that doesn't incur heavy performance penalties.

Because of the utilization of native paging mechanisms, almost all memory operations are very close to native if not at parity with native memory operations.

Because of the high compaction and linear nature of the builtin allocators, this allows for a very cache friendly environment and further allows for high performance execution.

Certain design decisions were made to maximize the performance of interpreter implementation. As mentioned above, EOS VM has custom allocators and memory management that fits the needs and use cases for different access patterns and allocation requirements. These allocators are used to back the core data types (fast vector, Wasm stack, fast variant, Wasm module), and as such do not "own" the memory that they use for their operations. These non-owning data structures allow for the ability to use the memory cleanly and not have to concern the data type with destructing when going out of scope, which can increase the performance for certain areas of EOS VM without loss of generality for the developer. Since the data is held by these allocators and have lifetimes that match that of a Wasm module, no copies of these heavyweight data types are ever needed. Once an element in an EOS VM is constructed, that is its home and final resting place for the lifetime of the Wasm module.

A fast variant or discriminating union type is the fundamental data type that represents a Wasm opcode or a Wasm stack element. This allows for a clean interface to "visit" each Wasm opcode without any loss of performance. This visiting is statically derivable and not dynamically dispatched like more classical approaches that use the object-oriented visitor pattern. In addition to a visit function that acts similar to std::visit, a custom dispatcher is defined that allows for a similar interface but with EOS VM specific optimizations and assumptions.

Effortless Integration

With the exception of the softfloat library, which is an external dependency, EOS VM is a header only implementation.

Given the needs of the end user, integration can be as simple as pointing to the include directory.

EOS-VM utilizes CMake which allows integration into a project to be as little as adding eos-vm to the list of targets in the target_link_libraries.

If the need is only single-threaded a self-contained backend type is defined for the user to encapsulate all the components needed, which allows for source code integration to be constructing an instance of that type and adding "host functions" to the registered_host_functions. Registering the host functions is as easy as calling a function with the function/member pointer and supplying the Wasm module name and function name.

If multi-threaded execution is needed (i.e. multiple backends running at once), then the above integration is needed and the user will have to also construct thread specific watchdog timers and linear memory allocators. These are also designed to be effortlessly registered to a particular Wasm backend.

Highly Extensible Design

Given the EOS-VM variant type and visitor system, new backends with custom logic can be easily defined and allows the same level of flexibility and code reuse as a much more heavyweight OOP Visitor or Listener design.

Since the design of EOS-VM is component based, with each component being very self-contained, new backends or tools for Wasm can be crafted from previously defined components while only needing to define the logic for the extended functionality that is needed, with very little, to no, boilerplate needed.

Extensions to Wasm itself can be made by simply defining the new section (aka C++ class field) for the module and the function needed to parse an element of that section. This will allow for tooling to be constructed at a rapid pace for custom Wasms for a multitude of needs (debugging, profiling, etc.).

Using EOS-VM

Quick Overview

Contributing

Contributing Guide

Code of Conduct

Important

See LICENSE for copyright and license terms.

All repositories and other materials are provided subject to the terms of this IMPORTANT notice and you must familiarize yourself with its terms. The notice contains important information, limitations and restrictions relating to our software, publications, trademarks, third-party resources, and forward-looking statements. By accessing any of our repositories and other materials, you accept and agree to the terms of the notice.

More Repositories

1

eos

An open source smart contract platform
C++
11,274
star
2

Documentation

EOSIO Documents
2,084
star
3

eosjs

General purpose library for the EOSIO blockchain.
TypeScript
1,436
star
4

eosio.cdt

EOSIO.CDT (Contract Development Toolkit) is a suite of tools used to build EOSIO contracts
C++
511
star
5

eosio.contracts

Smart contracts that provide some of the basic functions of the EOSIO blockchain
C++
323
star
6

demux-js

💫 Deterministic event-sourced state and side effect handling for blockchain applications
TypeScript
306
star
7

eosjs-ecc

Elliptic curve cryptography functions: Private Key, Public Key, Signature, AES, Encryption, Decryption
JavaScript
283
star
8

eos-token-distribution

Shell
196
star
9

eosjs-api

Application programming interface to EOS blockchain nodes.
JavaScript
178
star
10

eosio-card-game-repo

The Elemental Battles Tutorial is divided into easy to follow lessons that take you through the process of creating your own fully-functional blockchain-based dApp.
158
star
11

eosio-web-ide

eosio-web-ide
TypeScript
151
star
12

eosio-project-boilerplate-simple

This repository demonstrates the eosio platform running a blockchain as a local single node test net with a simple DApp, NoteChain.
Shell
141
star
13

universal-authenticator-library

A library for allowing apps to easily use different auth providers.
TypeScript
127
star
14

eosio-java

EOSIO SDK for Java - API for integrating with EOSIO-based blockchains
Java
125
star
15

eosio-explorer

An application providing Web GUI to communicate with EOSIO blockchain in a local development environment.
JavaScript
115
star
16

eosio-project-demux-example

Simple Blog DApp built with Demux and React for the EOSIO Blockchain
JavaScript
89
star
17

eosjs-keygen

Javascript keys generator for EOS
JavaScript
72
star
18

history-tools

EOSIO History Tools
C++
65
star
19

eosio-reference-ios-authenticator-app

iOS reference app demonstrating inter-application transaction signing for EOSIO blockchain apps
Swift
65
star
20

eosio-swift

EOSIO SDK for Swift - API for integrating with EOSIO-based blockchains
C
61
star
21

patroneos

RPC Checkpoint for EOS nodes
Go
47
star
22

ricardian-template-toolkit

Renderer for the Ricardian Contract specification
TypeScript
41
star
23

spec-repo

EOSIO Specifications Repository
40
star
24

demux-js-eos

Demux-js Action Reader implementations for EOSIO blockchains
TypeScript
38
star
25

fc

C++
38
star
26

eosio-webauthn-example-app

Example web app demonstrating EOSIO signing via WebAuthn
TypeScript
38
star
27

welcome

Documentation that covers EOSIO Overview, Getting Started and Protocol documents
C++
38
star
28

abieos

Binary <> JSON conversion using ABIs. Compatible with languages which can interface to C
C++
34
star
29

eosio-java-android-example-app

Application demonstrating integration with EOSIO-based blockchains using EOSIO SDK for Java
Java
32
star
30

eosio-swift-ios-example-app

Application demonstrating integration with EOSIO-based blockchains using EOSIO SDK for Swift
Swift
30
star
31

eosjs-json

Information about the EOS blockchain in the JSON file format.
JavaScript
28
star
32

eosio-reference-chrome-extension-authenticator-app

Chrome extension reference app demonstrating how users could sign transactions using various EOSIO Labs tools
TypeScript
25
star
33

ual-token-pocket

authenticator meant to be used with Token Pocket and the Universal Authenticator Library
TypeScript
24
star
34

ricardian-spec

Specification defining valid Ricardian contracts
23
star
35

ual-reactjs-renderer

This library provides a React renderer around the Universal Authenticator Library
JavaScript
23
star
36

tropical-example-web-app

An example for developers showing an application built on EOSIO combining UAL, Manifest Spec, and Ricardian Contracts
JavaScript
22
star
37

eosio.exchange

C++
21
star
38

eosjs-secp256k1

Compiles c++ secp256k1 pedersen commitments, borromean ring signatures, and ZK range proofs into JavaScript.
JavaScript
17
star
39

hackathon-howto-guide

Getting started guide for EOS Global Hackathon series
16
star
40

musl

Mirror of git://git.musl-libc.org/musl
C
14
star
41

eosio-toppings

A monorepo with tools working on top of nodeos
TSQL
14
star
42

ual-scatter

authenticator meant to be used with Scatter and Universal Authenticator Library
TypeScript
14
star
43

ual-authenticator-walkthrough

tutorial walking through the steps required to create a new authenticator for the Universal Authenticator Library
JavaScript
13
star
44

EEPs

EOSIO Enhancement Proposals
13
star
45

eosio-swift-vault

Utility library for managing keys and signing with Apple's Keychain and Secure Enclave
Swift
12
star
46

eosio.assert

A security feature to reduce the need for users to trust blockchain apps when a user signs a transaction for a trusted blockchain network with a trusted wallet application
C++
12
star
47

eosio-java-softkey-signature-provider

Example pluggable signature provider for EOSIO SDK for Java for signing transactions using in-memory keys
Java
12
star
48

eosio.forum

C++
12
star
49

eosio-swift-ecc

Swift utilities for working with keys, cryptographic signatures, encryption/decryption, etc.
Swift
11
star
50

key-value-example-app

An example app for using the key value database feature new to 2.1 of EOSIO.
TypeScript
11
star
51

eosio-java-android-abieos-serialization-provider

Pluggable serialization provider for EOSIO SDK for Java using ABIEOS
Java
11
star
52

eosio-authentication-transport-protocol-spec

EOSIO authentication transport protocol specification for consistent request-response lifecycle
10
star
53

ual-plainjs-renderer

library providers a Plain JS renderer around the Universal Authenticator Library
TypeScript
10
star
54

eosio-wasm-spec-tests

Repo for holding the generated wasm spec tests, as well as the generator
C++
10
star
55

demux-js-postgres

Demux-js Action Handler implementation for Postgres databases
TypeScript
10
star
56

eosjs-ledger-signature-provider

EOSJS Ledger Signature Provider Interface
TypeScript
10
star
57

demux-cli

CLI tool for starting, developing, and interacting with demux-js projects.
JavaScript
10
star
58

mojey

Swift
9
star
59

tutorials

Tutorials, examples and how-tos for EOS.IO
9
star
60

eosio.system

Reference system contract for an EOSIO based chain
C++
9
star
61

eosio-java-android-rpc-provider

Pluggable RPC provider for EOSIO SDK for Java
Java
9
star
62

manifest-spec

A specification detailing how EOSIO-enabled applications comply with the application manifest requirements of EOSIO-compatible user agents
9
star
63

eosio-android-keystore-signature-provider

Pluggable signature provider for EOSIO SDK for Java using Android's Keystore
Kotlin
9
star
64

vt-blockchain-bootcamp-starter

JavaScript
8
star
65

homebrew-eosio

homebrew tap for EOSIO
Shell
8
star
66

ual-eosio-reference-authenticator

Authenticator meant for use with EOSIO Reference Authenticator Apps and the Universal Authenticator Library
TypeScript
7
star
67

eosio.helm

Helm charts for EOSIO.
Shell
6
star
68

return-values-example-app

An example app for using the action return value feature new to 2.1 of EOSIO.
Shell
6
star
69

training-EED101

C++
6
star
70

eosio-swift-reference-ios-authenticator-signature-provider

A pluggable signature provider for EOSIO SDK for Swift for signing transactions with EOSIO Reference iOS Authenticator App
Swift
6
star
71

test-state-history

JavaScript
5
star
72

eosio-java-rpc-provider

Pluggable RPC provider for EOSIO SDK for Java
Java
5
star
73

eosio-java-abieos-serialization-provider

Java version of the ABIEOS Serialization Provider
Java
5
star
74

ual-ledger

authenticator meant to be used with Ledger and the Universal Authenticator Library
TypeScript
5
star
75

ual-lynx

authenticator meant to be used with Lynx and Universal Authenticator Library
TypeScript
5
star
76

taurus-node

EOSIO-Taurus - The Most Powerful Infrastructure for Decentralized Applications
C++
4
star
77

eosio-swift-abieos-serialization-provider

Pluggable serialization provider for EOSIO SDK for Swift using ABIEOS
C++
4
star
78

eosio.token

Reference contract for an EOSIO based token
C++
4
star
79

eosio-swift-vault-signature-provider

Pluggable signature provider for EOSIO SDK for Swift using Apple's Keychain or Secure Enclave
Swift
4
star
80

history-tools-docs

history-tools migrated docs for dev portal consumption
3
star
81

eosjs-ios-browser-signature-provider-interface

a Signature Provider Interface for communicating with an authenticator from iOS Safari using the EOSIO Authentication Transport Protocol Specification
TypeScript
3
star
82

chain-kv

key-value storage for blockchains
C++
3
star
83

eosio-swift-softkey-signature-provider

Example pluggable signature provider for EOSIO SDK for Swift for signing transactions using in-memory keys
Swift
3
star
84

eosjs-window-message-signature-provider-interface

A Signature Provider Interface for communicating with an authenticator over the Window Messaging API using the EOSIO Authentication Transport Protocol Spec.
TypeScript
3
star
85

eosjs-signature-provider-interface

An abstract class that implements the EOSJS SignatureProvider interface, and provides helper methods for interacting with an authenticator using the EOSIO Authentication Transport Protocol Specification.
TypeScript
3
star
86

homebrew-eosio.cdt

homebrew tap for eosio.cdt
Ruby
2
star
87

training-tictactoe

Bootstrap for certain training courses
C++
2
star
88

auto-request-generator

Python
2
star
89

eos-vm-test-wasms

Binary wasms for testing eos-vm.
1
star
90

taurus-zpp-bits

C++
1
star