Solidity学习—函数

基本定义

function function_name(<param_type> <param_name>) <visibility> <state mutability> [returns(<return_type>)] {...}

可见性(visibility)

  • Private(私有):函数只能在所定义的合约内部调用
  • Internal(内部):函数只有合约内部及继承合约才能调用
  • External(外部):只有智能合约外部才能调用函数
  • Public(公开):可以从任何地方调用

状态可变性(mutability)

  • view:用view声明的函数只能被读取,不能被修改
  • pure:用pure声明的函数既不能被读取也不能被修改
  • payable:用payable声明的函数可以接收发送给合约的以太坊,若没声明payable则拒绝所有发送给它的以太币

使用viewpure关键字定义的函数不会改变以太坊的状态,即不会发送交易,仅为本地执行结果

特殊函数

Getter函数

定义为public的状态变量具有getter函数,该函数由编译器自动创建。该函数与变量具有相同的名称,并且具有外部可见性。

contract C {
	uint public data;
	function x() public returns (uint) {
		data = 3; //内部访问
		return this.data(); // 外部访问
	}
}

receive函数

合约最多可以具有一个receive函数,该函数不能有参数和返回值,可见性为external,状态可变性为payable

当向合约发送Ether且未指定调用任何函数(calldata为空)时执行。(例如通过transfer()或者send()转账)

receive() external payable{...}

Fallback函数

合约最多可以具有一个fallback函数,该函数不能有参数和返回值,可见性为external,如果其他函数均不匹配给定的函数签名,或者根本没有提供任何数据并且没有receive函数,则在调用合约时执行该函数。

fallback() external [payable] {
	...
}

函数修饰器

在执行函数前的检查条件,可以封装为修饰器,例如检查合约发件人是否是合约所有者

modifier onlyOwner() {
	require(msg.sender == owner, "this function is restricted to the owner");
	_; // will be replaced by the code of the function
}

用修饰器声明函数:

function searchBalance() external OnlyOwner {
...
}

用空格分隔的列表中指定多个修饰器,可以将它们应用到一个函数,并按给出的顺序对其进行应用

posted @ 2021-10-03 16:02  QXP-九九  阅读(324)  评论(0)    收藏  举报