安全问题

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的行为传入合同

提醒:

更强大的代码测试

至少两次审计

资金监控

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

  1. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

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

    没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...

  3. eos 智能合约开发体验

    eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...

  4. EOS智能合约开发(二):EOS创建和管理钱包

    上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...

  5. EOS智能合约开发(一):EOS环境搭建和启动节点

    EOS和以太坊很像,EOS很明确的说明它就是一个区块链的操作系统,BM在博客中也是说过的. 可以这样比喻,EOS就相当于内置激励系统的Windows/Linux/MacOS,这是它的一个定位. 包括以 ...

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

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

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

      NEO智能合约开发中,应用合约比较简单,是的你没看错,应用合约比较简单. 应用合约三部曲,发布.调用.看结果.除了看结果工具比较缺乏,发布调用neogui最起码可以支撑你测试.   鉴权合约比较麻 ...

  8. EOS智能合约存储实例讲解

    EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...

  9. Hyperledger Fabric 智能合约开发及 fabric-sdk-go/fabric-gateway 使用示例

    前言 在上个实验 Hyperledger Fabric 多组织多排序节点部署在多个主机上 中,我们已经实现了多组织多排序节点部署在多个主机上,但到目前为止,我们所有的实验都只是研究了联盟链的网络配置方 ...

随机推荐

  1. Jstorm+Spring+mybatis整合

    在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库. 在网上寻找了一下,发现storm集成 ...

  2. iOS运用runtime全局修改UILabel的默认字体

    iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...

  3. 关于js代码位置的第一次总结

    最近在学习dom树节点操作时,发现查找结点总是返回null,原因在于将js代码放在了head里,因为页面是从上往下逐行加载,在还未加载相关节点时当然查找不到,返回值为null. 而对于另一句老生常谈的 ...

  4. java 整型数据转换为小数类型 BigDecimal 装换为Double

    A,B为String类型 ,A-B=C BigDecimal A=(BigDecimal) map.get("A"); BigDecimal B=(BigDecimal) map. ...

  5. Android中的AutoCompleteTextView(随笔提示文本)组件的简单使用

    Android中的随笔提示文本组件AutoCompleteTextView的使用,此组件用于输入文本,然后就会在所配置的适配器中的数据进行查找显示在组件下面. 这里值得注意的是AutoComplete ...

  6. Yii中实现分页

    $criteria = new CDbCriteria(); // 查询字段 $criteria->select = 'id, name, create_time'; // 排序 $criter ...

  7. 可以提高php编程效率的20个要点

    整理了可以提高php编程效率的20个要点,发博客记录一下,需要的朋友可以参考.    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id' ...

  8. Hive的DML操作

    1. Load 在将数据加载到表中时,Hive 不会进行任何转换.加载操作是将数据文件移动到与 Hive表对应的位置的纯复制/移动操作. 语法结构: load data [local] inpath ...

  9. MySQL集群-PXC搭建以及使用innobackupex工具进行全局备份和增量备份

    环境:centos7 vm1:10.154.47.236 vm2:10.154.52.189 vm3:10.105.12.50 目的:pxc使用三个节点构建mysql集群,使用innobackupex ...

  10. 生成Ipa安装包的plist文件后生成下载链接

    假设生成的plist文件的下载链接是: https://www.xx.com/download/xx.plist 那么如果想让苹果手机的浏览器点击后开始下载苹果软件包,则网页中的下载链接需要拼接成 i ...