Writing Ethereum
Wasmassembly with SewUp
Hackathon
What is SewUp
Benefit from Rust
- Safe
- Performance
- Small size
What is Ethereum Webassembly?
- Aka, eWasm
- redesign of the Ethereum smart contract execution layer
Relation between Wasm
- A deterministic subset of WebAssembly.
What is contract in Web?
Application layer of web3
EVM
API
API
API
Web2 Server
Web3 Blockchain
- ewasm-rust-api
- Version 0.11.0 (2019 Nov 27)
Contract in Rust
Executor
.rs
ERC20 with ewasm Rust api
There is a gap !
No operation on bytes in Web 2
Pain point eWasm with Rust
- Not really Rusty API
-
Result
-
Option
-
- Operating in low-level
-
operate on Bytes32
- Manually handle functional signature
-
- Not easy to test with cargo test
Executor
.rs
This is C
pub enum CallResult { Successful, Failure, Revert, Unknown, }
This is Rust
pub enum CallError { Failure, Revert, Unknown, }
fn call() -> CallResult;
fn call() -> Result<(), CallError>;
Please read things behind the wordings!
Web 2 | Web 3 | |
---|---|---|
Business level | Web application | Blockchain application |
Handler level | Rocket | SewUp |
Byte level |
hyper | ewasm-rust-api |
Let's Sew up
How to Sew Up
- Security
- High level development
- Same develop experience with web2
Rust
Contract Dev as Backend
The detail goal of Sewup
ewasm-rust-api
sewup
- Rusty API
-
Result
-
Option
-
Error
-
- high level operation
-
like handle KV db, RDB
- functional signature macro
-
- Easy to test
- Easy to deploy
.rs
Web3 Blockchain
Error
- Customize error
- Good error message
- Easy to use
match your function
Like develop traditional web
Rust style result
Rust Style
structure
bytes
Easy for
Developing
string
store without touching Bytes32
Let's SewUp
Rusty Development
-
Initialized project - cargo sewup init
- Run test - cargo test
- Deploy contract - cargo sewup
- (Optional) Interact with contract - cargo run
Initialized project
- Install cargo sewup
cargo install cargo-sewup
Initialized project
- Initialize project to a specific folder
- cargo sewup init -p /path/to/your project
- Initialize project in current folder
- cargo sewup init -m <default|rusty|auto>
.
├── .cargo
│ └── config.rs
├── Cargo.toml
├── sewup.toml
└── src
└── lib.rs
Set up Rust flags fro wasm
Deploy information
(git ignored)
Write the contract as library
Develop & Test
Constructor
Handlers
Main function
(entry point)
Tests
Constructor
- Only run once when the contract deploy
- There is no return value
- For example, table schema can be created here
Handler & Main
- Web 2 main fn route URI for handlers
- Web 3 main fn route Signature for handlers
Auto generate HELLO_SIG
will be HELLO_SIG
Learn more from Rust doc
Run Test in test runtime
Learn more from Rust doc
- Add #[wasm_test] attribute
- cargo test
- Test case will be run in WasmEdge
Quick
View
Inputs
Inputs for handler
- from contract developer
- compile time defined inputs
- from contract caller
- runtime inputs
Compile time defined inputs
- from contract developer
- compile time defined inputs
- Never changed
Runtime Inputs
- from contract caller
- runtime inputs
- binary passing from client
- Should be Deserialize
- One input
- ewasm_input_from!(contract move handler)
Outputs
Outputs
- Default
- thiserror message
- Rusty
- return a Result
- customized error
- Auto
- return T for Result<T>
- none-rust client
Outputs
- Default
- thiserror message
- Rusty
- return a Result
- customized Error
- Auto
- return T for Result<T>
- none-rust client
Outputs
- Default
- thiserror message
- Rusty
- return a Result
- customized Error
- Auto
- return T for Result<T>
- none-rust client
Output with different type
-
use sewup::primitives::EwasmAny
-
use auto mode for ewasm_main
EwasmAny
- A wrapper type for output binary
- It is easy to covert from any type with Serialize Trait
- check out the Rust doc
Tests
Test Macro
Learn more from Rust doc
Create WasmEdge runtime,
Add _compile_runtime_test,
Add _compile_contract_test
Run test in WasmEdge runtim
Assert Macros
- Macros help you run test case in runtime
Learn more from Rust doc
-
-
assert on output
-
-
-
assert on vec![] (no error)
-
-
-
assert on the unwrapped output
-
-
-
assert on Ok(())
-
- `by` run test case with specific account
Debug in test runtime
- sewup::ewasm_dbg!
- set log #[ewasm_test(log=/tmp/default.log)] on test mod
- run test with --nocapture option
- cargo test -- --nocapture
The message you debug on
The message you debug on
Caller Address
Flag section preserved not used currently
Deploy
Ewasm build & devploy flow
- Contractor wasm execute once and return runtime wasm and storage it on chain
- Provide keys, url in sewup.toml
- `cargo sewup`
Interact
Generate abi.json
- ERC tokens can use web3.js client with abi.json
- `cargo sewup --generate-abi`
- Rust client is also possible, please checkout client.rs in examples
Examples
Examples are listed here and will be covered in future events.
It is always welcome if you move on these examples and hack much deep!
- Voting example with KV feature
- only chairman can give the ballots to voters
- the voter can vote the proposal once
- everyone can check out the voting result after everyone voted
Hand in Hand
Hand in Hand Examples
- KV feature - Hangman
- RDB feature
- ERC feature
Last but not least
Blockchain bring TRUST to the world
Rust is the stem of TRUST
Thanks for listening
Star the project if you like it
There are also help want issues and good first issues
Interested in VM?
WasmEdge is welcom to contribute
Q&A
Writing Ethereum WebAssembly in Rust
By Antonio Yang
Writing Ethereum WebAssembly in Rust
Secondstate EWasm Utility Program, a library to help you to write Ethereum WebAssmbly in Rust
- 1,201