EOS智能合约系列教程第一篇

随着六月份临近,万众瞩目的EOS主网上线在即。关注DappReview的读者应该对于以太坊上的性能限制和可扩展性问题并不陌生,即便围绕着以太坊有侧链和状态通道等一系列在进行中的扩展方案,但开发者们对于EOS的高TPS和无交易费的特性早就已经按耐不住了

DappReview在最近开始了对于EOS开发的关注(并打算在dapp.review上推出EOS DApp排行),除了EOS官方在快速更新的wiki之外,现在还并没有太多从0到1的基础教程。像在以太坊上,这篇文章《Loom僵尸大军、Hackers午后读物,只用48小时DApp你也能写》中的两个教程走过一遍就可以轻松的上手智能合约和DApp开发了。

直到昨天,看到EOS Asia写的《EOS智能合约系列教程第一篇》,非常兴奋。感觉是第一份让开发者快速上手的开发指南,跟EOS Asia团队接触了一下,对他们以“落地高质量DApp”作为目标和核心竞争力超级赞同。下面咱们来一起打开EOS的大门吧!

EOS智能合约开发(第一节)

准备发车

本文已经过EOS Asia授权翻译

原文地址:

https://steemit.com/devs/@eos-asia/eos-smart-contracts-part-1-getting-started-ping-equivalent-in-eos?from=groupmessage&isappinstalled=0

本篇是EOS智能合约系列第一弹,该系列教程旨在帮助开发者从0到1学会如何在EOS生态下开发智能合约。如果有任何希望深入探讨的主题,欢迎留言给我们!本教程所有代码在这里:https://github.com/tylerdiaz/ping-eos 。话不多说,进入主题。 

虽然EOS的热度越来越高,但对于开发者来说,如果想参与其中,入门在EOS之上开发智能合约仍是一项挑战。目前主要有两个难关需要开发者克服:把工具和环境配置好,以及学会如何写智能合约本身。 

EOS智能合约系列教程第一篇

EOS的智能合约由 C++ 编写,并编译成Web Assembly。Dan Larimer之所以选择C++是因为它的模板系统能保证合约更加安全,同时运行速度更快,大部分内存上顾忌也不用担心。 

初始设置

在EOS上开发的挑战之一是设置好用来开发的本地私链。幸好EOS官方提供了一些基础设施和指导[来帮助你设置本地的EOS环境]。地址如下:

https://github.com/EOSIO/eos/wiki/Local-Environment#getting-the-code

本次教程中,我们将使用 EOSIO Dawn 3.0.

这一步的教程可以浓缩成以下几行关键命令:

$ git clone https://github.com/EOSIO/eos —recursive $ cd eos $ ./eosio_build.sh $ cd build && make install $ cd programs/nodeos $ ./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin --access-control-allow-origin=*
EOS智能合约系列教程第一篇

安装会花不少时间,但比较简单直接。一旦本地的EOS链建好开始运行,准备工作就完毕了。整个教程中,我们会多次用到一些工具比如 cleos 和 eosiccpp。你可以在 eos/programs 文件夹下面找到他们。

创建一个智能合约实例: ping

下面我们将创建并且部署一个分布式系统下的“Hello World”程序:ping/pong。这个简单的实例是指,发送给服务器一个“ping”指令,它将会回复“pong”。

一个智能合约有以下几部分组成:C++代码,一个ABI(Application Binary Interface - 应用二进制接口),和一个基于C++代码的WAST(Web Assembly文本文件)。整个逻辑是这样:

EOS智能合约系列教程第一篇

实现ping

搞定开发环境之后,开始来研究合约吧!写ping这个智能合约,我们只需要合约完成一个动作:就是“ping”。作为反馈,这个函数要做的事情也很简单:打印“Pong”。

在文件夹 contracts 下面建立一个 ping 文件夹,并创建文件 ping/ping.cpp

#include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> class ping_contract : public eosio::contract {     public:         using eosio::contract::contract;         void ping(account_name receiver) {             eosio::print("Pong");         } }; EOSIO_ABI( ping_contract, (ping) )

这个简短的例子目的是让你能测试一下并且熟悉各个组件。咱们来把代码拆解一下看看每一步在干什么:

1. 在合约里,我们include了两个头文件。

2.我们创建了一个新的合约类 ping_contract,它继承了eos::contract这个类。

3. 我们创建了一个可以打印“Pong”的函数

4. 最后一行代码是最近才添加的宏,它能根据我们传入的参数自动生成ABI,而不用我们再费工夫去自己写了。

生成你的合约

当执行智能合约的时候,EOS区块生产者运行的并不是C++代码,而是Web Assembly。EOS提供了一个叫eosiocpp的工具,能把C++代码转换成Web Assembly文本。现在咱们就来试试 eosiocpp -o ping.wast ping.cpp 。编译的过程中会出现一些警告,暂时先忽略它们。 

下一步,我们需要ABI。本质上来说,智能合约的ABI描述了合约中的函数以及他们对应的签名。只要我们在文件末尾加入了 EOSIO_ABI这个宏,就可以轻松地用命令生成ABI:eosiocpp -g ping.abi ping.cpp

目前为止,你的文件夹应该长这个样子:

├── ping.abi ├── ping.cpp └── ping.wast

部署到本地网络

万事俱备,可以开始部署啦。首先用命令 cleos wallet create 创建一个钱包,并运行 cleos wallet unlock 将其解锁(可能要输入密码)。我们将在另一个账户下面部署智能合约。(钱包创建时本身会带有一个账户)

运行 cleos create key 创建一个新的密钥对。这会给你生成一对随机的公钥和私钥,先把他们保存好。在本文下面的部分中,要把出现 [public_key]/[private_key]提示的部分换成你刚刚保存好的公钥或者私钥。

用 cleos wallet import [private_key] 把刚刚获取到的私钥导入到之前解锁的钱包中。

用获取到的公钥给合约设置账户 cleos create account eosio ping.ctr [owner_key: public_key] [active_key: public_key]

将合约链接到新创建的账户:cleos set contract ping.ctr ../ping -p ping.ctr

与ping进行交互

一旦合约部署了,就可以与它互动啦!咱们用同样的密钥来创建一个测试账户:cleos create account eosio tester [public_key] [public_key]

现在来在命令行中测试一笔交易:

$ cleos push action ping.ctr ping '["tester"]' -p tester executed transaction: e89ebeaad8f3623e42d966f62d4d0adbf6a7412b6bb4d7be61f04a22d3cd485e 232 bytes 102400 cycles # ping.ctr <= ping.ctr::ping {"account":"tester”} >> Received ping

成功啦!

对开发者来说这非常值得兴奋,但对普通用户而言他们不可能配置好命令行来跟智能合约交互的。所以下面让我们把这个交互放在一个用户熟悉的界面里:也就是他们的浏览器中。

通过浏览器交互

从前端与EOS交互,我们使用EOS.js。因为后端我们用的Dawn3,所以要确保eosjs也安装的是dawn3的分支。安装命令:npm install eosjs@dawn3

开始配置:

Eos = require('eosjs’) eos = EOS.Localnet({     keyProvider: ['{replace_with_your_private_key}'],     httpEndpoint: 'http://127.0.0.1:8888’ })

配置完之后,我们要明确一些细节:

eos.contract('ping.ctr').then((contract) => {     contract.ping("tester", { authorization: ['tester'] }).then((res) => {     console.log(res) }) })

这里注意到 ping.ctr , 与我们先前部署的合约名字相符。一旦拿到合约的ABI我们就能像原生Javascript一样与他交互。合约返回一个promise对象,在resolve函数中包含了交易的细节。这其实就是从前端与智能合约交互的核心机制。

关于前端部分,完整的代码示例可以在这个仓库中查看:

https://github.com/tylerdiaz/ping-eos/tree/master/frontend

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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,默认三天后到账,执行后可查看账户状态

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值