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 合约与 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公有链 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
PDXUtopia区块链协议栈支持WASM合约与Solidity之间互相调用
2020-01-15 PDX公有链 来源:区块链网络
LOADING...
相关阅读:
- OKChain项目进度月报(2020年7月)2020-08-06
- 月白:8.6主流币突破关键压力区间先抑后扬保留冲高机会2020-08-06
- 什么是ChainLink代币?为什么价格在不到4个月的时间内上涨超过1800%?在2020-08-06
- 8/6BTC合约新手如何布局请看本文2020-08-06
- 8/6 BTC 合约新手如何布局 请看本文2020-08-06