上一篇咱们介绍了如何搭建本地测试节点,它提供了一个智能合约的运行环境。咱们还介绍如何使用超级帐户eosio
来建立新帐户以及载入系统级别的智能合约。经过上一章的学习,你们可能已经对智能合约有了一个比较模糊的概念。这一章将继续为你们讲解,开发智能合约以前,你还须要知道的事。node
这一章,咱们将本身上手部署调用一个简单的智能合约hello
,中间会穿插讲解一些相关概念,这些概念虽然很基础,可是对初学者而言,也很重要。c++
以前若是你们简单地浏览过eos项目文件夹,就会看到不少.wasm
文件,而wasm就是WebASseMbly的缩写。这里让咱们略过Flash、JavaScript和WebAssembly的爱恨情仇(发展演化),直接一句话归纳一下:git
WebAssembly是一种新的编码方式,能够在现代的网络浏览器中运行。
想象它是一种能够把底层语言文件变得像JS那样,能够直接在浏览器中运行。并且比JS更轻量、更快速、更安全。过程以下图:程序员
还有一个你们在build
eos的过程当中看过一百遍的词:LLVM
。web
LLVM是一些分模块、可重用的编译工具链。它提供了一种代码编写良好的中间表示(IR)。它在上图中的位置大概是介于第一步和第二步之间。浏览器
若是想把C/C++变成WASM文件,就须要先把C/C++代码先变成LLVM中间代码。一旦变换成了LLVM IR以后,就说明LLVM已经理解了代码并会对代码自动地作出一些优化。安全
而WebAssembly也并非只有wasm
一种格式,它还有wast
格式。这二者做用是等价的,最大的区别就是wast
是可读文本格式的,而wast
是二进制格式的,他们能够经过工具相互转换。bash
让咱们高度总结一下WebAssembly:网络
可让浏览器识别底层语言的神器。
(笔者感受和以太坊中的编译器做用差很少)。函数
玩过以太坊的同窗可能对ABI并不陌生,在EOS中ABI的做用也和以太坊中大体相似:
它定义了函数被调用的规则;定义了参数在调用者和被调用者之间是如何传递的。
若是说wasm
文件是产品的话,要想顺利使用这件产品,你还须要一本操做说明书,而ABI
就是这份说明书。
一说入门就要说<hello world>,这种感受很low,同时也很“程序员”。感谢雷佳音让我找到了一个并不尴尬的小标题:土味hello。
进度保持在咱们上一章结束的地方:咱们已经学会使用操做eosio帐户、建立了新帐户testeosio
。
在正文开始以前,请启动nodeos
,相关钱包处于unlock状态。
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)
hello
合约这里咱们用到了一个小工具叫eosiocpp
。eosiocpp是一个c++生成wasm和ABI文件的工具。
eos项目中自带了一个hello合约,为了区分,这里咱们建立一个合约叫作hello1
。执行如下语句建立新合约:
eosiocpp -n hello1
它会以样例合约为基础建立一个最简单的合约。看到下图即表示建立成功:
这时在当前文件夹下就能够看到有一个hello1
的文件夹。
进入hello1
文件夹,能够看到里面有两个文件:
➜ hello1 git:(master) ✗ ls hello1.cpp hello1.hpp
hello1.hpp
是智能合约的头文件,能够包含一些变量,常量和函数的声明。hello1.cpp
是合约的源码文件,包含合约的具体实现。进入hello1
文件夹下执行如下命令:
#使用 -o 生成wast文件和wasm文件 eosiocpp -o ./hello1.wast ./hello1.cpp #使用 -g 生成abi文件 eosiocpp -g ./hello1.abi ./hello1.cpp
这时能够看到在当前文件夹下生成了hello1.wast
、hello1.wasm
和hello1.abi
文件。
使用咱们刚刚生成的文件部署智能合约。输入以下命令:
cleos set contract eosio ./ ./hello1.wast hello1.abi -p eosio@active
这行命令有五个参数:eosio
表示部署合约的帐户,./
表示合约所在的文件夹,后面两个参数依次是.wast
和.abi
文件的路径,最后的-p eosio@active
表示权限。
执行成功以下图所示:
在执行调用命令以前,咱们先简单地了解EOS中的一个概念:transaction
和action
。
Action表示单个操做,而transaction是一个或多个action的集合。Action是合约和帐户之间进行通讯的方式。Action能够单独执行,或者组合组合起来做为一个总体执行。
在官网中咱们也能够看到包含一个action和多个action的transaction的例子。
对比来看的话,EOS中的action就至关于以太坊中的transaction。
执行如下命令来调用hello1合约中的hi
方法:(执行的帐户是testeosio)
cleos push action eosio hi '["hammer"]' -p testeosio
执行成功就能够看到以下界面:
这时若是咱们去看运行nodeos
的终端窗口,能够看到下面的提示:
一样打印出了Hello, hammer
。
这一章咱们学习了EOS智能合约在生成、部署以及调用的过程当中涉及的相关概念和操做。了解了:
如何生成和操做一个简单的智能合约
下面一章,咱们依然会一边介绍智能合约的相关必备知识,一边带着你们来看一看简单的智能合约语法。