EOS智能合约开发

作者: 糖果果老师 | 来源:发表于2018-05-18 03:59 被阅读75次

    本文来自 EOS Asia 区块链开发工程师 Tyler Diaz,英文地址:

    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 的智能合约由 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链建好开始运行,准备工作就完毕了。整个教程中,我们会多次用到一些工具比如 cleos 和 eosiccpp。你可以在 eos/programs 文件夹下面找到他们。

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

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

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

    实现 ping

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

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

    #include

    #include

    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

    笔记来源:https://bihu.com/article/282162

    相关文章

      网友评论

      • IT人故事会:老铁,经常看别人的分享.感谢别人的分享,感谢!关注了

      本文标题:EOS智能合约开发

      本文链接:https://www.haomeiwen.com/subject/opdwdftx.html