查看原文
其他

Hello, ink! | Substrate 智能合约极速入门(一)

The following article is from 李大狗Leeduckgo Author 李大狗就是我



01什么是 Wasm 智能合约?


以往,我们谈到智能合约,都是基于 EVM 的 Solidity 智能合约。

目前,随着智能合约技术的发展,出现了一种新的可能性:Wasm 智能合约,Wasm 并非一门新的编程语言,而是一种全新的底层二进制语法。


Wasm(WebAssembly)是一种新的字节码格式,是一种全新的底层二进制语法,它所编译的代码指令体积小,可移植,加载快并兼容 Web 的全新格式。Wasm 可以支持 C/C++/RUST/GO 等多种语言编写合约后编译出字节码,且不同语言有附带丰富的底层标准库可供调用。

Wasm 的优势

作为一种全新的字节码格式,Wasm 通过自身的创新和优化,使得在使用其对所支持的语言进行编写后的代码指令具有体积小,可以在运存,硬盘存储,带宽占有上得到更多的优化,在节省了区块链网络资源,也明显的提升了网络传输效率。


在智能合约上使用 Wasm,也将拥有以上特点,最明显的方面就是占用资源更少,运行合约更快速和稳定,并且网络传输信息更加高效。这可以使得区块链网络上部署更多的智能合约,也可以使得用户在使用智能合约时能获得更好的体验感。


Wasm 智能合约优势分析:https://zhuanlan.zhihu.com/p/344347968


从目前的趋势上来看,Substrate、ETH 2.0 等公链与多家联盟链,均表示将支持 Wasm 智能合约。



02可以用什么语言编写 Wasm 智能合约?

Wasm 扩展了智能合同开发者可用的语言系列,包括 Rust、C/C++、C#、Typescript、Haxe 和 Kotlin。这意味着你可以用你熟悉的任何语言编写智能合约。


从适配性上来说,Rust 语言目前与 Wasm 智能合约的适配性更好,工具链更全,而且写出来的智能合约更加安全。


所以,本系列将以 Subtrate 上的 ink! 智能合约为例,开始 Wasm 智能合约的 101 课程。


本文对 ink! 官方教程有所参考:

https://substrate.dev/substrate-contracts-workshop



03Rust 环境配置


 1.Rust 环境配置 


在 MacOS 或者 Ubuntu 等 Linux 操作系统上,我们可以通过一行命令很容易的安装 Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
除此之外还要安装nightly版本:
rustup install nightly
Windows 下的安装,请参考:
https://forge.rust-lang.org/infra/other-installation-methods.html


 2. 将 Rust 添加到环境中 


将如下语句添加到~/.bashrc~/.zshrc中:

export PATH=~/.cargo/bin:$PATH
然后:
source ~/.bashrc # source ~/.zshrc


 3. 换源 


过设置如下环境变量,我们把 Rust 源切换到国内:

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-staticexport RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup

~/.cargo/config文件中写入如下内容:

[source.crates-io]registry = "https://github.com/rust-lang/crates.io-index"replace-with = 'ustc'[source.ustc]registry = "git://mirrors.ustc.edu.cn/crates.io-index"



04 ink! 环境配置


在配置了基本的 Rust 环境后,我们可以配置 ink! 所需的开发环境了。

# for substraterustup component add rust-src --toolchain nightlyrustup target add wasm32-unknown-unknown --toolchain stable# for canvas node cargo install canvas-node --git https://github.com/paritytech/canvas-node.git --tag v0.1.4 --force --locked# for ink!CLIcargo install cargo-contract --vers 0.10.0 --force --locked
我们还要安装/升级binaryen,Binaryen 是 WebAssembly 的编译器。
# for macbrew upgrade binaryen # 如果没安装用 brew install



04 创建一个 ink! 项目


执行如下命令:

cargo contract new flipper
创建完成后进入文件夹:
cd flipper/
合约项目目录结构:
flipper|+-- lib.rs <-- Contract Source Code|+-- Cargo.toml <-- Rust Dependencies and ink! Configuration|+-- .gitignore



05 合约测试


cargo +nightly test
一切顺利的话会输出如下结果:
$ cargo +nightly test running 2 tests test flipper::tests::it_works ... ok test flipper::tests::default_works ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out



06 合约编译


cargo +nightly contract build


如果顺利的话,目录下会生成target/ink文件夹,里面包含如下文件:



其中,flipper.contract 是部署时要用的合约文件,可以视为solidity合约中的bin文件。

metadata.json是元数据,可以视为solidity合约中的abi文件。



07 合约部署


通过canvas启动一个本地运行的开发节点!
canvas --dev --tmp


打开如下网址,会这个页面会自动连接本地启动的开发节点:

https://paritytech.github.io/canvas-ui

上传flipper.contract这个文件:

一路点击进行部署:



08 合约调用


点击Execute


选择get():bool函数,点击「调用」:

返回调用结果:



09 Flipper 源码解读


// Copyright 2018-2020 Parity Technologies (UK) Ltd.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.
#![cfg_attr(not(feature = "std"), no_std)]
use ink_lang as ink;
#[ink::contract]pub mod flipper { #[ink(storage)] pub struct Flipper { value: bool, }
impl Flipper { /// Creates a new flipper smart contract initialized with the given value. #[ink(constructor)] pub fn new(init_value: bool) -> Self { Self { value: init_value } }
/// Creates a new flipper smart contract initialized to `false`. #[ink(constructor)] pub fn default() -> Self { Self::new(Default::default()) }
/// Flips the current value of the Flipper's bool. #[ink(message)] pub fn flip(&mut self) { self.value = !self.value; }
/// Returns the current value of the Flipper's bool. #[ink(message)] pub fn get(&self) -> bool { self.value } }
#[cfg(test)] mod tests { use super::*;
#[test] fn default_works() { let flipper = Flipper::default(); assert_eq!(flipper.get(), false); }
#[test] fn it_works() { let mut flipper = Flipper::new(false); assert_eq!(flipper.get(), false); flipper.flip(); assert_eq!(flipper.get(), true); } }}

1. cfgcfg_attr的使用


cfg是 Rust 中的特殊属性, 它允许我们编译基于标志的代码并传递给编译器。


在本合约中,我们可以看到:

#[cfg(test)]

这个标识意味着下面的代码是单元测试。


2. impl 关键字

Implement some functionality for a type.

为一种类型做函数实现。

标准的模板是:
struct Example { number: i32, # 许多变量……}
impl Example { fn boo() { println!("boo! Example::boo() was called!"); }
fn answer(&mut self) { self.number += 42; } # 许多函数……}
套用到本合约中,首先我们定义本合约的struct
pub struct Flipper { value: bool, # 其中包含一个变量 value}

然后对struct进行补充实现:

impl Flipper { ……}


3. #[ink(constructor)]#[ink(message)]


#[ink(constructor)]表示这行语句函数是合约的构造函数,相当于solidity合约中的constructor
https://docs.soliditylang.org/en/v0.7.2/contracts.html#constructor

#[ink(message)]表示这行语句下面的函数是合约的普通函数,如例子中的get函数:

/// Returns the current value of the Flipper's bool.#[ink(message)]pub fn get(&self) -> bool { self.value}


以上就是 Wasm 智能合约系列的第一篇,欢迎关注本系列!



About Patract 


Patract 为波卡 Wasm 合约生态的平行链和 DApp 开发提供解决方案。我们帮助社区平行链设计和开发链上合约模块和 Runtime 支持,并且为 DApp 开发者提供覆盖开发、测试、调试、部署、监控、数据提供和前端开发等阶段的全栈工具和服务支持。

How to join Patract


1.对于合约开发者,可以访问官网 (https://patract.io),熟悉测试链和工具套件。欢迎加入官方开发群:
Element
(https://app.element.io/#/room/#PatractLabsDev:matrix.org)
Discord(https://discord.gg/wJ8TnTfjcq)
 
2.对于将要集成 Wasm 合约功能的平行链项目方,或者使用 Wasm 合约开发的 DApp 项目方,商务合作欢迎联系 santry@patract.io
 
3.对于用户,欢迎加入:
Telegram(https://t.me/patract)
Twitter(https://twitter.com/PatractLabs)
 
4.对于求职者,我们在招聘区块链开发工程师、前端/全栈开发工程师、开发者运营等岗位,可以联系 sean@patract.io

长按识别二维码,加入Patract 微信开发群


往期精彩:

//Patract转型为解决方案提供商,携手Acala首推Wasm合约开放平台计划
//Patract 与Apron  Network就 Elara节点服务相关产品达成战略合作
//波卡合成资产协议Coinversation与Patract合作共建Wasm合约开放平台

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存