如何通过智能合约以Ether为单位向其他账户转账ETH
Solidity 支持直接以Ether为单位传参的转账合约修改方法
以太坊底层转账逻辑默认使用最小单位Wei做计算,1 Ether = 10^18 Wei,Solidity本身内置了单位常量,不需要手动计算换算值,只需要在调用转账方法时把传入的Ether单位金额乘上内置的ether常量,就能自动得到对应Wei值完成转账。
核心修改逻辑
- 补全原函数缺失的函数名,把参数语义明确为Ether单位的金额
- 转账时将传入的Ether金额乘以
1 ether内置常量,自动换算为Wei单位传入转账方法 - 可选增加金额校验、转账结果校验,避免异常交易
修改后代码示例
基础兼容版本(适配所有Solidity版本)
// 提前定义好转账目标地址,替换为实际收款地址即可 address public someaddress = 0x1234567890123456789012345678901234567890; /** * @param amountInEther 转账金额,单位为Ether,传1代表转1个ETH */ function transferEth(uint amountInEther) public payable { // 可选校验:调用方转入合约的ETH数量需和指定转账金额一致,避免错配 require(msg.value == amountInEther * 1 ether, "转入的ETH金额和参数不匹配"); // 单位换算后执行转账 someaddress.transfer(amountInEther * 1 ether); }
Solidity 0.8+ 推荐版本
原生transfer()方法有固定2300gas的限制,如果收款地址是带fallback逻辑的合约,很容易转账失败,0.8版本更推荐用call方法完成转账:
function transferEthV2(uint amountInEther) public payable { require(msg.value == amountInEther * 1 ether, "转入的ETH金额和参数不匹配"); // 执行转账,不限制gas (bool success, ) = someaddress.call{value: amountInEther * 1 ether}(""); // 校验转账结果,失败则回滚交易 require(success, "ETH转账执行失败"); }
注意事项
- Solidity的
ether是编译期常量,1 ether编译时会直接替换为1000000000000000000的数值,不会额外消耗gas,比手动写10**18可读性更强,也不会出现数错0的问题。 - 如果是从其他Solidity合约内部调用这个方法,直接传
1 ether/0.01 ether这类带单位的字面量也完全兼容,不会出现换算错误。 - 如果业务场景不需要用户转ETH进合约,而是用合约本身持有的ETH做转账,可以去掉
payable修饰符和对应的msg.value校验逻辑,直接做单位换算后转账即可。
内容的提问来源于stack exchange,提问作者Tarandeep singh
相关产品推荐
相关产品推荐

