Solidity合约withdraw函数疑问:address(0)与payable转换解析
Solidity Withdraw函数核心疑问解析
先明确这个withdraw函数的作用:只有合约的所有者(因为加了onlyOwner修饰符)能调用它,用来把合约里的资产(ETH或者ERC20代币)提取到自己的地址。
1. 为什么要判断token == address(0)?
以太坊里,address(0)是一个固定的全0地址(0x0000000000000000000000000000000000000000),它是行业约定俗成的标记,专门用来代表原生ETH。
- ERC20代币都有自己的合约地址,但ETH是以太坊的原生货币,没有对应的合约地址,所以用这个全0地址区分「提取ETH」和「提取ERC20代币」两种逻辑:
- 如果传入的
token参数是address(0),就执行ETH转账流程; - 如果是其他地址,就执行对应ERC20代币的转账流程。
- 如果传入的
2. payable(_msgSender()).transfer(amount)拆解
_msgSender():Solidity内置函数,返回当前调用这个函数的地址。因为函数有onlyOwner限制,所以这个地址就是合约所有者的地址。payable():以太坊的地址分两种类型,普通地址无法接收ETH,只有「可支付地址(payable address)」才能接收ETH。_msgSender()返回的地址默认是普通地址,必须用payable()把它转换成可支付地址,否则没法完成ETH转账。.transfer(amount):这是Solidity内置的ETH转账方法,它会自动完成ETH转移,而且自带2300 gas的限制(这个限制是为了防范恶意合约的重入攻击)。如果合约里的ETH余额不足,或者转账失败,整个交易会直接回滚。
整个函数的完整流程
只有合约所有者能调用该函数,传入两个参数:
- 要提取ETH时,传
address(0)作为token,再传入要提取的ETH数量; - 要提取某个ERC20代币时,传该代币的合约地址作为
token,再传入代币数量;
函数会根据token参数的类型,把对应资产转到所有者的地址。
内容的提问来源于stack exchange,提问作者lloop
相关产品推荐
相关产品推荐

