Polkadot生态中的智能合约-吴逸飞

rebase社区

2019/08/27 发布于 编程 分类

文字内容
1. Polkadot⽣生态中的智能合约 John Wu@Random Capital
2. 1. 智能合约:熟悉的⽼老老朋友 2. Ink语⾔言简介:⼀一个合约的例例⼦子 3. 合约的部署和测试 4. 智能合约还是应⽤用链?
3. 1. 智能合约:熟悉的⽼老老朋友 contract Flipper { bool value; constructor() public { value = false; } function flip() external { value = !value; } function get() view external returns (bool) { return value; } }
4. Wasm智能合约平台 EVM->WebAssembly是智能合约虚拟机的⼀一个 趋势。EOS就采⽤用了了wasm。ETH2.0也会转移 到wasm。因此Polkadot⽣生态中的智能合约平台 也会以wasm为主。⽽而且本来Substrate的runtim 也是wasm的,⽐比较统⼀一(当然开发者可以⾃自⼰己 开发EVM的智能合约平台)
5. Polkadot⽣生态中的智能合约链 1. Edgeware https://edgewa.re 2. ⾃自⼰己开发 其实只要引⼊入了了substrate官⽅方提供的srml的contracts模块 (https://github.com/paritytech/substrate/tree/master/srml/ contracts)就能够⽀支持wasm智能合约
6. 2. Ink语⾔言简介:⼀一个合约的例例⼦子 环境配置: 安装Rust curl https://sh.rustup.rs -sSf sh source ~/.cargo/env rustup target add wasm32-unknown-unknown --toolchain nightly 安装Substrate(node已经包含了了合约模块) curl https://getsubstrate.io -sSf bash
7. 安装WASM相关软件 Binaryen = Compiler infrastructure and toolchain library for WebAssembly Wabt = The WebAssembly Binary Toolkit Parity Wasm Utils = Parity specific WebAssemply utilities
8. 安装Ink cargo install --force --git https://github.com/ paritytech/ink cargo-contract
9. MacOS brew install binaryen brew install wabt cargo install pwasm-utils-cli --bin wasm-prune Ubuntu apt install binaryen apt install wabt cargo install pwasm-utils-cli --bin wasm-prune
10. 新建⼀一个官⽅方flipper合约项⽬目(很像 truffle init) cargo contract new flipper
11. Ink项⽬目的⽬目录结构 ├── Cargo.toml ├── build.sh ├── src │ └── lib.rs // 合约及测试 └── target // 编译后的wasm和abi
12. Ink语⾔言是由parity开发的,帮助开发者⽤用rust编写 wasm智能合约的eDSL(嵌⼊入式领域专⽤用语⾔言) Ink语⾔言的三个level: 1. Core:包含实现智能合约的核⼼心功能 2. Model:中级抽象层,有⼀一点像ont合约 3. Lang: 基于core和model,⼤大部分开发者会使 ⽤用这⼀一层
13. Ink合约的结构:lang的情况 导⼊入模块 contract! 变量量声明 部署函数 event定义 共有⽅方法 私有⽅方法 测试
14. use ink_core::{ env::DefaultSrmlTypes, memory::format, storage, }; use ink_lang::contract; // 使⽤用contract宏
15. contract! { #![env = DefaultSrmlTypes] Struct Flipper { value: storage::Value, } impl Deploy for Flipper { fn deploy(&mut self) { self.value.set(false) } }
16. impl Flipper { pub(external) fn flip(&mut self) { *self.value = !*self.value; } pub(external) fn get(&self) -> bool { env.println(&format!("Flipper Value: {:?}", *self.value)); *self.value } } }
17. 3. 合约的部署和测试 1) 部署:上传代码;实例例化(代码可复⽤用) 2) 测试:使⽤用cargo在test-env中
21. Endowment: ⼀一开始往合约中打⼊入的费⽤用
24. 合约交互部分,还没⽀支持view函数 (get函数),同时UI也没有相应 的⽀支持。⽬目前只能在节点的log上 看到响应
25. 测试 Ink提供了了test-env环境 指定test-env环境: cargo test --features test-env Cargo.toml⽂文件: [features] default = [] test-env = [ "ink_core/test-env", "ink_model/test-env", "ink_lang/test-env", ]
26. #[cfg(test)] mod tests { use super::Flipper; #[test] fn it_works() { let mut flipper = Flipper::deploy_mock(); assert_eq!(flipper.get(), false); flipper.flip(); assert_eq!(flipper.get(), true); } }
27. Ink智能合约⼩小结: • 还处于⼀一个没有早期阶段(毕竟substrate也刚刚升级到2.0版 本),还有很多⼯工作要做(路路线图还没有给出) • 集成了了开发,测试等⼯工具(和开发substrate体验有点类似, 很⼤大程度上涵盖了了truffle的功能) • 部署依赖于应⽤用链contracts模块的实现
28. 4. 智能合约还是应⽤用链?
29. 智能合约灵活度⽐比较低 • • • • 不不⽀支持你所需要的某种算法(包括哈希,密码曲线等) Gas成本⽆无法⾃自定义 性能受制于底层平台 升级/治理理机制拐弯抹⻆角(参⻅见刘⽼老老师⽂文章:https:// mp.weixin.qq.com/s/1sw8OH3zNSMrxwNjDDy9vQ)
30. 应⽤用链缺点 • 本身没有严格的资源控制机制:由于没有原⽣生的gas以及回滚 机制,需要开发⼈人员格外⼩小⼼心 • 接⼊入成本⽐比较⾼高:需要赢得拍卖并抵押DOT获得插槽,并⾮非 ⽆无准⼊入⽆无成本
31. THANK YOU! Contact us: info@yikuailianxi.com