5 帮忙解析下这个函数

在练习中看到一段代码,在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值又如何设定或者修改? 这个函数到底是合约对外转账,还是外部账号转账给合约?

麻烦帮忙详细解析下,谢谢!

请先 登录 后评论

最佳答案 2022-02-14 09:47

/** 发送调用者的交易金额的一半到指定账户
 * @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地址的归属

请先 登录 后评论

其它 3 个回答

ezio
请先 登录 后评论
bugfly
请先 登录 后评论
合约开发 - 开发工程师
请先 登录 后评论