如图一所示我使用solidity编写了发送eth的合约SendEth和接收eth的合约EthReceiver,并且在部署的时候已经向SendEth合约发送了1eth的代币
然而当我调用SendEth里面的函数sendViaTransfer的时候,查看日志里面显示的from的地址并不是SendEth合约的地址,而是另外一个没见过的地址。
我也想过有没有可能是使用者的地址,但是如果是使用者的地址那为什么能使用合约地址中的ETH?
如图一所示我使用solidity编写了发送eth的合约SendEth和接收eth的合约EthReceiver,并且在部署的时候已经向SendEth合约发送了1eth的代币
然而当我调用SendEth里面的函数sendViaTransfer的时候,查看日志里面显示的from的地址并不是SendEth合约的地址,而是另外一个没见过的地址。
我也想过有没有可能是使用者的地址,但是如果是使用者的地址那为什么能使用合约地址中的ETH?
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
您想要解决的问题是在编写智能合约时,使用sendViaTransfer
函数发送ETH时,日志显示的from
地址不是SendEth合约的地址,而是另一个未知地址。您希望了解为什么会出现这个问题,并寻求解决方案。
SendEth
合约的代码,包括合约的构造函数、三个发送ETH的函数(sendViaTransfer
、sendViaSend
、sendviacall
),以及一个EthReceiver
合约的代码片段,该合约包含一个接收ETH的receive
函数和一个返回合约余额的getBalance
函数。SendEth
合约时的一些信息,包括合约地址、交易成本、执行成本,以及合约的余额。问题出现的原因是在调用sendViaTransfer
函数时,Solidity中的.transfer()
方法实际上是从调用者的地址发送ETH,而不是合约的地址。这意味着,尽管ETH是从合约中发送的,但from
地址显示的是调用该函数的外部账户地址。
为了确保from
地址是合约的地址,您可以使用.call.value()
方法代替.transfer()
方法。.call.value()
方法允许您从合约的地址发送ETH,并且可以附加额外的参数。
以下是修改后的sendViaTransfer
函数的代码:
function sendViaTransfer(address payable _to) external payable {
(bool success,) = _to.call{value: 123}("");
require(success, "send fail");
emit look(msg.sender);
}
要运行这段代码,您需要以下环境和步骤:
如果代码正确部署并且sendViaTransfer
函数被正确调用,您应该能够看到日志中显示的from
地址是SendEth合约的地址,并且目标地址收到了指定数量的ETH。