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

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

123.png

在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的路上少踩一些坑。

知识星球二维码380.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 1 EOS智能合约的介绍1.1 所需背景知识1.2 EOS智能合约基础知识1.3 技术局限性 2 智能合约文件2....
    cenkai88阅读 30,509评论 5 28
  • 1. 账户与钱包1.1 创造并管理钱包1.2 生成EOS Keys并导入1.3 备份您的钱包1.4 创建账户 2....
    cenkai88阅读 3,953评论 1 7
  • 开发第一个 EOS 智能合约 Hello World! 稍微了解 EOS 系统,你就会知道 EOS 的智能合约基于...
    6bca7c813977阅读 561评论 0 0
  • 详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能...
    6bca7c813977阅读 451评论 0 1
  • 一: 最近初当小官,被称作学院里学生组织的“代表人物”,也是让一成不变的生活里多了些可以奔波的理由。说来可笑,我自...
    白色小龟阅读 260评论 0 0