转账时拆分ETH
Splitting ETH when transferring
如果你能帮我解决这个简单的问题,我将不胜感激!
我想在智能合约中拆分资金:10% 给我朋友,90% 给我。我创建了一个变量,在withdraw()函数中写了如下代码:
address private constant _friend = 0xAb8483F64d9C6d1EcF9b849Aeblablalbasomeaddress;
在合同开始时:
function withdraw() public payable onlyOwner {
uint balance = address(this).balance;
payable(msg.sender).transfer(balance / 100 * 10);
payable(_friend).transfer(balance / 100 * 90);
}
我在测试网上对此进行了测试,但我有点偏执。此代码有效吗?
为什么我觉得这可能有问题?
发送ETH的时候是要交手续费的,所以如果我发送msg.sender,那么我发送这个90%+佣金,我有足够的钱发送10%吗?
payable(msg.sender).transfer(balance / 100 * 10);
payable(_friend).transfer(balance / 100 * 90);
对于可被 100 整除的金额(以 wei 为单位),这将按预期工作。不能被 100 整除的金额将导致舍入错误,因为您正在处理 整数[=65 的除法=](不是小数)。所以你们中的任何一个都可能比预期的少一点。
示例:
balance
= 200魏
msg.sender
得到 (200 / 100) * 10 = (2) * 10 = 20
_friend
得到 (200 / 100) * 90 = (2) * 90 = 180
balance
= 150魏
msg.sender
得到 (150 / 100) * 10 = (1) * 10 = 10
_friend
得到 (150 / 100) * 90 = (1) * 90 = 90
- 剩余60wei留在合约地址
Solidity 从左边解析两个运算符。因此,它首先计算 balance / 100
,然后将结果乘以 10
或 90
。
When sending ETH, you have to pay a commission
您可能是指汽油费。这是由执行 withdraw()
函数的地址在交易 value
之上支付的。汽油费 不会 影响将由每个 transfer()
函数生成的内部交易(及其 value
)。
示例:
您正在发送 1 个 ETH(或 1000000000000000000
wei)value
以及执行 withdraw()
函数的交易。汽油费为 0.001 ETH,因此您支付的总金额为 1.001 ETH。但是,费用转到了网络,因此合约仍然只收到 1 ETH 的 value
。
然后它被分成两个内部交易 - 0.1 ETH 给你(作为 msg.sender
)和 0.9 ETH 到 _friend
地址。这些内部交易的 gas 费已经包含在主交易(第 1 点)费用中。
如果你能帮我解决这个简单的问题,我将不胜感激!
我想在智能合约中拆分资金:10% 给我朋友,90% 给我。我创建了一个变量,在withdraw()函数中写了如下代码:
address private constant _friend = 0xAb8483F64d9C6d1EcF9b849Aeblablalbasomeaddress;
在合同开始时:
function withdraw() public payable onlyOwner {
uint balance = address(this).balance;
payable(msg.sender).transfer(balance / 100 * 10);
payable(_friend).transfer(balance / 100 * 90);
}
我在测试网上对此进行了测试,但我有点偏执。此代码有效吗?
为什么我觉得这可能有问题? 发送ETH的时候是要交手续费的,所以如果我发送msg.sender,那么我发送这个90%+佣金,我有足够的钱发送10%吗?
payable(msg.sender).transfer(balance / 100 * 10);
payable(_friend).transfer(balance / 100 * 90);
对于可被 100 整除的金额(以 wei 为单位),这将按预期工作。不能被 100 整除的金额将导致舍入错误,因为您正在处理 整数[=65 的除法=](不是小数)。所以你们中的任何一个都可能比预期的少一点。
示例:
balance
= 200魏msg.sender
得到 (200 / 100) * 10 = (2) * 10 = 20_friend
得到 (200 / 100) * 90 = (2) * 90 = 180
balance
= 150魏msg.sender
得到 (150 / 100) * 10 = (1) * 10 = 10_friend
得到 (150 / 100) * 90 = (1) * 90 = 90- 剩余60wei留在合约地址
Solidity 从左边解析两个运算符。因此,它首先计算 balance / 100
,然后将结果乘以 10
或 90
。
When sending ETH, you have to pay a commission
您可能是指汽油费。这是由执行 withdraw()
函数的地址在交易 value
之上支付的。汽油费 不会 影响将由每个 transfer()
函数生成的内部交易(及其 value
)。
示例:
您正在发送 1 个 ETH(或
1000000000000000000
wei)value
以及执行withdraw()
函数的交易。汽油费为 0.001 ETH,因此您支付的总金额为 1.001 ETH。但是,费用转到了网络,因此合约仍然只收到 1 ETH 的value
。然后它被分成两个内部交易 - 0.1 ETH 给你(作为
msg.sender
)和 0.9 ETH 到_friend
地址。这些内部交易的 gas 费已经包含在主交易(第 1 点)费用中。