EOS智能合约授权限制和数据存储

在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作。当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制。接下来我们就来看看如何限制合约的授权账户。

合约案例

为了更好的演示,写了一个下课和吃饭的智能合约小例子。这个合约有两个动作,下课和吃饭。教师账户可以调用下课动作,学生账户可以调用吃饭动作。教师调用下课动作后,学生才能调用吃饭动作。接下来我们来看代码:

teacher.hpp

头文件teacher.hpp定义了两个动作,over是class over 下课动作,eat是吃饭动作。

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp> using namespace eosio; class teacher_stu : public eosio::contract{ using contract::contract;
public:
teacher_stu( account_name self ) :
contract( self ) {} void over(account_name teacher); void eat(account_name student); private:
static uint64_t id; // @abi table
struct mshare {
uint64_t id;
uint64_t start = 0; uint64_t primary_key() const { return id; }
}; typedef multi_index<N(mshare), mshare> mshares; }; EOSIO_ABI( teacher_stu, (over)(eat))

teacher.cpp

teacher.cpp中主要是over和eat动作的实现。

#include "teacher.hpp"

uint64_t teacher_stu::id = 1;
uint64_t start = 0; void teacher_stu::over(account_name teacher) {
require_auth(teacher);
print("teache:Class over!"); mshares mshare_table(_self, _self); start = 1;//存储动作调用状态
mshare_table.emplace( teacher, [&]( auto& mshare ) {
mshare.id = id;
mshare.start = start;
});
} void teacher_stu::eat(account_name student) {
require_auth(student);
mshares mshare_table(_self, _self);
auto it = mshare_table.find( id );
if (it->start == 1) {
print("student:Class over, go to eat!");
mshare_table.erase( it );
}
else
print("teacher:Class time, you can't eat");
}

仔细观察这段代码就会发现,over和eat动作中都有个"require_auth()"语句。在over动作中,"requir_auth(teacher)"的作用是限制只有"teacher"账户才可以调用over动作。在eat动作中则是限制只有"student"账户才可调用eat动作。

合约数据存储

此合约设计为下课后才可以吃饭,所以当教师账户调用合约的over动作后,需要存储一个合约调用状态值。EOS合约的数据存储需要用数据库,把数据存到一张表中,这是令人很难受的。

teacher.hpp

在teacher.hpp中创建一个结构体。下段代码中的"//@abi table"注释非常重要,必须要写的,如果不写数据将无法存储。

    static uint64_t id;

    // @abi table
struct mshare {
uint64_t id;
uint64_t start = 0; uint64_t primary_key() const { return id; }
}; typedef multi_index<N(mshare), mshare> mshares;

DAWN 3.0 使用eosio::multi_index作为容器,我们可以使用emplace来插入数据,使用modify来修改数据,使用erase删除数据。

teacher.cpp

  mshares mshare_table(_self, _self);

  start = 1;
mshare_table.emplace( teacher, [&]( auto& mshare ) {
mshare.id = id;
mshare.start = start;
});

在over动作中创建数据,学生调用eat动作后再修改或删除数据即可

  mshares mshare_table(_self, _self);
auto it = mshare_table.find( id );
if (it->start == 1) {
print("student:Class over, go to eat!");
mshare_table.erase( it );
}

合约调用效果展示

  • 授权限制
$ cleos push action class over '{"teacher":"teacher","student":"student"}' -p student
Error 3030001: missing required authority
Ensure that you have the related authority inside your transaction!;
If you are currently using 'cleos push action' command, try to add the relevant authority using -p option.
Error Details:
missing authority of teacher
  • 学生没下课就吃饭
$ cleos push action class eat '{"teacher":"teacher","student":"student"}' -p student
executed transaction: 02918b223230cb9ea1fd383e0499ea22d22ced8f2108db3233bdfd51c06f3b37 232 bytes 102400 cycles
# class <= class::eat {"student":"student"}
>> teacher:Class time, you can't eat
  • 正常下课吃饭
$ cleos push action class over '{"teacher":"teacher","student":"student"}' -p teacher
executed transaction: a96520fa28c8412e0998080126734337507811638ecf6b939e904818a4892e35 232 bytes 103424 cycles
# class <= class::over {"teacher":"teacher"}
>> teache:Class over!
$ cleos push action class eat '{"teacher":"teacher","student":"student"}' -p student
executed transaction: 2955a693b626c539d20da9d4f5d41a6b53bb8ca2b2651b63cf4a67012fb3dd7e 232 bytes 103424 cycles
# class <= class::eat {"student":"student"}
>> student:Class over, go to eat!
  • 查看表中数据
$ cleos get table class class mshare
{
"rows": [{
"id": 1,
"start": 1
}
],
"more": false
}

整个合约写下来调通也是费了我很多脑细胞,数据存储也比较坑爹啊。现在把我的一点经验分享出来,希望大家在学习EOS的路上少踩一些坑。



欢迎添加微信(id:pdj107)

EOS智能合约授权限制和数据存储的更多相关文章

  1. EOS智能合约存储实例讲解

    EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...

  2. 【精解】EOS智能合约演练

    EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...

  3. eos 智能合约开发体验

    eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...

  4. EOS 智能合约编写(一)

    本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu      EOS版本:v1.1.1 一.智能合约代码 ...

  5. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  6. EOS智能合约开发(三):EOS创建和管理账号

    没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...

  7. EOS智能合约开发(二):EOS创建和管理钱包

    上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...

  8. eos智能合约与主进程交互

    eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...

  9. eos智能合约执行流程

    eos智能合约执行 1. 执行流程 controller::push_transaction()  // 事务 -> transaction_context::exec()  // 事务 -&g ...

随机推荐

  1. 为什么阿里巴巴禁止开发人员使用isSuccess作为变量名

    答曰,是为了防止用加了is前缀命名的变量造成序列化与反序列不一致的问题

  2. 03_SQL server数据类型

    SQL server数据类型 String类型: 数据类型: 描述 存储 char(n) 固定长度的字符串.最多 8,000 个字符.定义类型为char(5),那么就表示该类型可以存储5个字符,即使存 ...

  3. MariaDB/MySQL备份和恢复(二):数据导入、导出

    MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 1.导出.导入数据 ...

  4. Perl检查引用类型

    有时候可能会需要检查引用是什么类型的,免得我们期待是一个数组引用,却给了一个hash引用. ref函数可以用来检查引用的类型,并返回类型.perl中内置了如下几种引用类型,如果检查的不是引用,则返回u ...

  5. pxe+kickstart自动化批量安装系统详解-技术流ken

    前言 pxe+kickstart是一款可以实现自动化批量安装系统的服务,比较经典,下面将详细介绍此服务的安装和使用. 系统环境准备 系统版本:CentOS release 6.7 (Final) 内网 ...

  6. @Html.Partial 和 @Html.RenderPartial 异同

    相同点:这两个的性质都是一样, 作用都是将View给镶入进来 不同点: Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后 ...

  7. 部署WebService

    IIS6环境下部署WebService(部署虚拟目录) 首先,打开IIS管理器, 部署一个网站或者使用默认网站 右击网站选择新建虚拟目录 输入WebService的别名 选择WebService文件路 ...

  8. 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)

    使用NetDrive映射到本地磁盘 使用NetDrive软件来替代FileZilla,NetDrive是一个能把FTP空间虚拟成本地硬盘的软件,这样我们就不需要再使用FileZilla来来回拷贝文件了 ...

  9. Linux-bg和fg命令(19)

    使用ctrl+z将程序挂在后台: jobs 查看后台的命令: fg(fore go) 将后台的命令,放置前台(fore)继续执行,比如:fg 2     //等价于vi 2.txt bg(back g ...

  10. Stackoverflow每日问题 系列前言

    都是程序员,想必都对stackoverflow有一定的了解,这个网站是世界上最为活跃的编程知识的论坛网站,上面活跃着数以万计的大神.提问各种有意义有价值的问题,还有这些问题的详细的回答. 但是毕竟是国 ...