LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > PDX Utopia区块链协议栈调用Ewasm智能合约

PDX Utopia区块链协议栈调用Ewasm智能合约

2020-01-04 PDX公有链 来源:区块链网络

PDX|教程

PDX Utopia区块链协议栈支持Ewasm智能合约,本文档说明如何调用Ewasm。

Ewasm是以太坊智能合约的未来

常用多智能合约开发语言可以在以太坊虚拟机EVM上运行的智能合约,不过它有一些严重的问题,包括算术溢出、类型错误,所有这些漏洞都是在开发语言层面存在的问题。Ewasm是一种创新技术——提供了一种抗攻击的去中心化计算解决方案,可以创造更安全的智能合约。

PDX Utopia区块链协议栈支持Ewasm智能合约。Ewasm能解决现有的以太坊智能合约虚拟机过于复杂,性能低,以及仅支持编程语言和开发工具有限等问题,它能提供可执行的二进制格式、非常类似于传统计算机的体系架构、高效且支持多种编程语言及开发者工具,还能够向后兼容EVM,因此Ewasm是以太坊智能合约的未来。

在Ewasm中,在简单的编写后,为智能合约进行部署时,就可以跳过硬分叉场景。而且它在计算方面的效率非常高,可以开启新层次的互操作性,以至于大多数预编译的东西都可以被取消。

Ewasm 很强大、很重要,是不会出现混乱的,它是建立在一种已经标准化的万维网上的语言中,在浏览器中添加对以太坊的支持是轻而易举的。

Ewasm 的特性:

1.Ewasm 是wasm 的子集合;

2.因为不能有误差,所以不支持浮点数运算;

3.只能import 以太坊的函式库,避免 importㄒ系统函式库;

4.在每段指令之前插入useGAS 来计算 GAS 的花费。

以太坊环境接口(EEI)

EVM 里有很多像是SSLOAD, SHA3 的高阶指令,这些指令在Ewasm 1.0 里,因为 WASM 可以动态读取函式库(模组),以太坊定义了以太坊环境接口(EEI),让客户端可以用不同的语言实现相对应的函式库,而且也更容易完成 prototype 跟升级。

以太坊的心脏其实就是一台虚拟电脑,以太坊虚拟机(EVM)存储在成千上万个节点上,组成了以太坊平台。

下图是 Ethereum Environment Interface 定义的函数列表。

如何移除非法的指令?

Ewasm 使用 system contract 移除非法指令以及加入 useGas 的 bytecode,像是浮点数或是非法的 import,有以下两种做法:

1.使用 system contract 检查合约的 bytecode;

2.像目前的 precompiles 运行在客户端上,在部署前先检查合约。

下图是 Ewasm 1.0 的 stack,在部署合约前 Ewasm bytecode 会先经过 Sentinal 的检查,成功部署后客户端如果要执行合约会通过 EVM-C 与 Heru(Wasm Engine)沟通。

合约开发规范

Ewasm合约接口规范由以太坊定制,指定模块结构等信息,PDX Utopia 严格遵循此规范,具体如下

数据类型

禁止使用浮点数,兼容 evm 中规定的数据类型,例如:

* bytes : 不定长字节数组;

* address : 160 bit 数字,在内存中以 20字节 小字节无符号整型表示;

* u128 : 128 bit 数字,在内存中以 16字节 小字节无符号整型表示;

* u256 : 256 bit 数字,在内存中以 32字节 小字节无符号整型表示。

格式

每个合约必须存储为 wasm 字节码。

导入模块

规定合约 `import` 的范围仅限于 [EEI](https://github.com/ewasm/design/blob/master/eth_interface.md) 提供的模块,`ethereum` 名称空间以外的包只允许使用 `debug` ,在生产环境中 `debug` 也应被禁止使用。

导出函数

每个合约必须导出两个函数(只能导出两个函数);

* memory : 可供 [EEI](https://github.com/ewasm/design/blob/master/eth_interface.md) 写入的共享内存;

* main : 一个入口函数,没有参数也没有返回值,将被 VM 执行;

要关闭 `wasm` 的 `start function` 功能,开启它会影响 `ewasm` 在启动前获取合约内存地址指针的功能。

关于 ABI

>我们看到有关导出函数的规定与 `solidity` 合约中定义的 `ABI` 有些不一样;

>`solidity` 合约根据方法签名来生成相应的 `ABI` 以便对合约中的函数进行调度;

>这在 `ewasm` 看来似乎行不通,因为只有一个 `main` 函数被导出了;

>如何使用 `main` 函数之外的函数呢?我们很自然就想到了使用合约的 `input` 来;

>定义目标方法和输入参数,事实上 `solidity` 也是这么做的,只是我们把这个灵活性 ;

>交还给开发者实现,以统一的 `main` 函数作为入口,然后自行封装 `input` 序列化方案;

>在后面的例子中我们可以看到更加灵活的方式。

开发环境安装

PDX Utopia 使用 rust 作为 ewasm 合约开发语言,并通过 rust 工具链对合约进行编译,具体安装与使用流程如下

1. 安装 rustup

curl?https://sh.rustup.rs?-sSf?|?sh

>注意,在安装脚本执行时要选择 `nightly` 频道,否则无法完成后续工具安装 ;

>安装时如果 path 处理失败,需要手动加载一下环境变量 : `source $HOME/.cargo/env`。

2. 安装 rust 标准库

rustup?component?add?rust-src

3. 安装 wasm-pack 编译工具

curl?https://rustwasm.github.io/wasm-pack/installer/init.sh?-sSf?|?sh

4. 安装 wasm 后期处理工具

```bash$>?git?clone?https://github.com/PDXbaap/wasm-chisel.git$>?cd?wasm-chisel$>?cargo?build?--release

编译成功后会在 `target/release` 目录下找到 `chisel` 程序,确保将其复制到 `$PATH` 目录。

—-

编译者/作者:PDX公有链

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...