在练习中看到一段代码,在Remix中也进行了测试,但是实在没搞懂这个函数的用途。麻烦帮忙解析下。 contract Sharer {
function sendHalf(address payable addr) public payable returns (uint balance){
require (msg.value % 2 == 0,"Even value required.");
uint balanceBeforeTranfer = address(this).balance;
addr.transfer(msg.value / 2);
assert(address(this).balance == balanceBeforeTranfer - msg.value/2);
return address(this).balance;
}
当外部账号A调用该B合约的sendHalf方法,此时的addr应该填入谁的地址? 此处的msg.value值又如何设定或者修改? 这个函数到底是合约对外转账,还是外部账号转账给合约?
麻烦帮忙详细解析下,谢谢!
/** 发送调用者的交易金额的一半到指定账户
* @addr 接收交易金额一半的账户
* @return 返回转账后的账户余额
*/
function sendHalf(address payable addr) public payable returns (uint balance){
// 验证交易金额为2的倍数
require (msg.value % 2 == 0,"Even value required.");
// 获取调用者的账户余额
uint balanceBeforeTranfer = address(this).balance;
// 转账交易金额的一半到addr地址
addr.transfer(msg.value / 2);
// 验证调用者余额已经扣减
assert(address(this).balance == balanceBeforeTranfer - msg.value/2);
// 返回调用者当前余额
return address(this).balance;
}
单从这个函数不能确定addr到底是合约地址还是什么地址,需要结合上下文确定
当外部账号A调用该B合约的sendHalf方法,此时的addr应该填入谁的地址? 这要视合约的逻辑来确定,addr地址接收交易的一半金额
此处的msg.value值又如何设定或者修改? msg.value是合约调用时设计的交易金额,如果web3调用的话可以参考:https://learnblockchain.cn/docs/web3.js/web3-eth-contract.html#methods-mymethod-send
这个函数到底是合约对外转账,还是外部账号转账给合约? 合约调用者向外addr地址转账,取决于addr地址的归属