eos智能合约开发最佳实践

安全问题

1.可能的错误

智能合约终止

限制转账限额 限制速率

有效途径来进行bug修复和提升

2.谨慎发布智能合约

对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止

赏金计划和审计合约

3.合约的简介

确保智能合约逻辑简单

确保合约和函数模块化

4.保持更新

在任何新发现的漏洞之前进行修复

利用最新技术

5.潜在特性

可能会调用同名函数

漏洞

溢出漏洞

typedef struct acnts {

account_name name0;

account_name name1;

account_name name2;

account_name name3;

} account_names;

void transfer(symbol_name symbol, account_name from, account_names to, uint64_t balance)

{

require_auth(from);

account fromaccount;

require_recipient(from);
require_recipient(to.name0);
require_recipient(to.name1);
require_recipient(to.name2);
require_recipient(to.name3);

eosio_assert(is_balance_within_range(balance), "invalid balance");
eosio_assert(balance > 0, "must transfer positive balance");

uint64_t amount = balance * 4; //乘法溢出

int itr = db_find_i64(_self, symbol, N(table), from);
eosio_assert(itr >= 0, "Sub-- wrong name");
db_get_i64(itr, &fromaccount, (account));
eosio_assert(fromaccount.balance >= amount, "overdrawn balance");

sub_balance(symbol, from, amount);

add_balance(symbol, to.name0, balance);
add_balance(symbol, to.name1, balance);
add_balance(symbol, to.name2, balance);
add_balance(symbol, to.name3, balance);

}

提示 使用assert进行检查 而不是把balance提出来进行运算

权限校验

严格判断入参函数和实际调用使得否一致

void token::transfer( account_name from,

account_name to,

asset quantity,

string memo )

{

eosio_assert( from != to, "cannot transfer to self" );

eosio_assert( is_account( to ), "to account does not exist");

auto sym = quantity.symbol.name();

stats statstable( _self, sym );

const auto& st = statstable.get( sym );

require_recipient( from );
require_recipient( to );

eosio_assert( quantity.is_valid(), "invalid quantity" );
eosio_assert( quantity.amount > 0, "must transfer positive quantity" );
eosio_assert( quantity.symbol == st.supply.symbol, "symbol precision mismatch" );
eosio_assert( memo.size() <= 256, "memo has more than 256 bytes" );

auto payer = has_auth( to ) ? to : from;

sub_balance( from, quantity );
add_balance( to, quantity, payer );

}

提示:检验资产转出账户和调用账户是否一致

确保每一个action和code满足关联要求

// extend from EOSIO_ABI

define EOSIO_ABI_EX( TYPE, MEMBERS )
extern "C" {
void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
auto self = receiver;
if( action == N(onerror)) {
/* onerror is only valid if it is for the "eosio" code account and authorized by "eosio"‘s "active permission /
eosio_assert(code == N(eosio), "onerror action‘s are only valid from the "eosio" system account");
}
if( code == self || code == N(eosio.token) || action == N(onerror) ) {
TYPE thiscontract( self );
switch( action ) {
EOSIO_API( TYPE, MEMBERS )
}
/
does not allow destructor of thiscontract to run: eosio_exit(0); */
}
}
}

EOSIO_ABI_EX(eosio::charity, (hi)(transfer))

提示:关键检查

相关文章:

eosbet被盗事件合约分析

被盗合约 受攻击代码

有问题的合约代码

// extend from EOSIO_ABI, because we need to listen to incoming eosio.token transfers

define EOSIO_ABI_EX( TYPE, MEMBERS )
extern "C" {
void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
auto self = receiver;
if( action == N(onerror)) {
/* onerror is only valid if it is for the "eosio" code account and authorized by "eosio"‘s "active permission /
eosio_assert(code == N(eosio), "onerror action‘s are only valid from the "eosio" system account");
}
if( code == self || code == N(eosio.token) || action == N(onerror) ) {
TYPE thiscontract( self );
switch( action ) {
EOSIO_API( TYPE, MEMBERS )
}
/
does not allow destructor of thiscontract to run: eosio_exit(0); */
}
}
}

问题原因:

由于abi转发器允许下注而不将eos转移到合同中。

修改措施:

1.去掉错误判断

2.过滤传入操作 只将eosio.token的行为传入合同

提醒:

更强大的代码测试

至少两次审计

资金监控

原文地址:https://www.cnblogs.com/xiaocongcong888/p/9807150.html

时间: 2024-10-09 21:23:58

eos智能合约开发最佳实践的相关文章

EOS智能合约开发(三):EOS创建和管理账号

没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保存在区块链上的人类可读的标志符. 创建账号的命令: $ cleos createaccount eosio ${new_account} ${owner_key} ${active_key} 其中eosio是超级用户,需要靠超级用户来创建其它的新用户,eosio后面就是你的新用户的用户名. 除了新的

2018年以太坊智能合约开发语言Solidity最佳IDEs

Solidity是一种以智能合约为导向的编程语言.这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约. 理解它官方文档应该是学习Solidity的最佳来源:solidity.readthedocs.io 想在以太坊的网络上建立自己的加密货币吗?想拥有自己的初始代码产品吗?以下是您今天可以使用的最佳Solidity IDE. Remix IDE Remix IDE是基于浏览器的,并且集成了编译器.没有服务器端组件. 官网: https://remix.ethereum.orggi

以太坊智能合约开发工具 Truffle 最佳入门指导1

Truffle是以太坊(Ethereum)智能合约开发的瑞士军刀,小巧好用,上手简单. 本篇文章主要展示如何用Truffle 开发第一个Ethereum智能合约. 1.准备工作:(本人针对window环境,如果是mac 或linux可以自行搜索其他教程) a.安装git bash :http://gitforwindows.org/ b.安装npm:https://jingyan.baidu.com/article/a17d528506d7f58098c8f2b0.html 2.安装Truffl

移动端WEB前端开发最佳实践

移动端WEB前端开发最佳实践 Safari,Android Browser,Chrome都是以WebKit为核心的 移动设备和PC之间的页面现实存在差异(Safari中定义了viewport) 在移动设备和桌面端WEB前端开发中,事件绑定存在差异(移动触点) 页面控件设计存差异(点触不灵敏,虚拟键盘弹出框) 移动设备的网络带宽普遍比PC慢,移动页面要设置更简洁 PC页面兼容移动设备 使用流式布局 借助CSS Media queries(媒体查询)技术 使用合适的图片显示兼容方案 保持页面简洁,不

微信公众平台开发最佳实践(第2版)

<微信公众平台开发最佳实践 第2版>微信公众平台开发经典之作全新改版,精心挑选最经典的商业项目开发,成千上万人次微信公众平台开发者从中受益 前言 出版说明 自从方倍工作室在博客园推出微信公众平台开发系列教程后,受到广大微信开发人员及爱好者的热情关注,相关文章的日访问量高达2万人次,而<微信公众平台开发入门教程>的阅读量超过50万,博客访问量总计超过500万,成为微信公众平台开发更新最快,传播最广.受众最多.资料最全的博客,很多博文被许多有影响力的网站转载,并被各大搜索引擎收录且排名

NEO智能合约开发(二)再续不可能的任务

? NEO智能合约开发中,应用合约比较简单,是的你没看错,应用合约比较简单. 应用合约三部曲,发布.调用.看结果.除了看结果工具比较缺乏,发布调用neogui最起码可以支撑你测试. ? 鉴权合约比较麻烦,因为neogui不能支持你很好的测试鉴权合约. ? 这是一个难点,上一次我们让你试着用鉴权合约往外取钱了,一个密码,有了密码谁都能取钱.就那,用neogui去取并不容易,对吧. ? 这一次我们继续探讨这个话题,一个更有价值的应用场景. 如何限制一个用户能从智能合约里取出多少钱? ? 不用担心,如

EOS 智能合约案例解析(3)

详解 EOS 智能合约的 abi 文件 这次向大家介绍 eosio.token 智能合约的最后一个文件 -- abi文件.ABI 全称 Application Binary Interface,中文名"应用程序二进制接口",顾名思义是一个接口文件,描述了智能合约与上层应用之间的数据交换格式.abi 文件格式类似 JSON,具备很好的可读性,有利于智能合约工程师与上层应用工程师之间的工作衔接.eosio.token.abi 文件地址: https://github.com/EOSIO/e

EOS智能合约案例解析(1)

为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示例合约给出了 EOS 官方智能合约开发的标准结构和开发方法,并且真正的 EOS 代币也会借鉴这个示例合约的逻辑,是 EOS 智能合约入门的经典案例. 照例,eosio.token 合约由三个文件(cpp,hpp,abi)文件组成,本篇文章将为大家讲解 eosio.token.hpp 文件.原文件地址

EOS 智能合约案例解析(2)

详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能合约所有的业务逻辑内容都是在 cpp 文件中实现的. eosio.token.cpp 文件地址: https://github.com/EOSIO/eos/blob/master/contracts/eosio.token/eosio.token.cpp 了解 C/C++ 开发的同学肯定熟悉,cpp