EOS入门指南PART5——开发智能合约之前,你还需要知道...

上一篇我们介绍了如何搭建本地测试节点,它提供了一个智能合约的运行环境。我们还介绍如何使用超级账户eosio来创建新账户以及载入系统级别的智能合约。

通过上一章的学习,大家可能已经对智能合约有了一个比较模糊的概念。这一章将继续为大家讲解,开发智能合约之前,你还需要知道的事。

摘要

这一章,我们将自己上手部署调用一个简单的智能合约hello,中间会穿插讲解一些相关概念,这些概念虽然很基础,但是对初学者而言,也很重要。

什么是WebAssembly

之前如果大家简单地浏览过eos项目文件夹,就会看到很多.wasm文件,而wasm就是WebASseMbly的缩写。这里让我们略过Flash、JavaScript和WebAssembly的爱恨情仇(发展演化),直接一句话概括一下:

WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行。

想象它是一种可以把底层语言文件变得像JS那样,可以直接在浏览器中运行。而且比JS更轻量、更快速、更安全。过程如下图:

c++2wasm

还有一个大家在build eos的过程中看过一百遍的词:LLVM

LLVM是一些分模块、可重用的编译工具链。它提供了一种代码编写良好的中间表示(IR)。

它在上图中的位置大概是介于第一步和第二步之间。

如果想把C/C++变成WASM文件,就需要先把C/C++代码先变成LLVM中间代码。一旦变换成了LLVM IR之后,就说明LLVM已经理解了代码并会对代码自动地做出一些优化。

而WebAssembly也并不是只有wasm一种格式,它还有wast格式。这两者作用是等价的,最大的区别就是wast是可读文本格式的,而wast是二进制格式的,他们可以通过工具相互转换。

让我们高度总结一下WebAssembly:

可以让浏览器识别底层语言的神器。

(笔者感觉和以太坊中的编译器作用差不多)。

什么是ABI

玩过以太坊的同学可能对ABI并不陌生,在EOS中ABI的作用也和以太坊中大致类似:

它定义了函数被调用的规则;定义了参数在调用者和被调用者之间是如何传递的。

如果说wasm文件是产品的话,要想顺利使用这件产品,你还需要一本操作说明书,而ABI就是这份说明书。

土味智能合约入门:hello

一说入门就要说,这种感觉很low,同时也很“程序员”。感谢雷佳音让我找到了一个并不尴尬的小标题:土味hello。

0. 准备工作

进度保持在我们上一章结束的地方:我们已经学会使用操作eosio账户、创建了新账户testeosio

在正文开始之前,请启动nodeos,相关钱包处于unlock状态。

1. 修改config.ini

找到位于vi ~/Library/Application\ Support/eosio/nodeos/config/中的config.ini文件,打开找到下面这句话:

# print contract's output to console (eosio::chain_plugin)
contracts-console = false

把上面的false改成true,保存修改退出。这样我们就可以在终端直接看到智能合约的执行情况。

(这里笔者重新启动了nodeos)

2. 创建hello合约

这里我们用到了一个小工具叫eosiocpp。eosiocpp是一个c++生成wasm和ABI文件的工具。

eos项目中自带了一个hello合约,为了区分,这里我们创建一个合约叫做hello1。执行以下语句创建新合约:

eosiocpp -n hello1

它会以样例合约为基础创建一个最简单的合约。看到下图即表示创建成功:

eos-craete-contract

这时在当前文件夹下就可以看到有一个hello1的文件夹。

进入hello1文件夹,可以看到里面有两个文件:

➜  hello1 git:(master) ✗ ls
hello1.cpp hello1.hpp
  • hello1.hpp是智能合约的头文件,可以包含一些变量,常量和函数的声明。
  • hello1.cpp是合约的源码文件,包含合约的具体实现。
3. 生成wasm和abi文件

进入hello1文件夹下执行以下命令:

#使用 -o 生成wast文件和wasm文件
eosiocpp -o ./hello1.wast ./hello1.cpp
#使用 -g 生成abi文件
eosiocpp -g ./hello1.abi ./hello1.cpp

这时可以看到在当前文件夹下生成了hello1.wasthello1.wasmhello1.abi文件。

4. 部署智能合约

使用我们刚刚生成的文件部署智能合约。输入如下命令:

cleos set contract eosio ./ ./hello1.wast hello1.abi -p eosio@active

这行命令有五个参数:eosio表示部署合约的账户,./表示合约所在的文件夹,后面两个参数依次是.wast.abi文件的路径,最后的-p eosio@active表示权限。

执行成功如下图所示:

set-hello-contract

调用hello合约

在执行调用命令之前,我们先简单地了解EOS中的一个概念:transactionaction

Action表示单个操作,而transaction是一个或多个action的集合。Action是合约和账户之间进行通信的方式。Action可以单独执行,或者组合组合起来作为一个整体执行。

在官网中我们也可以看到包含一个action和多个action的transaction的例子。

对比来看的话,EOS中的action就相当于以太坊中的transaction。

执行以下命令来调用hello1合约中的hi方法:(执行的账户是testeosio)

cleos push action eosio hi '["hammer"]' -p testeosio

执行成功就可以看到如下界面:

invoke-hi

这时如果我们去看运行nodeos的终端窗口,可以看到下面的提示:

invoke-hi-nodeos

同样打印出了Hello, hammer

总结

这一章我们学习了EOS智能合约在生成、部署以及调用的过程中涉及的相关概念和操作。了解了:

  • 什么是webAssembly:翻译C/C++让浏览器也看得懂的神器;
  • 什么是ABI:代码的“产品说明书”;
  • 如何生成和操作一个简单的智能合约
    • 生成wast和abi文件
    • 部署合约
    • push action调用合约方法

下面一章,我们依然会一边介绍智能合约的相关必备知识,一边带着大家来看一看简单的智能合约语法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1、玩过EOS的都知道EOS本身更新迭代非常之快,所以有些知识点可能与最新版有所出入,希望小伙伴理解!此文档适用于EOS-v1.0.5以上版本和v1.1.x版本,目前的v1.2.x可能会有极少部分出入,比如eosiocpp工具看更新说明再不用安装的状态下就能使用,目前还未测试。有兴趣的小伙伴可以留言交流。 2、当前文档目录结构介绍: #思考研究问题 1、如何保证EOS中发布的智能合约不被随意篡改? #玩转EOS智能合约代码 #玩转客户端cleos 1、先玩转与智能合约相关的操作 #使用eosiocpp工具编译智能合约生成abi文件和wast文件 #编译合约(无法通过) #安装build/programs下工具 #重新编译合约 #部署合约到账户 #购买RAM #测试调用部署的合约 #更新\升级已经部署过的智能合约(相对空的合约) #更新添加新的函数接口(action)合约 #有关require_auth的合约测试 2、玩转智能合约与数据库相关操作 #参考资料 #持久化API (Multi-Index) 1、一般来讲,对数据库的操作无外乎增删改查 2、表结构示例详解 3、Multi_index定义,建立数据表 4、实例化multi_index 5、操作数据,增删改查 #玩转table表 1、Table表producers 2、Table表global 3、Table表voters 4、Table表rammarket (获取RAM实时价格) 5、Table表refunds (查看账户退款信息) 6、Table表namebids (罗列参与竞拍的账户信息) 3、启动nodeos节点出现脏数据 4、查看账户抵押资产,抵押token,赎回token #查看账户余额(可用余额) #查看SYS货币信息,eosio.token是经营货币的合约 #查看公钥对应账户 #查看子账户(控制账户) #查看账户信息 #查看账户抵押信息 #钱不够那就转账,随便耍 #get transaction无结果了解一下 #卖出RAM(卖给系统账户eosio.ram),字节bytes #抵押token获取CPU和net资源 #赎回抵押token,默认三天后到账,执行后可查看账户状态
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值