Title Text
Writing Ewasm in Rust
用 Rust 编写Ewasm 合约
Antonio Yang
yanganto@github
Ewasm Contract
WHAT, HOW & WHY ?
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
What
Ewasm = Ethereum WebAssembly
WebAssembly is an open standard that defines a portable binary-code format for executable programs, and a corresponding textual assembly language.
Ethereum is a decentralized, open-source blockchain with smart contract (web3) functionality.
How
- A deterministic subset of WebAssembly.
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Why
Any language with HTTP protocol
Web2 Server
API
EVM
Web3 Blockchain
Restricted
Any language compile to EWasm format
WebAssembly
WHY RUST ?
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
What is Rust ?
Rust is a multi-paradigm, high-level, general-purpose programming language designed for performance and safety, especially safe concurrency.
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Why Rust ?
- low-level control and reliable performance.
- free from the non-deterministic garbage collection
- no runtime, enabling small binary sizes
Web 3
BLOCKCHAIN
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Web ?
Web3 Blockchain
Talk to contract in Binary over the blockchain network
Web2 Server
API
Talk to API in Hyper Text Markup Language over the internet
API
API
API
API
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Web 3
Web
Blockchain (Web3)
Handler(s)
Main entry
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Routing
In web2, Uniform Resource Identifier(URI) for routing
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Routing
In web3, functional signature for routing
- 4 bytes
- Optional attribute
- Hash(fn_name(type,))
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Same Backend Idea
Handlers
Main function
(entry point)
Prior Art
CONTRACT IN RUST
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Contract in Rust
ewasm-rust-api
-
Version 0.11.0
-
2019 Nov 27
.rs
Executor
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
ewasm-rust-api
ERC20 in Rust
but ... not really
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Pain Point
- Not really Rusty API
-
Result
-
Option
-
- Operating in low-level
-
operate on Bytes32
- Manually handle functional signature
-
- Not easy to test with cargo test
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
C vs Rust
pub enum CallResult { Successful, Failure, Revert, Unknown, }
pub enum CallError { Failure, Revert, Unknown, }
fn call() -> CallResult;
fn call() -> Result<(), CallError>;
Please read things behind the wordings!
Current Status
DIFFERENT FROM WEB
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Different in Functions
Constructor
Handlers
Main function
(entry point)
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Constructor
- Another wasm executable
- Run once
- Return main wasm executable
- Not storage on chain
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Different in Storage
- File server
- Key value database
- Relational database
- Bytes 32
- ?
- ?
Web
Blockchain (Web3)
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Different in Test
- Local server
- Hot reload
- Mock request
- Free to request
- Fuzz test
- Deploy on test net
- ?
- ?
- Request with fee?
- ?
Web
Blockchain (Web3)
Writing Ewasm In Rust
SEW UP EWASM
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Sew Up
ewasm-rust-api
sewup
.rs
Web3 Blockchain
- Rusty API
- high-level operation (kv, rdb, ...)
- cargo test in local
- cargo sewup to build & deploy
- Low-level operation
- Byte32 operation
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
Sew Up
Tests
Create WasmEdge runtime,
Add _compile_constructor_test,
Add _compile_runtime_test
Run each test in runtime
Use macro to add common test utilities,
then just cargo test
SewUp
HAPPY HACKING
THANK YOU
QUESTIONS?
第六届中国开源年会 COSCon'21 开心开源 Happy Hacking
扫码关注
开源社公众号
Let's meet on github or hackthon,
issue, PR are welcome
用 Rust 编写 Ewasm 合约 - Writing Ewasm in Rust
By Antonio Yang
用 Rust 编写 Ewasm 合约 - Writing Ewasm in Rust
The slides provide the general concept to build up an Ewasm contract in Rust. Besides, the pain with ewasm_rust_api are pointed and also provide a framework SewUp try to solve these pain point
- 1,098