eosio.msig

接口

  • propose()
  • propose(account_name proposer, name proposal_name, vector<permission_level> requested, transaction trx)
  • approve(account_name proposer, name proposal_name, permission_level level)
  • unapprove(account_name proposer, name proposal_name, permission_level level)
  • cancel(account_name proposer, name proposal_name, account_name canceler)
  • exec(account_name proposer, name proposal_name, account_name executer)

数据结构

struct proposal {name                       proposal_name;vector<char>               packed_transaction;auto primary_key()const { return proposal_name.value; }
};
typedef eosio::multi_index<N(proposal),proposal> proposals;struct approvals_info {name                       proposal_name;vector<permission_level>   requested_approvals;vector<permission_level>   provided_approvals;auto primary_key()const { return proposal_name.value; }
};
typedef eosio::multi_index<N(approvals),approvals_info> approvals;

分析

propose

该接口会在合约接口实现中分析输入数据(而不是在系统的分发器),因为如果在交易数据很大,在系统分发器分析数据会消耗非常多的CPU。因为这样我们看到propose接口的函数声明是

propose()

如果使用系统的分发器,那么接口的函数声明应该是

propose(account_name proposer, name proposal_name, vector<permission_level> requested, transaction trx)

  1. propose首先会通过调用read_action_data读取传入的action数据
constexpr size_t max_stack_buffer_size = 512;
size_t size = action_data_size();
char* buffer = (char*)( max_stack_buffer_size < size ? malloc(size) : alloca(size) );
read_action_data( buffer, size );
  1. 然后通过数据流datastream<const char*>反序列化参数数据
account_name proposer;
name proposal_name;
vector<permission_level> requested;
transaction_header trx_header;datastream<const char*> ds( buffer, size );
ds >> proposer >> proposal_name >> requested;size_t trx_pos = ds.tellp();
ds >> trx_header;
  1. 接着,要求poster的授权,检测提交方案的合约数据的时限是否还有效和提案是否重复
require_auth( proposer );
eosio_assert( trx_header.expiration >= eosio::time_point_sec(now()), "transaction expired" );proposals proptable( _self, proposer );
eosio_assert( proptable.find( proposal_name ) == proptable.end(), "proposal with the same name exists" );
  1. 校验交易是否存在requested中指定的授权。
bytes packed_requested = pack(requested);
auto res = ::check_transaction_authorization( buffer+trx_pos, size-trx_pos,(const char*)0, 0,packed_requested.data(), packed_requested.size());
eosio_assert( res > 0, "transaction authorization failed" );
  1. 存储提案交易数据到持久化数据表
proptable.emplace( proposer, [&]( auto& prop ) {prop.proposal_name       = proposal_name;prop.packed_transaction  = bytes( buffer+trx_pos, buffer+size );
});approvals apptable(  _self, proposer );
apptable.emplace( proposer, [&]( auto& a ) {a.proposal_name       = proposal_name;a.requested_approvals = std::move(requested);
});

approve

  1. 校验提案是否存在
  2. 校验提供的授权是否是需要的授权
  3. 添加授权到提案持久化数据与去除需要的对应授权。
require_auth( level );approvals apptable(  _self, proposer );
auto& apps = apptable.get( proposal_name, "proposal not found" );auto itr = std::find( apps.requested_approvals.begin(), apps.requested_approvals.end(), level );
eosio_assert( itr != apps.requested_approvals.end(), "approval is not on the list of requested approvals" );apptable.modify( apps, proposer, [&]( auto& a ) {a.provided_approvals.push_back( level );a.requested_approvals.erase( itr );
});

unapprove

approve的逆操作。

cancel

任何人都可以取消提案,但是只有提案的提出者可以在提案有效期内中途取消提案。

// ...
if( canceler != proposer ) {eosio_assert( unpack<transaction_header>( prop.packed_transaction ).expiration < eosio::time_point_sec(now()), "cannot cancel until expiration" );
}
// ...
proptable.erase(prop);
apptable.erase(apps);

exec

任何人都可以执行已经通过的提案。
提案只要被任何一个人执行,就会清除唯一的持久化记录。
提案是存在时效性的,过期的提案不可以被执行。
提案作为延时交易(deferred transaction)被执行,无论提案执行成功与否,持久化的提案记录都会被删除。

require_auth( executer );
// ...
eosio_assert( trx_header.expiration >= eosio::time_point_sec(now()), "transaction expired" );
// ...
send_deferred( (uint128_t(proposer) << 64) | proposal_name, executer, prop.packed_transaction.data(), prop.packed_transaction.size() );proptable.erase(prop);
apptable.erase(apps);

eosio.msig合约源码分析相关推荐

  1. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

  2. EOS智能合约:system系统合约源码分析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. ...

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

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

  4. system合约源码分析

    写在前面 system合约是EOS区块链最核心的智能合约,分析其源码可以一窥EOS的精妙之处. 文件结构 native 基础的数据结构和功能 delegate_bandwidth 带宽抵押与内存买卖 ...

  5. WeIdentity智能合约源码分析

    WeIdentity智能合约 介绍 本文结合WeIdentity智能合约文档对其源码进行阅读分析.当前,WeIdentity合约层面的工作目标主要包括两部分: WeIdentity DID智能合约,负 ...

  6. Token系列 - 加密猫智能合约源码分析

    GeneScienceInterface合约 这个合约没有源码,从名字看已经很明显,就是猫的基因工程,用于决定新出生猫的基因. 这里仅仅定义了一个接口,没有具体实现,后续的调用请看后续代码分析 /// ...

  7. 以太坊ETH-智能合约开发-solidity源码分析-truffle进阶

    0. 背景 上一篇文章我们从合约编写.编译.部署.交互等几个方面介绍了truffle的大致用法. 本篇主要继续深入地介绍truffle的高级用法 + 合约源码分析 1. 将合约部署到测试网Ropste ...

  8. EOSIO源码分析 - EOSIO合约开发库

    EOSIO合约开发库 通过简单的源码分析,可以很清楚的看到EOSIO合约开发库在目录libraries下,各个库的功能如下: 注意:由于篇幅问题,只介绍最主要的,常用的 CDT: 总目录|----li ...

  9. 以太坊C++客户端Aleth源码分析,转账交易和智能合约的入口代码

    本文主要记录以太坊C++客户端Aleth的源码分析和相关实验过程和结果.本文将讲解两部分的内容,一是转账交易和智能合约的入口代码在哪里?二是通过实验验证转账交易和智能合约交易这两种不同交易所对应的不同 ...

最新文章

  1. 一篇文章让你读懂Pivotal的GemFire家族产品
  2. ThoughtWorks雷达上的新奇变化
  3. 怎样训练左右手协调_BF#拳击教学#自学课程:专项辅助训练【墙靶训练法+路训】...
  4. 4.9.3 方法注释
  5. PMCAFF | 智能硬件2.0时代:用户导向,内容连接
  6. PIC单片机精通_串口通讯与串口调试实例
  7. log4j中配置日志文件相对路径方法
  8. Java中的基本数据类型转换(自动、强制、提升)
  9. JavaScript抽象类及Class.create备忘
  10. 现代程序设计课程简介
  11. 剑指offer (02):实现 Singleton 单例模式 (Python 实现详解)
  12. 怎么关闭苹果手机自动扣费_这些手机功能不关闭,可能会被“自动扣费”
  13. 2021年中国再生纱市场趋势报告、技术动态创新及2027年市场预测
  14. 一天快速入门 Python
  15. iOS获取iPhone系统等信息和服务器返回空的异常处理
  16. centos运行jar包需要的环境_SpringBoot+Vue前后端一次打包为一个Jar包运行
  17. 【linux 学习】linux上安装Tim(linux mint)
  18. 中级软件评测师下午题总结
  19. 使用阿里iconfont unicode格式图标
  20. mbr转gpt 无损 linux,无损 MBR转换为GPT加快启动

热门文章

  1. ASP.NET初级传智播客.net第十季asp.net基础 文字总结(未完)
  2. SWT学生成绩管理系统
  3. JavaScript基础(二)-类
  4. Yii2性能优化之:缓存依赖
  5. .NET基础 (08)字符串处理
  6. ClippingNode实现新手引导高亮裁切
  7. HTTP POST发消息
  8. Ruby on Rails,创建开发用的MYSQL数据库
  9. Linux0.11 kernel/exit.c中的free_page_tables()
  10. 中国移动试商用GPS手机导航业务 包月资费15元