国库是随着人类社会的进步,社会生产力水平的提高,国家的产生而发展起来的,是社会生产发展到一定阶段的必然产物。Solidity中的合约地址类似于一个小小的“国库”,它由合约拥有者所管理。任何无明确接受者的金额交易最终都会归为“国库”所有。

实验目的

1. 明白空方法体的payable函数默认转账地址

2. 了解在transfer方法中自定义转账数额与传入转账数额同在时,数额的流向情况。

实验要求

1. 查看函数pay,思考空方法体的payable函数,转账会给哪个地址?然后进行操作验证。首先编译部署改合约,调用getContractBalance函数,查看合约余额(为0)。接着在部署页面的VALUE那输入转账数额5(ether),注意变换单位,再调用pay函数。查看账户一余额是否为正常(余额大约为95ether)。再次调用getContractBalance函数,这时地址账户余额为5ether(显示的余额是以wei为单位的)。这时你就清楚空方法体的payable函数默认会给谁转账。

2. 请按照ToAccount2,transferToAccount3函数的注释,修改或补充好代码。修改补充完后,请你用ToAccount2函数,给账户二转30ether。此时你的账户一大约有65ether,账户二有130ether。 这是常规的transfer函数的转账,接下来我们看看特殊的转账。

3. 请你查看ToAccount2与transferToAccount3函数,除了接受地址与函数名不一样,还有什么地方不同?请你思考一下如果在部署界面的VALUE那输入30ether,再调用transferToAccount3函数,它的资金流向是怎样的?

思考完后,请进行操作检查。

①在部署界面VALUE那输入30(ether),再调用transferToAccount3函数。

②查看账户一,账户三和合约地址的余额。

③总结函数transferToAccount3函数的资金流向,思考其与空方法体payable函数的关系。

以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验

// SPDX-License-Identifier: GPL-3.0
pragma solidity^0.8.0;
contract transfer{
//思考空方法体的payable函数默认会给哪个地址转账?
    function pay() public payable{
    }
    function getContractBalance()public view returns(uint){
        return address(this).balance;
    }
//请拷贝你账户二的地址赋值给account2,并去掉方法体里的注释。    
    function ToAccount2()public payable{
    //    address account2 =**账户2**;
    //    payable(account2).transfer(msg.value);
    }
//请拷贝你账户三的地址赋值给account3,拷贝完记得转回账户一。并去掉方法体里的注释。    
    function transferToAccount3()public payable{
    //    address account3 =**账户3**;
    //    payable(account3).transfer(10 ether);
    }
}


下面是本次实验所配套的视频教程: