《史记》第一百二十九章有言“天下熙熙,皆为利来;天下攘攘,皆为利往。”这句话的意识是指普天之下的芸芸众生都在为各自的利益与诉求而奔波。从狭义的角度来看,Solidity有关合约的操作,都避免不了“资金的消耗与传递”,视乎没有利益的交换,合约就进行不下去了。但从广义的视角来说,Solidity合约的利益交换,有别于传统的交换模式。它基于无中心管理的地址,实现了新型的去信任的利益交换。
实验目的
1. 初步了解Solidity中固有的全局变量。
2. 明白如何实现有关地址的三个简单操作(transfer,balance,send)与transfer和send的区别。
3.尝试理解fallback与receive函数的作用。
实验要求
1. 请先将下面的代码拷贝到编译器上,按照注释1的要求补充好代码。完成后,可去官网查看其他的固定全局变量,试着替换它们。
2. 请依次按照注释2,3,4,5,6的要求补充好代码。完成后,请思考为什么send方法可以返回,而transfer不需要返回值?它们虽然都是转账,区别又是什么?
3. 当完成上面6个要求后,请完成以下操作测试函数功能是否正常。
①调用transfer函数,给账户2转2个Ether(注意1etrher = 10的18次方wei) ,查看两个账户余额是否正常变化。
②账户3调用transferToContractAccount函数给合约地址转5个Ether;再用账户4调用transferToContractAccount函数给合约地址转20个Ether。
③调用getBalance函数,查看合约地址的余额是否为25Ether。
④账户5调用send函数,给账户1转10个Ether。再调用withdraw函数,取出全部合约的余额。检查账户5的余额是否为115个Ether。如果结果一致,则补充的代码逻辑正常。
4. 请你将最后面的fallback与receive函数注释掉。重新编译,检查是否会报错。思考这两个函数的作用。
以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract transferTest{
//1.请你补充代码,依次返回消息的发送者,当前区块难度,交易发起者。
function getGlobleProperties() public view returns(address,uint,address){
//**1**;
}
//2.请你补充代码,使用transfer方法,实现给任意接受者转任意数额。
function transfer(address reciver,uint value) public payable {
//**2**
}
//3.请你补充代码,使用transfer函数,实现给本合约地址转任意数额。
function transferToContractAccount() public payable{
//**3**
}
//4.请你补充代码,使得调用该函数的人可以取出本合约的余额。
function withdraw()public payable{
//**4**;
}
//5.请你补充代码,使得该函数可以查询任意地址的余额。
function getBalance(address account)public view returns(uint){
//**5**;
}
//6.请你补充代码,使用send方法,实现给任意接收者转任意数额,并返回。
function send(address receiver)public payable returns(bool){
//**6**;
}
fallback()external payable{}
receive()external payable{}
}
下面是本次实验所配套的视频教程:
