EOSIO开发(二)运行合约样例

本文将介绍如何使用EOSIO自带的合约"Currency",实现创建钱包-创建账户-执行合约 的完整流程

前言

前一篇文章介绍了如何使用Docker搭建并运行EOSIO本地节点,本文将继续介绍如何在Docker环境下,使用系统自带的合约"Currency",实现 创建钱包 - 创建账户 - 执行合约 的完整流程。

在学习文章内容之前,建议先了解EOS中Account、Permission、Active以及Action的基本概念,文末有相关的参考资料。

由于本文是在Docker环境下开发,因此部分命令与官方文档不一致(主要是文件目录地址),但是执行步骤是一致的,使用本地环境的同学可以参考官方文档的命令。

执行步骤

  • 启动nodeos节点
  • 创建钱包
  • 加载Bios合约
  • 创建currency账户
  • 上传currency账户到区块链
  • 执行智能合约

启动nodeos节点

下载eosio/eos镜像

docker pull eosio/eos

启动nodeos节点

docker run --name nodeos -p 8888:8888 -p 9876:9876 -t eosio/eos /opt/eosio/bin/nodeosd.sh arg1 arg2

进入nodeos节点调试界面,后续的命令都在该界面中执行。

docker exec -it nodeos /bin/bash

创建钱包

通过cleos wallet create命令创建钱包。

cleos wallet create

创建成功后,会生成一个随机密码。
20180413004

加载Bios合约

将Bios合约关联到eosio账户上,它将使eosio账户获得超级管理员权限,能够直接操控其它账户的资源以及执行特殊API。

cleos set contract eosio ../contracts/eosio.bios -p 

创建currency账户

为账户创建OwnerKey和ActiveKey,注意 create key 命令需要执行两次。

cleos create key # OwnerKey
cleos create key # ActiveKey

这两次命令将生成两组private key和public key,分别对应OwnerKey和ActiveKey。

OwnerKey
20180413005

ActiveKey
20180413006

分别将两组private key导入钱包

cleos wallet import <private-OwnerKey>
cleos wallet import <private-ActiveKey>

20180413007

通过 cleos create account 命令创建 currency 账户,并由eosio 账户为其授权。

cleos create account eosio currency \<public-OwnerKey> \<public-ActiveKey> 

20180413008

验证currency账户是否创建成功。

cleos get account currency

看到下面的账户信息,则说明创建成功。
20180413009

上传currency账户到区块链

上传之前,验证区块链中是否已经存在currency账户

cleos get code currency

如果返回hash code都为0,则说明账户不存在

![屏幕快照 2018-04-14 上午11.00.47](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.00.47.png)

上传currency账户

cleos set contract currency contracts/currency

![屏幕快照 2018-04-14 上午11.01.16](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.01.16.png)

再次验证currency账户是否已经存在

cleos get code currency

hash code不为0,上传成功。
![屏幕快照 2018-04-14 上午11.01.24](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.01.24.png)

执行currency合约的create action与issue action,

cleos push action currency create '{"issuer":"currency","maximum_supply":"1000000.0000 CUR","can_freeze":"0","can_recall":"0","can_whitelist":"0"}' --permission currency@active
cleos push action currency issue '{"to":"currency","quantity":"1000.0000 CUR","memo":""}' --permission currency@active

执行完毕后,验证currency账户中的余额(balance)是否已经正确初始化。

cleos get table currency currency accounts

可以看到balance的值为1000.0000 CUR,初始化成功。
![屏幕快照 2018-04-14 上午11.03.12](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.03.12.png)

执行智能合约

现在我们通过智能合约来执行一次转账操作,从currency账户转账20.0000 CUR到eosio账户。

转账之前看看两个账户的余额。

cleos get table currency currency accounts
cleos get table currency eosio accounts

currency账户的余额(balance)为1000.0000 CUR,而eosio账户没有余额。
![屏幕快照 2018-04-14 上午11.06.34](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.06.34.png)

开始转账。

cleos push action currency transfer '{"from":"currency","to":"eosio","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active

转账完成后,再次查询余额,currency账户是980,eosio账户则是20,转账成功。

![屏幕快照 2018-04-14 上午11.08.07](https://wangtao-1256981172.cos.ap-guangzhou.myqcloud.com/屏幕快照 2018-04-14 上午11.08.07.png)

至此,整个流程结束。

小结

通过官方提供的currency合约,我们体验了 创建钱包 - 创建账户 - 执行合约 的整个流程,这样可以让大家对EOS合约的执行步骤有一个初步印象。

至于在执行过程当中,涉及到一些更细节的问题,比如何编写智能合约,cleos命令的具体语法以及作用,如果暂时不明白也没有关系,后续的文章我们再一步步的深入学习。

系列文章

EOSIO开发(一)使用Docker构建本地环境

EOSIO开发(二)运行合约样例

EOSIO开发(三)钱包、账户与账户权限之概念篇

EOSIO开发(四)- nodeos、keosd与cleos

EOSIO开发(五)- 钱包之实战篇

EOSIO开发(六)- 账户之实战篇

EOSIO开发(七)- 使用CLion查看EOS代码

EOSIO开发(八)- 智能合约基础概念

参考资料

EOS WIKI-Local-Environment

Accounts & Permissions

深入理解 EOS 账户权限映射

博文地址

https://www.taowong.com/blog/2018/06/27/eos-develop-2.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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,默认三天后到账,执行后可查看账户状态
好的,ECO是一种用于编写智能合约的编程语言,它是基于C++语言开发的。因此,你可以使用C++编写ECO智能合约代码,并使用ECO编译器将其编译为字节码,然后在ECO虚拟机上运行。 以下是一个简单的ECO智能合约代码示,它实现了一个简单的转账功能: ``` #include <eco.hpp> using namespace eco; class transfer_contract : public contract { public: transfer_contract(account_name self) : contract(self) {} void transfer(account_name from, account_name to, uint64_t amount) { require_auth(from); auto from_balance = get_balance(from); eosio_assert(from_balance >= amount, "Insufficient balance"); sub_balance(from, amount); add_balance(to, amount); } private: void sub_balance(account_name owner, uint64_t value) { auto balance = get_balance(owner); eosio_assert(balance >= value, "Insufficient balance"); balance -= value; set_balance(owner, balance); } void add_balance(account_name owner, uint64_t value) { auto balance = get_balance(owner); balance += value; set_balance(owner, balance); } uint64_t get_balance(account_name owner) { accounts accountstable(_self, owner); auto it = accountstable.find(symbol_code("ECO").raw()); return it != accountstable.end() ? it->balance : 0; } void set_balance(account_name owner, uint64_t value) { accounts accountstable(_self, owner); auto it = accountstable.find(symbol_code("ECO").raw()); if (it == accountstable.end()) { accountstable.emplace(_self, [&](auto& a) { a.balance.symbol = symbol("ECO", 4); a.balance.amount = value; a.owner = owner; }); } else { accountstable.modify(it, _self, [&](auto& a) { a.balance.amount = value; }); } } struct [[eosio::table]] account { asset balance; account_name owner; uint64_t primary_key() const { return balance.symbol.code().raw(); } }; typedef eosio::multi_index<"accounts"_n, account> accounts; }; extern "C" { void apply(uint64_t receiver, uint64_t code, uint64_t action) { if (code == receiver) { switch (action) { EOSIO_DISPATCH_HELPER(transfer_contract, (transfer)) } } } } ``` 在这个示中,我们定义了一个名为`transfer_contract`的智能合约类,它继承自`contract`类。`transfer_contract`类中定义了一个名为`transfer`的公共函数,用于实现转账功能。该函数接受三个参数:转账发起人的账户名、接收方的账户名和转账金额。 在`transfer`函数中,我们首先使用`require_auth`函数验证转账发起人的身份。然后,我们检查发起人的余额是否足够支付转账金额,如果不足,则抛出异常。接着,我们从发起人的余额中减去转账金额,并将相应的金额添加到接收方的余额中。 `transfer_contract`类中还定义了一些私有函数,用于获取、设置账户余额等操作。此外,我们还定义了一个名为`account`的结构体,用于存储账户余额信息。最后,我们使用`EOSIO_DISPATCH_HELPER`宏将`transfer_contract`类中的`transfer`函数注册为智能合约的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值