【原创】[区块链技术工坊25期实录]张伟-WASM应用区块链虚拟机的技术实践

1,活动基本信息

1)题目:
【区块链技术工坊25期】WASM应用区块链虚拟机的技术实践
2)议题:
1] WASM技术特点和优势;
2] WASM 基本原理和执行过程
3] Bottos对WASM适应性改造
4] Bottos对wasm安全增强;

3)嘉宾:

张伟是Bottos区块链底层系统工程师,负责Bottos区块链底层的研发设计工作,熟悉区块链智能合约设计,区块链领域优秀技术专家。在中兴,华为公司工作十多年,从事移动通信产品的研发设计工作,具有丰富的产品研发经验。

4)活动定位
区块链技术工坊系列活动,由HiBlock,兄弟区块链,,创业股平台联合主办,HPB芯链战略支持的,聚焦于深度分享区块链知识,实现小会技术交友。区块链技术工坊坚持4F原则:

  • Frency - 每周三晚上一次;
  • Focus - 聚焦区块链技术分享;
  • Fun - 20人以内会前做自我介绍,分享有深度的技术内容,技术交友;
  • Feedback - 会后有活动总结和合影照片。

2,分享实录

Q:为什么要沙箱呢?
A: 举个例子,EVM的内部代码其实不难接触到区块链的网络、文件系统或者说其他进程等等,如果说EVM能够接触到这些模块,很容易出现一个状况,大家可以想象,无论是谁编写一个恶意的智能合约的代码,部署到以太坊网络中,轻则出现ETH被盗等情况的出现,严重的话,专员觉得,完全可以造成整个以太坊网络的崩溃,造成毁灭性的打击。
同时,虚拟机有有效隔离了合约代码编写错误导致的整个系统失败。在各种虚拟机中,为了防止虚拟机执行过多的计算指令,陷入死循环等等,各类虚拟机都会制定一系列的检查机制。

区块链上的虚拟机与链的交互主要就是数据的获取以及存储,所以相对来讲,更加轻量。

JIT:当虚拟机判定某段代码运行的比较频繁,就会把这些代码认定为执点代码。为了提高热点代码的执行效率,虚拟机将会把这些代码编译成与本地平台相关的机器码,以便直接执行得到更快的执行效率。
wasm:由执行速率驱动:精简、加载时间短的格式和执行模型,比如用于WEB中视频解码,动画渲染等。

更多内容参考:https://zhuanlan.zhihu.com/p/25773367

简单来说,Web Assembly(WASM)就是一种中间代码(字节码)技术。突出的特点就是精简,加载时间短以及高速的执行模型。其他高级语言(C/C++等)编写的程序都可以编译成WASM格式的程序。这样的好处是WASM可以兼容运行所有用C/C++等高级语言编写的程序。

以Bottos虚拟机举例,首先由高级语言C/C++编写的智能合约,经过编译生成wast文件,再转换成wasm的字节码格式,再由虚拟机加载wasm字节码文件,解析其中的字节码,转换成对应的方法执行。另外,wast/wasm可以相互转换,参考:https://github.com/WebAssembly/wabt

这里举一个简单的例子来说明:使用C/C++语言来写了一个简单的add函数,经过编译生成wast文件,里面可以看到关于add函数的一些描述,最后再由wast生成wasm二进制文件,里面的6A对应实际的add操作指令。

在chrome浏览器里演示一下:
WebAssembly.compile(new Uint8Array( 00 61 73 6D 01 00 00 00 01 07 01 60 02 7F 7F 01 7F 03 02 01 00 04 04 01 70 00 00 05 03 01 00 01 07 10 02 06 6D 65 6D 6F 72 79 02 00 03 61 64 64 00 00 0A 09 01 07 00 20 01 20 00 6A 0B 0B 0A 01 00 41 04 0B 04 10 40 00 00 .trim().split(/[\s\r\n]+/g).map(str => parseInt(str, 16))
)).then(module => {
const instance = new WebAssembly.Instance(module)
const { add } = instance.exports
console.log(‘2 + 10 =’, add(2, 10))
})

wasm文件在执行时,会被先加载到VM里,加载过程中会进行解析,以得到诸如可访问函数信息等信息。

这个是执行某个函数时,关于这次执行的一个上下文定义,大概的意义参考注释,这里描述一下code:
在加载wasm文件时,每个函数都会被解码成标准的码流串,比如add函数, “32 1 0 0 0 32 0 0 0 0 106 1”,那么code就就保存了该码流,相当于是这个函数的实现。

简单的分析一下add函数的执行过程:�
1、在执行add函数前的上下文初始化中,已将a和b这两个入参放到local中;

2、这里的两个32指令,也就是wast里的get_local指令,就是从local里将这两个值取出来push到stack里,其中两个32后面的“1 0 0 0” 和”0 0 0 0“分别是两个值的位置索引,只是用32字节长度来表示。
3、然后106指令,也就是i32.add指令,指行加法运算,并将a和b从stack里POP出来,将a+b结果push到stack里。

对于每一块分配的内存,都会保存信息,以便访问的时候进行异常判断。

调用合约的方法,不直接传递参数,在合约中使用提供的模板的,这样可以自动解析入参,用户只需要传入结构,其他的在模板里处理完成。

Q:已经发现的安全性问题,从合约角度该如何解决?从虚拟机角度该如何解决?异常的容错是如何解决?
A:在“Bottos虚拟机的特点和优化”中介绍
合约问题举例?

活动会议部分成员合影:

本次实录纪要由辉哥(王登辉,创业股平台CTO,HiBlock上海合伙人)整理记录,转发务必注明出处及本段信息。

3,下期活动宣传

1)题目:
【区块链技术工坊26期】医疗区块链应用与智能合约实践

2)议题:
在数字货币浪潮爆发和普遍受到监管的同时,由于区块链天然具有的去中心化交易和价值传播、信用共识机制,诸多行业应用也在向区块链探索实践和寻求迁移演进的路径。在高度集中和遵循质控路径的医疗行业,对此技术尤为期待,本次分享基于以太坊的智能合约特性,阐述如何通过区块链技术改变患者在可参与医疗模式中(Patient Engagement)的作用和地位。

1] 数字货币和以太坊的演进路线与差异。
2] 医疗区块应用中的隐私保护机制建立。
3] 可参与医疗模式与区块链应用场景简介。
4] 医疗服务领域去中心化多方市场的建立。

3)嘉宾:

张东光,以太坊早期社区1tf.org发起成员和主要社区贡献者,云秦科技创始人和康盈医学CEO,Manternet.org发起人,国内最早研究和翻译引入以太坊智能合约编程语言Solidity,目前致力于政府及公共事业向区块链应用的产业生态演进与转化研究。

4)时间/地点:
2018-12-12(周三晚上) 18:30 / 上海徐汇区龙华中路596号

5)活动报名海报
请微信扫描二维码报名参与,有门禁密码私送,空降无法参加。