EOS系列 - WASM智能合约 - 特性

article/2025/9/13 6:32:05

构造函数

addressbook(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds) {}#单例表(code和scope都用receiver的表)也可在初始化列表中实例化
singleton_example( name receiver, name code, datastream<const char*> ds ) :contract(receiver, code, ds),singleton_instance(receiver, receiver.value){}

内置函数

  • 权限检测函数
    • require_auth(name) : 必须具有某权限, 没有就不会往下执行
    • require_auth2(user.value, "active"_n.value): 指定必须某账户的某种权限
    • has_auth(name) : 判断是否具有某权限, 返回 true | false . eosio::check(eosio::has_auth(...), ...)
  • get_self: 获取合约名称, 合约部署者
  • get_code | get_first_receiver(): 部署此合约的帐户名称
  • require_recipient(name): 发出通知, 将action复制到发件人
    • 调用require_recipient将一个帐户添加到 require_recipient 集合并确保这些帐户收到正在执行的action的通知
  • check( is_account( oracleClient ), "Must have a valid oracleClient" ): 断言
  • is_account(name) 账号是否存在

EOSIO 名称类

  • 适用于所有 EOSIO 编码的名称(帐户、操作、表等)
  • uint64_t在区块链上编码为 64 位无符号整数 ( )。
  • 前 12 个字符(如果有)base32使用以下字符编码:., 1-5,a-z
  • 第 13 个字符(如果适用)base16使用以下字符编码:., 1-5,a-j

例子:

auto eosio_user = eosio::name{user};  //encodes user string to eosio::name object
auto user_str = user_name_obj.to_string(); //decodes eosio::name obj to string
auto standard_account = "standardname"_n;  //encodes literal string to eosio::name
auto non_standard_account = ".standard"_n; //encodes literal string to eosio::name

内联操作

内联操作在调用者操作的相同范围和权限内工作, 内联操作保证在同一个事务中执行

eosio.code 权限

eosio.code权限是一种伪权限,用于增强安全性,并使合约能够执行内联action。

例如: 为了从 addressbook发送内联action,请将eosio.code权限添加到合约帐户addressbook的active权限中, 否则会报错 Authorization failure with inline action sent to self

#加权限
cleos set account permission addressbook active --add-code#删权限
cleos set account permission addressbook active --remove-code

内联action-本合约内

需要 eosio.code

action(//permission_level,		一个权限级别结构(需要将`eosio.code`权限添加到合约帐户的active权限中)//code,					要调用的合约,部署合约的帐户(使用eosio::name类型初始化)//action,				action(使用eosio::name类型初始化)//data					传递给action的数据,与被调用的action相关的位置元组。
).send();action(permission_level{get_self(),"active"_n},get_self(),"notify"_n,std::make_tuple(user, name{user}.to_string() + message)
).send();

可通过 ./cleos get actions addressbook 命令查看

内联action-外部合约

使用 action_wrapper , 需要 eosio.code

#A合约内声明
[[eosio::action]] void count(name user, std::string type){//可在此限定只有哪个账户/合约才能授权该命令require_auth(name("addressbook")); //只有addressbook合约才能成功执行此操作...
}
using count_action = action_wrapper<"count"_n, &abcounter::count>;#B合约内调用A合约
abcounter::count_action count("abcounter"_n, {get_self(), "active"_n});
count.send(user, type);

可通过 cleos get table abcounter abcounter counts --lower alice --limit 1 查看统计结果

创建自定义权限

介绍权限

image-20210610124330588
/*The authority JSON object*/
{"threshold"       : 100,    /*An integer that defines cumulative signature weight required for authorization*/"keys"            : [],     /*An array made up of individual permissions defined with an EOS PUBLIC KEY*/"accounts"        : []      /*An array made up of individual permissions defined with an EOS ACCOUNT*/
}/*Set Permission with Key*/
{"permission" : {"key"           : "EOS8X7Mp7apQWtL6T2sfSZzBcQNUqZB7tARFEm9gA9Tn9nbMdsvBB","permission"    : "active"},weight            : 25      /*Set the weight of a signature from this permission*/
}/*Set Permission with Account*/
{"permission" : {"account"       : "sandwich","permission"    : "active"},weight            : 75      /*Set the weight of a signature from this permission*/
}//例如
'{"threshold":1,"keys":[{"key":"EOS8X7Mp7apQWtL6T2sfSZzBcQNUqZB7tARFEm9gA9Tn9nbMdsvBB","weight":1}],"accounts":[{"permission":{"actor":"acc2","permission":"active"},"weight":50}]}'

给账户添加自定义权限

./cleos set account permission alice upsert '{"threshold":1,"keys":[{"key":"EOS63gKbqNRZjboQyfXBJPijZHNr1GtXJu5eCan3e6iSqN7yP5nFZ","weight":1}],"accounts":[]}' owner -p alice@owner

将操作action的权限链接到自定义的权限

将调用upsert操作的授权与新创建的upsert权限关联起来:

cleos set action permission alice addressbook upsert upsert

on_notify 属性

on_notify当且仅当从指定的合约和指定的动作发送通知时,使用属性注释action可确保任何传入通知被转发到带注释的action。

callback类回调回调函数可以采用这种方法

[[eosio::on_notify("VALID_EOSIO_ACCOUNT_NAME::VALID_EOSIO_ACTION_NAME")]]//例如
[[eosio::on_notify("eosio.token::transfer")]][[eosio::on_notify("eosio.token::transfer")]]
void on_token_transfer(name from, name to, assert quantity, std::string memo) {// do something on eosio.token contract's transfer action from any account to the account where the contract is deployed.
}[[eosio::on_notify("*::transfer")]]
void on_any_transfer(name from, name to, assert quantity, std::string memo) {// do something on any contract's transfer action from any account to the account where the contract is deployed.
}

测试

#转账时会触发
./cleos transfer han hodl '0.0001 SYS' 'Hodl!' -p han@active#触发后查看表中数据
./cleos get table hodl han balance

单例表 eosio::singleton

eosio::singletoncode和scope都用receiver的单例表, 底层还是 eosio::multi_index

#声明
using singleton_type = eosio::singleton<"testtable"_n, testtable>;
singleton_type singleton_instance;#在合约的构造函数初始化列表中进行初始化
singleton_example( name receiver, name code, datastream<const char*> ds ) :contract(receiver, code, ds),singleton_instance(receiver, receiver.value)  // (code, scope){}#用法
singleton_instance.get_or_create(name, def) //获取存储在单例表中的值。如果它不存在,它将使用指定的默认值创建一个新的
singleton_instance.set(value, name)			//为单例表设置新值 (name:为存储的新值支付的帐户)
singleton_instance.exists					//检查单例表是否存在
singleton_instance.get						//获取存储在单例表中的值。如果不存在则抛出异常

笔记

  • RAM 是 EOSIO 区块链上的持久系统资源,不属于 Staking 机制的范围。

  • 选择不使用 DPoS,则不需要系统资源

  • 智能合约

    • 可以在基于 EOSIO 的区块链上部署无法修改的智能合约
    • 表中有数据时不能修改其数据结构。如果您需要以任何方式更改表的数据结构,首先需要删除其所有行
    • EOSIO 能够按多达 16 个索引对表进行排序, 二级索引需要是数字字段
    • 可以在B合约内读取A合约内的表内容
      • producers_table ptable("eosio"_n, name("eosio").value);
  • 创建和链接自定义权限

    • 创建自定义权限时,该权限将始终在父权限下创建。
  • cleos

    • 使用-d -j指示“不广播”和“将交易作为 json 返回”的选项
      • cleos push action eosio.token issue '["alice", "100.0000 SYS", "memo"]' -p alice@active -d -j
    • 查看token信息
      • ./cleos get currency balance eosio.token bob SYS
      • ./cleos get currency stats eosio.token SYS

http://chatgpt.dhexx.cn/article/YABQMWbs.shtml

相关文章

EOS智能合约开发(十五)EOS 状态机架构解析

好久没有写文章了&#xff0c;最近公司事情比较忙。非常感谢上次杭州团队一位负责EOS状态机的同事精彩分享。今天查阅很多资料后&#xff0c;整理这篇文章&#xff0c;希望对大家有所帮助。 EOS状态机是什么&#xff1f; 简单讲就是数据库&#xff0c;是EOS记录智能合约执行结…

接口测试时,输入所有参数的参数值后,接口返回“参数错误:所有参数都不能为空”

问题原因&#xff1a; 参数名称输入有误&#xff0c;前台&#xff08;pwd&#xff09;和后台&#xff08;password&#xff09;的参数名称不一致 &#xff0c;保持一致后即可

matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。

matlab打开后提示&#xff1a; 错误使用 connector.internal.autostart.run输入参数的数目不足 原因&#xff1a;自己写的一个函数和matlab自带的函数重名了 参考&#xff1a;警告: 在 matlabrc 中初始化 Java 首选项失败 – MATLAB中文论坛MATLAB中文论坛MATLAB 基础讨论板块…

Matlab 自带遗传算法函数 ga() 运行报错:“ fitnessfcn() 输入参数的数目不足。”

原始程序 %主程序 m [1 2]; R [1.5 1]; epsilon [2^R(1)-1 2^R(2) - 1]; A [-1 epsilon(1); 0 -1]; b [0 0]; Aeq [1 1]; Beq 1;%matlab自带函数包 [x_optimal, fval] ga(fitnessfcn, 2, A, b, Aeq, Beq, [0;0], [1;1], []); ---------------------------------…

matlab函数参数不足,调用函数显示输入参数不足

问题描述.png (29.7 KB, 下载次数: 1) 2015-1-27 09:34 上传 %Gauss-Newton算法实现如下 function[x,minf] = GN(f,x0,var,eps)formatlong; ifnargin == 3 %如果没有设置eps,则eps=1.0e-6eps = 1.0e-6; end m = 0; S =transpose(f)*f; %trnspose是转…

matlab 函数不定参数,matlab function定义一个函数,但一直出来说输入参数数目不足。我用的是2014版本,不知道数目原因啊?...

www.mh456.com防采集。 h 5;g 1; % g取源0有问题% 被积函数2113可以化5261简成f 4102(a,b,r)(r*h-r^16532*cos(a-b))/(h^2r^2g^2-2*h*r*cos(a-b))^1.5;% 求积分quadv((r)quadv((b)quadv((a)f(a,b,r), 0, 2*pi), 0, 2*pi), 0, h) 错误在于&#xff0c;调用函数f( x )缺一个…

matlab plot输入参数太多,输入参数太多问题

版本&#xff1a;R2016a 利用SCE-UA调用新安江模型进行率定时&#xff0c;显示参数太多&#xff0c;求大神指导。 clear; clc; spathcd P0(textread([spath,\matlabxingshanjiangyu.txt])); PP0(2,:);%降水量(mm) EI0(textread([spath,\matlabxingshanzhengfa.txt])); EIEI0(2,…

参数输入太多

参数输入太多 在向platEMO平台添加新的算法时&#xff0c;可能会出现参数输入太多的错误提示 可能是由于输入的参数内包含逗号&#xff0c;比如 a[1,2],b[3,4] 从而造成”输入参数太多“的错误提示。

MATLAB S-function(教程分享) 报错 flag = 3(output), at time 0.0. 输入参数的数目不足。

前言 从上周开始用S-function做仿真&#xff0c;之前已经学过的&#xff0c;我觉得很好的教程网址是 【0基础直接带你上手matlab simulink仿真&#xff08;不是标题党&#xff0c;讲解超级细致用心&#xff09;&#xff08;非线性系统自适应控制器的搭建&#xff09;】 https…

matlab报错“输入参数的数目不足”

图片源自下方链接 原文链接MATLAB中出现参数数目不足的错误提示 - 爱上对方过后就哭了忆 - 博客园 (cnblogs.com)

错误使用 max 输入参数的数目不足。

相比大多数人熟悉的在调用自己编写的函数时出现的 “输入参数的数目不足” 问题&#xff0c;该情况下&#xff08;即在同一脚本或同一函数中&#xff09;也会出现matlab内部函数调用问题&#xff08;如max、min等&#xff09;&#xff0c;在编程时应注意此点&#xff01;

Matlab运行自定义函数显示“输入参数的数目不足”

问题描述 很多初学者在刚开始学习使用Matlab自定义函数时&#xff0c;可能遇到程序上没有问题&#xff0c;但一运行就显示输入参数的数目不足这个问题。 比如自定义一个函数&#xff1a;查找最小的m&#xff0c;使得m满足12…m > k&#xff08;k为任意一个整数&#xff09;…

浏览器播放视频倍速方法

1.右击播放页面 2.选择检查 4.选择console&#xff0c;如图&#xff1a; 5.在下面输入 &#xff1a;videojs.getPlayers("video-player").html5player.tech_.setPlaybackRate(1.5)&#xff0c;括号里的数字就是要加倍的倍速。

浏览器播放RTSP

浏览器播放RTSP 由于现在浏览器不直接支持RTSP&#xff0c;然后很多监控厂商如海康大华等又不提供RTMP的情况下&#xff0c;项目需要实现HTML中播放监控视频。之前做过转流的方案&#xff0c;在服务器中把RTSP转成RTMP&#xff0c;这种方案开发量大而且转码不稳定&#xff0c;…

0516---win10 chrome 浏览器播放视频没有声音的解决办法

win10 chrome 浏览器播放视频没有声音的解决办法 近期我的Win10 主机在使用 Chrome 浏览器播放搜狐视频的时候没有声音&#xff0c;而用 Edge浏览器播放同一视频就一切正常&#xff0c;初步判断是浏览器的设置引起的。通过以下操作步骤得以解决。 启动 chrome 浏览器&#xf…

html5播放mp4不见画面,浏览器播放mp4格式视频时只有声音看不到画面的原因及解决方法(精)...

做HTML5网页&#xff0c;要播放视频&#xff0c;视频格式为mp4&#xff0c;结果浏览器只能听到声音&#xff0c;看不到画面。 反复测试&#xff0c;多个浏览器均出现此问题。刚开始以为视频的格式不对&#xff0c;我是从MOV转的MP4格式&#xff0c;反复确认嵌入的视频确实是mp4…

360浏览器html5无法播放,win7系统360浏览器播放不了视频的解决方法

今天和大家分享一下win7系统360浏览器播放不了视频问题的解决方法&#xff0c;在使用win7系统的过程中经常不知道如何去解决win7系统360浏览器播放不了视频的问题&#xff0c;有什么好的办法去解决win7系统360浏览器播放不了视频呢&#xff1f;小编教你只需要 1、视频无法正常…

《浏览器播放RTSP方案》之 VLC插件播放RTSP视频流

VLC插件播放RTSP视频流 多版本chrome安装安装vlc软件开启浏览器的NPAPI设置编写测试页插件设置其他问题最后 目前网页对于RTSP流直接播放不支持&#xff0c;目前有插件和转流两种方式&#xff0c;这里针对vlc插件播放做一个简单的梳理。 查看官网教程 vlcWebPlugin, 得知其浏览…

浏览器播放rtsp视频流:4、jsmpeg+go实现局域网下的rtsp视频流web端播放

文章目录 1.前言2.资料准备3.兼容性及适用性说明4.jsmpeg架构5.基于以上架构的go方案可行性分析6.编译和结果展示&#xff08;编译坑点&#xff09;7.最后 1.前言 之前的rtsp转webrtc的方案存在如下缺陷&#xff1a;1.只支持h264&#xff1b;2.受限于webrtc的理解难度以及搭建…