LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > PDXUtopia区块链协议栈支持WASM合约与Solidity之间互相调用

PDXUtopia区块链协议栈支持WASM合约与Solidity之间互相调用

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

PDX|教程PDX Utopia区块链协议栈支持WASM合约与Solidity之间互相调用,本文档说明如何在PDX Utopia区块链协议栈中调用WASM合约与Solidity。Ewasm智能合约在区块链的价值

性能高效:WASM采用二进制编码,在程序执行过程中的性能优越;存储成本低:相对于文本格式,二进制编码的文本占用的存储空间更小;多语言支持:用户可以使用 C/C++/RUST/Go等多种语言编写智能合约并编译成WASM格式的字节码。

什么是Solidity?

以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript类似。Solidity是用于生成在EVM上执行的机器级代码的工具。Solidity编译器获取高级代码并将其分解为更简单的指令,Solidity代码封装在Contracts中。

WASM合约与Solidity之间互相调用

wasm合约与sol合约之间的互相调用是建立在两端都符合ABI规范的基础之上,部署之后调用方式与sol调用sol类似。

本章主要演示 wasm 合约与 solidity 合约互相调用

wasm 与 solidity 合约互相调用在 hello-wasm-abi 合约接口的基础上增加两个方法,用来演示如何调用 `solidity` 合约,完整的合约接口定义如下:

solidity// wasm 合约接口:

contract?hello_wasm_abi?{??? ??function?getcounter()?public?view?returns(uint256);?? function?get(string?memory?key)?public?view?returns(string?memory);??? ?????????????????????????function?put(string?memory?key,string?memory?val)?public?payable;

调用 solidity 合约的 get 方法 :

function?solget(address?addr,?string?memory?key)?public?view?returns(string?memory);

调用 solidity 合约的 put 方法 :

function?solput(address?addr,?string?memory?key,string?memory?val)?public?payable;}

solidity 合约接口:

contract?hello_sol?{?? function?get(string?memory?key)?public?view?returns(string?memory);???? ????????????????????function?put(string?memory?key,string?memory?val)?public?payable;

调用 wasm 合约的 get 方法:

function?wasmget(address?addr,?string?memory?key)?public?view?returns(string?memory);

调用 wasm 合约的 put 方法:

function?wasmput(address?addr,?string?memory?key,string?memory?val)?public?payable;}

hello_wasm_abi 接口实现:

样例程序 `hello-wasm-sol` 是在 `hello-wasm-abi` 的基础上增加两个方法用来调用 `solidity` 合约,并且增加一个用来描述 `solidity` 合约接口的 `pdxabi::Contract` 对象,具体如下:

abi.rs

使用 `pdxabi::Contract` 描述完整的 `hello_wasm_abi` 接口,因为我们要实现这个接口,对于 `hello_sol` 的描述只关注我们要使用的方法 `get/put` 即可。

目标 solidity 合约的接口描述,因为我们只调用 get/put 两个方法,所以这里只描述了两个方法。

方法一:用来调用 solidity 合约 。

方法二:用来调用 solidity 合约 。

lib.rs实现部分只列出了与 `hello-wasm-abi` 不同的地方。

获取返回值,只有 CallResult 为 Successful 时才会有返回值。

编译并部署:

(hello-wasm-sol)[https://github.com/PDXbaap/ewasm-rust-demo/tree/master/hello-wasm-sol] 得到 wasm 合约地址。

hello_sol 接口实现依然推荐使用 (remix):

[http://remix.ethereum.org/#optimize=false&version=soljson-v0.5.3+commit.10d17f24.js&evmVersion=null&appVersion=0.7.7] 来开发和调试符合 `ABI` 标准的合约。

soliditycontract?hello_sol_impl?is?hello_sol?{???? mapping(string?=>?string)?data?;

被 wasm 合约 solget 方法调用的 get 方法:

function?get(string?memory?key)?public?view?returns(string?memory)?{????????return?data[key];????????}

被 wasm 合约 solput 方法调用的 put 方法:

function?put(string?memory?key,string?memory?val)?public?payable?{????????data[key]?=?val;????}

调用 addr 地址对应的 wasm 合约的 get 方法:

function?wasmget(address?addr,string?memory?key)?public?view?returns(string?memory)?{????????hello_wasm_abi?hello?=?hello_wasm_abi(addr);????????return?hello.get(key);????}

调用 addr 地址对应的 wasm 合约的 put 方法:

function?wasmput(address?addr,string?memory?key,string?memory?val)?public?payable?{????????hello_wasm_abi?hello?=?hello_wasm_abi(addr);????????hello.put(key,val);????}}

test case

以上两个简单的实现已经可以用来演示 `wasm` 与 `sol` 之间的相互调用了,启动节点并用 `remix` 直接部署 `hello_sol_impl` 得到合约地址,做如下假设:

* hello_wasm_abi : 实现此接口的合约地址为 `0xA`;

* hello_sol : 实现此接口的合约地址为 `0xB`;

分别在用 `hello_wasm_abi` 接口加 `0xA` 实例化 `hello-wasm-sol` 合约;

用 `hello_sol` 接口加 `0xB` 实例化 `hello_sol_impl` 合约;

solidity实例化 wasm 合约:

hello_wasm_abi?a?=?hello_wasm_abi(address("0xA"));

实例化 sol 合约:

hello_sol?b?=?hello_sol(address("0xB"));

wasm 合约调用自己的 put :

a.put("foo","bar");

wasm 合约调用 sol 合约的 put:

a.solput("0xB","foo","hello");

sol 合约调用自己的 put:

b.put("hello","world");

sol 合约调用 wasm 合约的 put:

b.wasmput("0xA","hello","bar");

wasm 合约调用自己的 get:

a_foo?=?a.get("foo");

wasm 合约调用 sol 合约的 get:

ab_foo?=?a.solget("0xB","foo");

sol 合约调用自己的 get:

b_hello?=?b.get("hello");

sol 合约调用 wasm 的 get:

ba_hello?=?b.wasmget("0xB","hello");

assert:

—-

编译者/作者:PDX公有链

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

LOADING...
LOADING...