区块链就是比特币:关于波场智能合约fallback 函数的特性

  本期小课堂结合 TRON-Rich 团队的 RichBank 合约,谈一谈波场智能合约fallback 函数的特性以及如何有效避免重入攻击。同时,欢迎大家关注 TRON官方 twitter,踊跃投稿合约代码。

  老规矩,开讲之前,先通过https://troneye.com (以下简称 TRON-Eye)验证合约源码的真实性。

  TRON-Eye 是来自社区的波场合约验证平台,上一期小课堂对 TRON-Eye 验证平台进行了详细的介绍。下图所示的即为TRON-Rich 团队的TEoSMNi7WvVHXe2NxxDw2AeLhiwLJXxQYL RichBank合约的源码。

  

  RichBank 合约是个资金盘合约,大部分逻辑和上一期介绍的 UsdtBank 类似。这里着重关注的有2个细节。

  1. Fallback 函数

  

  图2所示即为RichBank 的 fallback 函数,在 fallback 函数中它记录了来自某个地址的这笔转账,或者完成该地址的取款请求。当通过 grpc 接口 调用合约一个不存在的函数;或在 solidity 中直接调用不存在的函数时,亦或直接在 Solidity 中给该地址 transfer() 或者 send() TRX 时,都会执行目标合约的fallback 函数。这种特性被很多开发者用来记录用户转账。

  但是,这种方式有两个需要关注的地方。

  第一个,fallback 函数的energy问题。由于 transfer 和 send 函数,只能附带2300的 Energy,而对一个32 byte数据的读取(SSLOAD指令)、修改(SSTORE指令)和创建(SSTORE 指令)分别用到了400,5000和20000 Energy。所以,2300的 Energy 不足以创建和修改数据。也就是说,如果一个能量消耗超过2300的 fallback 函数,会导致在 solidity 中对该地址调用 transfer和 send 必然失败。

  第二个,波场相对以太坊,还提供了“免费转账”的普通转账交易,GRPC 中的 transfercontract 类型的交易。该交易只消耗带宽,不消耗 Energy。由于该交易不消耗Energy,所以不会触发合约的 fallback 函数。(也就是说,直接通过 tronscan 对该合约地址的普通 trx 转账,并不会触发 fallback 函数。)

  上述是所有依赖 fallback 函数记录用户所有转账的合约,必须知晓的2个问题。他们决定了,所有需要记录的转账交易,都必须采用triggersmartcontract 方式调用合约来给合约发送 trx。其中第1个是 Solidity 解决重入攻击的基础,在可见的将来,都不会改变;第2个是波场“免费转账”特性,我们也正在TIP37 (链接:https://github.com/tronprotocol/TIPs/issues/37)讨论是否要停止支持对合约地址进行 transfercontract类型的交易,欢迎踊跃参与讨论。

  2. 如何有效避免重入攻击

  在 Solidity 中,调用其他地址的函数或者给合约地址转账,都会把自己的地址作为被调合约的 msg.sender 传递过去。此时,如果传递的energy 足够的话,就可能会被对方就行重入攻击。

  防止重入攻击,最简单粗暴的方式就是,在 solidity 中禁止对合约地址进行操作。这个可以通过上一期讲到的 require(msg.sender==tx.origin) 和 extcodesize() > 0,来基本上实现。RichBank 采用了 msg.sender==tx.origin ,但是在两个位置,留下了空隙。

  分别如下:

  function grant(address addr, uint256 _planId) public whenNotPaused isHuman payable {

  uint256 grantorUid=address2UID[msg.sender];

  bool isAutoAddReferrer=true;

  uint256 referrerCode=0;

  if (grantorUid !=0 && isAutoAddReferrer) {

  referrerCode=grantorUid;

  }

  if (_invest(addr,_planId,referrerCode,msg.value)) {

  emit onGrant(msg.sender, addr, msg.value);

  }

  }

  这段代码,值判断了调用者是否为合约,并没有判断传入的 addr 参数是否为合约。同时,对于 fallback 函数,这个问题更加严重,它甚至没有判断调用者是否为合约。这两处都是该合约后续可以完善的地方。

  function() external payable {

  if (msg.value==0) {

  withdraw();

  } else {

  invest(0, 0); //default to buy plan 0, no referrer

  }

  }

  但是,允许其他合约参与投注,并不一定会构成重入攻击。前面说过,在 Solidity 中对合约地址调用transfer/sender,只会传递2300的 Energy,这不足以发起一次重入攻击。所以要一定避免通过 callvalue 的方式,调用未知的合约地址。因为 callvalue 可以传入远大于2300的 Energy。

文章内容系本站作者个人观点,不代表本站对其观点赞同或支持,文章的版权归该作者所有。如需转载,请注明文章来源。本文地址:http://www.cis.net.cn/kejikuaixun/43176.html
留言与评论(共有 条评论)
验证码:

最新文章

关于波场智能合约fallback 函数的特性

科技快讯
本期小课堂结合TRON-Rich团队的RichBank合约,谈一谈波场智能合约fallback函数的特性以及如何有效避免重入攻击。同时,欢迎大家关注TRON官方twitter,踊跃投稿合约代码。老规矩,开讲之前

区块链与STO

科技快讯
从大航海时期的股份制,到区块链时代的STO,资产证券化带来的是资产颗粒化,这样的话带来了更多人的参与,集聚了更多的资源。人类从采摘时代到时代,再到工业时代,以及如今的信息时代,每一次的巨大进步都离不开大量人的参与,股份制将无数人卷入到大航海的冒险,进而开启人类全球化的进程,并且为后来的物种大交换、海洋贸易的繁荣。STO作为资

StarksPay:当闪电网络遇上 STARKs

科技快讯
长话短说:StarkPay是一种基于STARK技术的可扩展支付引擎,它可以解决第二层(Layer-2)支付解决方案闪电网络(Lightning)的许多缺点。StarkWare的第一个STARK技术应用是一个Layer-2可扩展引擎。我们最近发布了StarkDEX,一个去中心化交易所(DEX)可扩展引擎(早期成果请查看该链接)。我们将该可扩展引擎应用于加密货币支付

区块网3.30晚报:火币矿池全球今日正式上线

科技快讯
1.新研究:80%的ICO是骗局,只有8%上线交易所SatisGroup有限公司通过收集公开信息,对市值至少为5000万的ICO项目的白皮书、融资和上线交易进行了评估,并按照项目质量作了归类。他们的调查结果令人瞠目,8

这是专门针对非技术人员的“智能合约”科普

科技快讯
以太坊区块链和比特币区块链的区别在于,在以太坊上的某些账户不是由人控制,而是由这些账户中的一组指令控制。下面是以太坊区块链上的一段记录。在下图中,账户B,E和G由指令而不是由人来控制:这组被设置在账户中的指令被称为智能合约。这些指令只是计算机代码,基本上就是一套逻辑。如果有交易发生,智能

百度智能视频音箱发布,搭载DuerOS系统,李彦宏说这是新品类

科技快讯
智能音箱大家都很熟悉,但带屏的智能音箱并不多。昨天,百度对外发布了“小度在家”带屏智能音箱。百度CEO李彦宏现场助阵。李彦宏说“有屏幕的智能音箱和没屏幕的智能音箱是有本质区别的,小度在家这样一款产品是一个新的品类,代表了新的方向,未来的中国很大的趋势会来自智能制造”。下面我们一起来看看百度新发布的这款智能音箱。

智能合约实现(如何建立智能合约)

科技快讯
随着行业的发展,区块链以及的概念也越来越火,Token作为体系内的货币以及价值的载体可以实现体系内价值的自由流通以及实现价值的再分配。从专业的角度看,Token代表的是区块链上的一种权益证明,而非仅仅代币。Token必然会货币化、也会有权益证明、

「公告」ITC万物链主网IoT Chain正式上线

科技快讯
亲爱的社区伙伴及ITC持有者:ITC万物链官方团队正式宣布:IoTChain主网于北京时间2018年12月29日20:00正式上线,并进入stage公开观察期。IoTChain开发路线图经过了12个月的开发,从模块化的架构设计,到逐个模块的

跨链系统HyperExchange链上Senator选举发布会正式启动

科技快讯
Hcash基金会正式宣布,跨链系统HyperExchange链上Senator选举将于2019年1月6日(9:00-17:00)在中国香港启动。选举发布会将于沙田香港科学院第三期-会议中心3,12W大楼一楼-大会展览厅A举办。为了照顾不能到场的HCASH社区成员及支持者,发布会也将在“一直播”平台(一直播ID:373019447)进行直播。Senator是跨链