TOKEN:安全的处理 ERC20 转账(解决非标准 ERC20 问题)

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

你可能认为在ERC-20调用几个函数非常简单,对吗?很不幸,不是的。有些事情我们必须要考虑,而且还可能出现一些很常见的问题。

我们从最简单的开始,下面我们要处理一个非常普通的token交易,下面的代码会导入并直接使用IERC20

对于像DAI这样的token来说这段代码是很完美的,调用transfer函数并在出错的时候回退调用。

但是,如果我们调用的是0x会发生什么?ZRX代码在这里。

functiontransferFrom(address_from,address_to,uint_value)returns(bool){if(balances>=_value&&allowed>=_value&&balances_value>=balances){balances=_value;balances-=_value;allowed-=_value;Transfer(_from,_to,_value);returntrue;}else{returnfalse;}}

跨链桥 Stargate 发起社区提案投票,拟禁用 Fantom 流动性池和跨链路径:5月27日消息,跨链桥 Stargate 发起社区提案投票,为了降低 Stargate 及其流动性提供者的风险,提议禁用 Fantom 流动性池和跨链路径,包括将 Fantom 流动性池中的 STG 排放设置为 0,断开 Fantom 流动性池与所有其他池的连接,通过 Multichain 移除和解除任何 USDC POL,然后将 POL 存入以太坊 USDC 池,同时将现有 LP 列入白名单,以便将他们的 LP 赎回到任何其他链。[2023/5/27 9:45:54]

我们可以看到,与DAI不同,当出错时0x不会回退交易,而是返回false,但是我们在代码中不管这个返回值。本质上,任何人都可以与我们合约的interactWithToken交易,合约会认为成功交易了一个token,但实际上什么也没有做。很糟糕!

ZRX仍然符合ERC-20标准,因为没有任何地方规定ERC-20合约必须在发生失败时回退交易。这两种方法都有优点和缺点。在上面的例子中,很明显我们只需要检查返回值就知道是否成功,一段简单的代码require(token

Gate.io Startup 首发项目LION开盘4小时涨幅达361.58%:据Gate.io芝麻开门行情显示,截至今日14:25,Gate.io Startup 首发项目LION 开盘4小时内最高涨幅361.58%,最高价格0.005539美元,当前价格为0.0044303美元,开盘4小时现货交易量达1205.89万美元。

据悉, 本次Startup首发项目狮币 (LION)认购为免费认购,并已于5月6日(今日)11:00上线。近期行情波动较大,请注意控制风险。[2021/5/6 21:28:52]

catchError(stringmemory/*reason*/){success=false;//specialhandlingdependingonerrormessagepossible}catch(bytesmemory/*lowLevelData*/){success=false;}if(success){//handlesuccesscase}else{//handlefailurecasewithoutreverting}}

Gate.io“天天理财” 第189期 GT锁仓赚USDG明日开启:据官方公告,Gate.io 将于4月18日(明日)12:00上线第189期 GT锁仓挖矿赚USDG,总额度 3,000,000GT,锁仓期限7天。[2021/4/17 20:31:02]

这样你就可以为两个版本的ERC-20合约做错误处理。

怎样支持所有token

现在你已经支持了ERC-20标准的token,然而有相当多的token看起来像ERC-20,但是它的有些行为却不像,有些出现缺少返回值的错误。

有一段时间,OpenZeppelin有一个bug,他们在失败的时候回退交易,但没有在成功时返回true。这个bug让很多token都受到了影响,包括USDT、OmiseGo和BNB。你期望返回一个布尔值,却没有任何值返回,这种情况,如果用Solidity0

其先检查返回数据的大小,如果是0,我们就假定它是行为不正常的token。如果调用没有回退交易,那就意味着交易成功了,应该返回true。

Gate.io将按35000MBL:1CBK比例为MBL用户空投CBK:据官方公告,Gate.io 将按照2020年12月23日(明日)14:00用户持仓MBL的快照为用户空投Cobak代币CBK,空投比例为:35000MBL:1CBK。Gate.io平台用户无需任何操作即可领取空投,平台外用户请于快照前充值MBL到Gate.io平台,并保持在快照时账户有足够余额。[2020/12/22 16:06:14]

随着Solidity的版本更新,我们可以简化这段代码,像Uniswap是这样做的:

functionsafeTransfer(addresstoken,addressto,uintvalue)internal{//bytes4(keccak256(bytes('transfer(address,uint256)')));(boolsuccess,bytesmemorydata)=token

这种实现方法只是稍有不同而已,因为abi

你应该怎么做?

Gate.io将于7月27日12点开启第六期单个投票上币Kusama(KSM):据官方公告,Gate.io将于2020年7月27日中午12:00开启第六期单个投票上币活动,截止时间为7月28日中午12:00。本次上线币种为Kusama(KSM),所有持有GT的平台用户均可参与。活动中Kusama如获得1000万票则为胜出,Gate.io 将上线KSM对USDT交易,参与投票的用户均可按照投票数占活动总票数比例分享活动代币奖励。[2020/7/23]

那么,现在最好的方法是什么呢?一个很简单的方法就是,使用OpenZeppelinSafeERC20来实现。

这是一个围绕ERC-20调用的包装库。不要感到困惑,这不是为了创建自己的token,而是为了安全地交易。SafeERC20的实现基本上就是像上面的Uniswap版本一样,你可以像下面这样用它:

import"https://github

}

本翻译由CellNetwork赞助支持。

来源:https://soliditydeveloper.com/safe-erc20

参考资料

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

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

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

DAI:https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f#code

这里:https://etherscan.io/address/0xe41d2489571d322189246dafa5ebde1f4699f498#code

代码:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

try/catch:https://solidity.readthedocs.io/en/latest/control-structures.html#try-catch

缺少返回值的错误:https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca

影响到了Uniswap:https://twitter.com/UniswapProtocol/status/1072286773554876416

Compound版本:https://github.com/compound-finance/compound-money-market/blob/241541a62d0611118fb4e7eb324ac0f84bb58c48/contracts/SafeToken.sol#L97

Uniswap是这样做的:https://github.com/Uniswap/uniswap-lib/blob/9642a0705fdaf36b477354a4167a8cd765250860/contracts/libraries/TransferHelper.sol#L13-L17

OpenZeppelinSafeERC20:https://docs.openzeppelin.com/contracts/3.x/api/token/erc20#SafeERC20

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

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

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

登链社区

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

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

入驻指南:

/apply_guide/

本文网址:

/news/10381498.html

免责声明:

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

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

上一篇:

每周编辑精选WeeklyEditors'Picks

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

莱特币价格COM:关于关闭ZEC充提币的公告

尊敬的用户: 因节点升级,WBF暂时关闭ZEC的充提币,给您带来的不便,敬请谅解。扫码加入WBF官方QQ群 WBF风险提示: IMF总裁:跨机构合作对CBDC非常重要,将发布两份关于CBDC的文.

pepe最新价格PERP:Perpetual Protocol (PERP)

一、项目介绍 PerpetualProtocol是一个去中心化永续合约协议,由虚拟自动做市商实现。通过PerpetualProtocol,交易者可以通过vAMM交易永续合约,而无需对手方.

[0:31ms0-4:117ms