其他
为何多家公链纷纷使用 Wasm 合约?
什么是 Wasm?
Wasm 的特点
Wasm 的优势
Wasm 有哪些对开发者友好的特点?
1.性能高效:Wasm 采用二进制编码,在程序执行过程中的性能优越;
2.存储成本低:相对于文本格式,二进制编码的文本占用的存储空间更小;
3.多语言支持:用户可以使用 C/C++/Rust/Go 等多种语言编写智能合约并编译成 Wasm 格式的字节码。
VNT Chain(维特链)基于 Wasm 有哪些创新?
正是因为看到 Wasm 的诸多优势及未来前景,VNT 技术支撑方云象在 VNT Chain 设计之初,就确定了基于 Wasm 开发 VNT Chain 虚拟机的技术方案。基于原生的 Wasm,VNT Chain 进行了以下创新及改进:
1.改造原生 Wasm 中多线程、浮点数、异常处理等导致计算非确定性的设计,确保计算的确定性;
2.扩展对 String、Address、Hash 等数据类型的支持;
3.扩展 Opcode 以支持标准库的方法;
4.增加燃料(Gas)机制,解决了智能合约中的停机问题;
5.提供沙箱运行环境,实现资源隔离,保障系统的安全性;
6.提供编写智能合约所需的各种语言的类库;
7.支持合约调试功能;
8.兼容 Q 语言,该语言为自主设计智能合约编写语言 。
Wasm 在大型项目中的应用
什么时候使用 Wasm
a.对性能有很高要求的 App/Module/游戏
b.在 Web 中使用 C/C++/Rust/Go 的库
Wasm 的几个开发工具
Wasm 的意义
给了 Web 更好的性能 给了 Web 更多的可能
EOS 为何选择 Wasm
前置条件
编译 Emscripten
$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install sdk-incoming-64bit binaryen-master-64bit
$ ./emsdk activate sdk-incoming-64bit binaryen-master-64bit
$ source ./emsdk_env.sh
编译并运行一个简单的程序
$ mkdir hello
$ cd hello
$ echo '#include <stdio.h>' > hello.c
$ echo 'int main(int argc, char ** argv) {' >> hello.c
$ echo 'printf("Hello, world!\n");' >> hello.c
$ echo '}' >> hello.c
$ emcc hello.c -s WASM=1 -o hello.html
$ emrun --no_browser --port 8080 .
package main
import (
"fmt"
)
func main() {
fmt.Println("hello,wasm,go")
}
GOOS=js GOARCH=wasm go build -o test.wasm hello.go
cp $GOROOT/misc/wasm/wasm_exec.{html,js} .
我电脑用下面的命令
cp /usr/local/Cellar/go/1.11.4/libexec/misc/wasm/wasm_exec.html .
package main
import (
"flag"
"log"
"net/http"
"strings"
)
var (
listen = flag.String("listen", ":8080", "listen address")
dir = flag.String("dir", ".", "directory to serve")
)
func main() {
flag.Parse()
log.Printf("listening on %q...", *listen)
log.Fatal(http.ListenAndServe(*listen, http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
if strings.HasSuffix(req.URL.Path, ".wasm") {
resp.Header().Set("content-type", "application/wasm")
}
http.FileServer(http.Dir(*dir)).ServeHTTP(resp, req)
})))
go run http.go
node wasm_exec.js test.wasm
性能更好 可扩展性好 开发合约更容易,支持更多语言和工具
bytes: 不确定长度的二进制数组 bytes32: 32字节的数组 address: 20字节的数组 u128: 128位的无符号整数 u256: 256位的无符号整数
useGas 减掉消耗的gas getAddress 获得账户的地址 getBlockHash 获得区块哈希 call 将参数信息发送给某个地址 storageStore 保存一个256bit的值
https://github.com/ewasm/design/blob/master/eth_interface.md
https://github.com/ethereum/evmc
https://github.com/ewasm/hera