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

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

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

image

在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
欢迎添加微信(id:pdj107)

转载于:https://www.cnblogs.com/tokenpai/p/9175959.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101611.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sm羞耻任务_羞耻驱动的发展

    sm羞耻任务_羞耻驱动的发展sm羞耻任务我一直渴望写出精巧的代码。在完成所有生产代码配对的日常工作中,我认为我们的质量很高。但是令人惊讶的是,当您独自编码时,您多么容易原谅自己并陷入不良习惯。配对时羞耻是品质背后的动力吗?我们有许多使用EasyMock编写的古老的单元测试;我们所有最近的单元测试都使用JMock。这笔小小的技术债务意味着,如果您要更改仅适用于EasyMock测试的代码,则首先必须决…

    2025年11月27日
    3
  • Windows如何彻底卸载JDK

    Windows如何彻底卸载JDK很简单不需要动什么注册表打开windows找到控制面板–点击卸载程序简单粗暴,亲测有效!

    2022年6月25日
    33
  • 语义分割的评价指标_语义分割数据集

    语义分割的评价指标_语义分割数据集包括:像素准确率、类别像素准确率、类别平均像素准确率、交并比、平均交并比、频权交并比。

    2022年8月21日
    12
  • MATLAB画折线图时自定义颜色

    MATLAB画折线图时自定义颜色有很多种数据的时候,MATLAB提供的颜色不够用,这里有一个可以自定义线条颜色并配置不同图例的MATLAB示例clear;clc;closeall;x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];y1=rand(1,21);y2=rand(1,21);y3=rand(1,21);y4=rand(1,21);y5=rand(1,21);y6=rand(1,21);y7=

    2022年6月8日
    159
  • python微信机器人制作教程+源码[通俗易懂]

    python微信机器人制作教程+源码[通俗易懂]python微信机器人,定时机器人,监控机器人。

    2022年8月23日
    7
  • tasker 短信转邮件_ifttt转发短信到邮箱

    tasker 短信转邮件_ifttt转发短信到邮箱1.环境及工具测试手机华为P9:EMUI8(Android8)Tasker版本:5.12.21下载地址:https://tasker.joaoapps.com/download.htmlSendSilentMail插件版本:4.52下载地址:https://m.allfreeapk.com/locale-sendsilentmail-plug-in,313058/QQ邮箱2个:一个发邮件,一个收邮件2…

    2022年10月13日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号