action的结构

要说清楚这个方法的含义和用法,咱们需要从action的结构说起。详见eoslib.hpp中的action类,这里把它的结构简化表示成下面这样:

   *   struct action {
* account_name account; // the contract defining the primary code to execute for code/type
* action_name name; // the action to be taken
* permission_level[] authorization; // the accounts and permission levels provided
* bytes data; // opaque data processed by code
* };

一个action的数据包含:

account: action的处理器(handler)所在的合约账号
name: action的名字
authorization: 调用者提供的action的权限列表(可以是一组keys,也可以是一组别人的许可权限)
data: action的数据参数,如果是transfer action,这里的数据就是类似这样的内容:

{   "from": "inita",   "to": "initb",   "amount": "100.0000 EOS",   "memo": "1234"} 

你可能说,“不对,data明明是个byte数组,怎么能存储一个结构呢?”,这其实是数据序列化的结果,关于序列化和反序列化,如果你还不是很了解,可以从网上搜索一下相关知识。

require_auth

现在我们再说require_auth就比较容易了,先看签名:

  /**
* Verifies that @ref name exists in the set of provided auths on a action. Throws if not found.
*
* @brief Verify specified account exists in the set of provided auths
* @param name - name of the account to be verified
*/
void require_auth( account_name name );

英文好的看下注释,再结合action的结构就完全明白了:它校验通过name形参传进来的账户,看是否在本action已提供的权限列表中。如果在,则校验通过,否则,抛出异常。

比如如果执行下面的命令发起一个action:

cleos push action hello.code hi '["user"]' -p user@active

这里发起的这个hi action的结构就是类似这样的:

{  "account": "hello.code",  "name": "hi",  "authorization": [ {"account": "user", "permission":"active"} ],  "data": ["user"] }

所以如果在hi action的处理器里面调用require_auth(N(user))是可以通过检查的,因为userauthorization数组中;而require_auth(N(hello.code))就会检测失败,并抛出异常。

有时候,你可能就想看看某个账户是否在action的已提供权限列表里,并不想抛出异常,那该怎么办?

这个时候可以用has_auth方法:

 /**
* Verifies that @ref name has auth.
*
* @brief Verifies that @ref name has auth.
* @param name - name of the account to be verified
*/
bool has_auth( account_name name );

require_auth2

还有一个类似的require_auth2方法,它的签名是这样的:

/**
* Verifies that @ref name exists in the set of provided auths on a action. Throws if not found.
*
* @brief Verify specified account exists in the set of provided auths
* @param name - name of the account to be verified
* @param permission - permission level to be verified
*/
void require_auth2( account_name name, permission_name permission );

这个检查更为严格一点,除了指定账户,还要指定许可。这个许可是严格检查的,也就是说,假如你在代码里写的是:

require_auth(N(user), N(active));

那么下面的命令是通不过这个检查的:

cleos push action hello.code hi '["user"]' -p user@owner

尽管这里使用的是更高的权限user@owner,也无法通过检查。

EOS require_auth函数的更多相关文章

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

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

  2. EOS开发入门

    EOS开发入门   在上一篇文章<EOS开发环境搭建>中,我们已经完成了EOS开发环境的搭建,本次为大家带来的是EOS开发入门的相关内容. 1. EOS的合约开发基础   智能合约是一种旨 ...

  3. EOS踩坑记

    [EOS踩坑记] 1.每个account只能更新自己的contract,即使两个account的秘钥相同,也不允许. 如下,使用alice的权限来更新james的contract.会返回 Missin ...

  4. 【精】EOS智能合约:system系统合约源码分析

    系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.syst ...

  5. 【精解】EOS TPS 多维实测

    本文主要研究EOS的tps表现,会从插件.cleos.EOSBenchTool以及eosjs四种方式进行分析研究. 关键字:eos, tps, cleos, txn_test_gen_plugin, ...

  6. eos合约案例导读

    为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示 ...

  7. eos智能合约开发最佳实践

    安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 ...

  8. EOS 增发与生产者的奖励制度

    EOS每年增发1%的机制在系统合约中,其实说每年增发1%只是一年的总数,其实是只要在出块,EOS就在增发的路途中,下面分析一下增发的代码. 其实增发的1%的都是分给所有区块生产者的,只要出块了或者获得 ...

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

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

随机推荐

  1. 【RAC】rac环境下的数据库备份与还原

    [RAC]rac环境下的数据库备份与还原 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...

  2. VMware 设置虚拟机Centos 上网的两种方式

    能在VMware上面安装虚拟机,不可能说是不让链接外网,只是在自己电脑上玩玩就可以了.因为学习需要,经常在自己笔记本上面搭建虚拟机,我经常使用的两种上网方式 一 NET方式上网 设置VMware Ne ...

  3. Python,while循环小例子--猜拳游戏(三局二胜)

    Python,while循环小例子--猜拳游戏(三局二胜) import random all_choice = ['石头', '剪刀', '布'] prompt = '''(0)石头 (1)剪刀 ( ...

  4. LFS7.10——构建LFS系统

    参考:LFS7.10——准备Host系统 LFS7.10——构造临时Linux系统 本文正式开始构建LFS系统,后面所有命令的执行都是在root用户下完成的. 这时开始构建LFS前准备工作 更改$LF ...

  5. Environment类在代码中的使用

    string environmentVariable = Environment.GetEnvironmentVariable("TrustMerchantIniFile"); 可 ...

  6. 案例实战之如何写一个webpack loader

    通过以下几个实例掌握webpack loader的写法 1.写一个多语言替换的loader 在index.js在页面上插入了一个{{title}}文本,我们需要在打包的时候将其替换成对应的多语言 fu ...

  7. P5024 保卫王国[倍增+dp]

    窝当然不会ddp啦,要写这题当然是考虑优化裸dp啦,但是这题非常麻烦,于是变成了黑题. 首先,这个是没有上司的舞会模型,求图的带权最大独立集. 不考虑国王的限制条件,有 \[ dp[x][0]+=dp ...

  8. ARTS-week5

    Algorithm 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组.说明:初始化 nums1 和 nums2 的元素数量分别 ...

  9. navicat 远程连接服务器1130,1045问题报错处理

    本人踩坑多次,一开始网上搜罗,解决办法大同小异,摸索了很久才全部解决完成,小小bug真磨人啊 首先,根据我的踩坑记录,navicat 1045和navicat 1130貌似属于同一种解决方案,都是修改 ...

  10. C# 基础回顾: volatile 关键字

    有些人可能从来没看到过这个关键字,这也难怪,因为这个关键字并不常用.那这个关键字到底有什么用呢? 我在网上搜索这个关键字的时候,发现很多朋友都有一个错误的认识 ------ 认为这个关键字可以防止并发 ...