木星链 木星链
Ctrl+D收藏木星链
首页 > 莱特币 > 正文

GAS:停止使用 Solidity 的 transfer()

作者:

时间:1900/1/1 0:00:00

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

由于EIP1884已经在伊斯坦布尔硬分叉实施,EIP1884增加了SLOAD操作的Gas成本,因此_破坏了一些现有的智能合约_。

这些合约将被破坏,因为它们的fallback函数以前消耗的Gas不到2300,而现在会消耗更多。为什么2300Gas这么重要?这是合约的fallback函数通过Solidity的transfer()或send()方法调用时可使用的Gas量。

刚才是简化的描述,2300是Gas”津贴“,如果是非零的以太币量转账,则Gas”津贴“明确传递给CALL。Solidity的transfer()将Gas参数设置为0,如果以太币的转账量为非零。在加上gas”津贴“后,一共是2300。如果是零以太币转账,Solidity明确地将Gas参数设置为2300,因此在两种情况下都会是2300Gas。

自推出以来,transfer()通常被安全界推荐,因为它有助于防范重入攻击。在Gas成本不会改变的假设下,这一指导意见是有意义的,但事实证明这一假设是不正确的。我们现在建议避免使用transfer()和send()。

Gas成本可以改变

EVM支持的每个操作码都有相关的Gas成本。例如,SLOAD,从存储中读取一个字,在EIP1884中gas由200修改为800。

Gas费用不是随意的。它们旨在反映组成以太坊的节点上每个操作所消耗的基本资源。

Binance Australia:将停止用户通过银行转账进行澳元存款和提款:金色财经报道,Binance澳大利亚分支机构Binance Australia发推表示,澳大利亚的Binance用户不再可以通过银行转账进行澳元存款和提款。从6月1日起,Binance已经停止了所有澳元交易对。为了方便6月1日之后的提款和交易活动,用户可以将澳元余额兑换成USDT。

用户仍然可以使用信用卡或借记卡购买和出售加密货币,Binance Australia的Binance P2P市场也将继续照常运作。[2023/6/1 11:52:35]

来自EIP的动机部分。

操作的价格和资源消耗之间的不平衡有几个缺点:

可能被用于攻击,通过用低Gas操作填充区块,导致区块处理时间过长。

价格过低的操作码会歪曲区块Gas限制,有时区块完成得很快,但其他Gas使用量相似的区块完成得很慢。

如果操作定价更均衡,我们可以最大限度地提高块Gas限制,并有一个更稳定的处理时间。

SLOAD历来价格偏低,EIP1884纠正了这一问题。

智能合约不能依赖Gas成本

如果Gas成本是可以变化的,那么智能合约就不能依赖于任何特定的Gas成本。

任何使用transfer()或send()的智能合约,都是通过转发固定数量的Gas来而产生2300Gas成本的硬性依赖。

因此建议停止在代码中使用transfer()和send(),而改用call()。

ShibaSwap宣布已停止BONE铸造:9月10日消息,DEX ShibaSwap发推称,由于Shiba Inu生态系统治理代币BONE的供应量达2.3亿枚,BONE铸造已经正式停止。剩余约2000万枚BONE指定留给Shibarium验证者。BONE最大供应量为2.5亿枚。

据此前报道,根据DOGGY DAO:BONE Farms的提案,在已铸造的BONE代币量达到2.3亿枚时,停止所有BONE挖矿,以便为Shibarium验证者保留剩余的2000万BONE代币奖励。据悉,BONE的总供应量上限为2.5亿枚。[2022/9/10 13:21:25]

contractVulnerable{functionwithdraw(uint256amount)external{//Thisforwards2300gas,whichmaynotbeenoughiftherecipient//isacontractandgascostschange

}contractFixed{functionwithdraw(uint256amount)external{//Thisforwardsallavailablegas

}

除了转发固定的2300Gas之外,这两个合约是等价的。

关于重入攻击怎么办?

重入攻击,希望是你看到上述代码后的第一反应。引入transfer()和send()的全部原因是为了解决TheDAO上臭名昭著的黑客事件的原因。当时的想法是,2300Gas足够触发一个日志条目,但不足以进行再重入的调用来修改存储状态。

Osmosis区块链已停止出块,开发者正在进行紧急维护:6月8日消息,Cosmos 生态 DEX 项目 Osmosis 区块链已于高度4713064 停止,开发人员正在进行紧急维护。Osmosis DEX 和 Wallet 无法使用,直到修复完成。[2022/6/8 4:10:45]

不过请记住,Gas成本是会变化的,这意味着无论如何这都不是解决再重入攻击的好办法。19年初,君士坦丁堡分叉被推迟,就是因为gas成本的降低,导致以前重入攻击安全的代码不再安全。

如果我们不打算再使用transfer()和send(),我们就必须用更强大的方式来防止重入。幸运的是,这个问题有很好的解决办法。

检查-生效-交互模式

消除重入性bug最简单的方法是使用检查-生效-交互(checks-effects-interactions)。这是一个典型的重入bug的例子:

contractVulnerable{..

}

如果msg.sender是一个智能合约,它在第6行有机会在第7行发生之前再次调用withdraw()。在那第二次调用中,balanceOf还是原来的金额,所以会再次转账。这可以根据需要重复多次,以耗尽智能合约。

检查-生效-交互模式的想法是确保你所有的交互都发生在最后。上述代码的典型修复方法如下:

1contractFixed{2...34functionwithdraw()external{5uint256amount=balanceOf;6balanceOf=0;7(boolsuccess,)=msg.sender.call.value(amount)("");8require(success,"Transferfailed.");9}10}

Enumivo考虑停止EIDOS挖矿:今日,Enumivo官方发布推文称或考虑停止EIDOS挖矿。Enumivo表示,如果停止EIDOS挖矿,是因为其失去了公平分配的本质,甚至为EOS历史节点增加了不必要的负担。EIDOS的价值一定不能来自挖矿本身,而是来自围绕它构建的项目。近几周EIDOS的持仓账户不再增加,若不停止挖矿,可能会引来更多敌意,同时官方也认为停止挖矿利大于弊。Enumivo会进行社区民意调查,如果社区支持,将会停止EIDOS挖矿。[2020/3/5]

请注意,在这段代码中,余额在转账之前就被清零了,所以试图对withdraw()进行重入调用对攻击者来说没有收益。

使用重入防护

另一种防止重入的方法是明确地检查和拒绝这种调用。下面是一个简单版的重入防护,大家可以看看思路:

1contractGuarded{2...34boollocked=false;56functionwithdraw()external{7require(!locked,"Reentrantcalldetected!");8locked=true;9...10locked=false;11}12}

在这段代码中,如果尝试重入调用,第7行的require将拒绝它,因为lock仍然被设置为true。

在OpenZeppelin的ReentrancyGuard合约中可以找到一个更复杂、更节省gas的版本。如果你继承了ReentrancyGuard,你只需要用nonReentrant来修饰函数,防止重入。

动态 | Bitfi钱包停止漏洞赏金计划:据ccn消息,杀软件创始人约翰·迈克菲与?Bitfi?团队共同推出开源?Bitfi?钱包将不再宣称“不可破解”,并停止漏洞赏金计划。Bitfi曾高调宣称其钱包是世界上第一个坚不可摧的硬件钱包,然后却在不到一周的时间被攻破,为此Bitfi在社交媒体上受到了严重的质疑,这个决定旨在挽回其声誉。Bitfi现在表示将聘请经验丰富的安全经理来确认安全研究人员发现的漏洞。[2018/8/31]

请注意,这个方法只应该用于保护重入,如果你明确地将其应用于所有正确的函数。由于需要在储存中保持一个值,它也会增加Gas成本。

Vyper语言有出现这个情况吗?

Vyper的send()函数与Solidity的transfer()一样使用硬编码Gas”津贴“,所以也要避免使用。你可以使用raw_call代替。

Vyper内置了一个@nonreentrant()修饰器,其工作原理类似于OpenZeppelin的ReentrancyGuard。

总结

在Gas成本不变的假设下,推荐transfer()是有道理的。

但Gas成本不是不变的。智能合约应该有力地应对这一事实。

Solidity的transfer()和send()使用一个硬编码的Gas成本。

这些方法应避免使用。使用.call.value(...)("")代替。

这就存在着重入的风险。一定要使用现有的一种强大的方法来防止重入漏洞。

Vyper的send()也有同样的问题。

本翻译由CellNetwork赞助支持。

来源:https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html

伊斯坦布尔硬分叉:https://learnblockchain.cn/2019/11/21/istanbul-update

EIP1884:https://learnblockchain.cn/docs/eips/eip-1884.html

破坏了一些现有的智能合约:https://docs.google.com/presentation/d/1IiRYSjwle02zQUmWId06Bss8GrxGyw6nQAiZdCRFEPk/edit

fallback函数:https://learnblockchain.cn/docs/solidity/contracts.html#fallback

Solidity的transfer()或send()方法:https://solidity.readthedocs.io/en/v0.5.11/units-and-global-variables.html#members-of-address-types

动机部分:https://eips.ethereum.org/EIPS/eip-1884#motivation

重入攻击:https://learnblockchain.cn/docs/solidity/security-considerations.html#re-entance

TheDAO:https://learnblockchain.cn/2019/04/07/dao

君士坦丁堡分叉被推迟:https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/

检查-生效-交互(checks-effects-interactions):https://learnblockchain.cn/docs/solidity/security-considerations.html#checks-effects-interactions

OpenZeppelin的ReentrancyGuard:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol

Vyper的send()函数:https://vyper.readthedocs.io/en/v0.1.0-beta.12/built-in-functions.html#send

raw_call:https://vyper.readthedocs.io/en/v0.1.0-beta.10/built-in-functions.html#raw-call

@nonreentrant()修饰器:https://vyper.readthedocs.io/en/v0.1.0-beta.12/structure-of-a-contract.html#decorators

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/9729855.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

盘点零知识证明代表性项目:如何影响和塑造区块链生态系统?

标签:GASTRARANTPSbnb局gas费ASTRALData Transactiontps币行情

莱特币热门资讯
GATE:Gate.io开启锁仓EHASH挖矿EHASH,年化币收益100%

Gate.io已于2021年3月3日12:00首发上线EHASH交易,并于2021年2月25日10:00开启EHASH系列挖矿赚币产品,参与Gate.ioEHASH系列理财即可获得EHASH.

1900/1/1 0:00:00
USD:霍比特关于上线ATOM等6个3倍多空杠杆ETF交易对的公告

尊敬的社区用户:为满足广大用户交易需求,在新杠杆ETF产品基础上,霍比特交易所将于2021年3月3日18:00在杠杆ETF交易区上线新的杠杆ETF产品:ATOM3L/USDTATOM3S/USD.

1900/1/1 0:00:00
加密货币:如何准确预测加密货币价格?这篇内容了解下

原标题:《加密货币价格预测:交易,技术和社交情绪指标的深度学习研究》币圈深度参与者和holder获得更高收益,而不是trader,这或许是我们的错觉.

1900/1/1 0:00:00
YFX:YFX平台币介绍及挖矿细则

1.YFX平台币简介YFX是YFX跨链去中心化永续合约交易平台的平台币,平台币将会在ETH、Tron、BSC、Heco、OKChain、Polkadot等各大公链各发布一部分.

1900/1/1 0:00:00
EZDex:去中心化交易所挑战者-EZDex耀世登场

11111111金融市场风云多变,在当今信息金融产业的不断发展下,EZDex去中心化交易所即将在2021年4月19日重磅上线,重新定义自己的交易,让财富重新分配.

1900/1/1 0:00:00
USD:币安币本位合约维持保证金调整公告 (2021-03-01)

亲爱的用户:为了更好地规范市场和防范市场风险,币安合约自上周起开始对以下币本位合约的维持保证金率阶梯进行定时调整,预计在10周内调整完成.

1900/1/1 0:00:00