跳到主要内容

函数

函数定义

符合格式: function 函数名(参数类型 参数名) 修饰符 returns(返回值类型) {}

例如

function add (uint a, uint b) returns(uint){
return a + b;
}

返回值

  • 使用关键字 returns 确定返回值
  • 支持多返回值
    • returns支持赋予返回值值名称,此时不需要显示指定return
    • 使用关键字 multipleReturns 时可以不写 returns
function returnMany() public pure returns(uint, bool, uint) {
return (1, true, 2);
}

// 隐式返回
function assigned() public pure returns(uint x, bool b, uint y) {
x = 10;
b = false;
y = 10;
}

function multipleReturns () {
uint a;
uint b;
uint c;
(a, b, c) = multipleReturns()
}

Modifier

Modifier 是可以在函数调用之前运行的代码, 相当于函数的运行前的 hook

// 定义 modifier 要求执行人必须是合约的所有者
// _;表示执行函数体内的代码
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_; // 调用 onlyOwner 的函数的内部代码
}

modifier validAddress(address _addr) {
require(_addr != address(0), "Not valid address");
_;
}

// 执行该函数前会先去执行 onlyOwner 和 validAddress, 如果都通过则才会去执行后续代码
function changeOwner(address _newOwner) public onlyOwner validAddress(_newOwner) {
owner = _newOwner;
}

pure / view

  • view 告诉我们运行这个函数不会更改和保存任何数据, 用于读取链上数据
  • pure 告诉我们这个函数不但不会往区块链写数据,它甚至不从区块链读取数据。

这两种在被从合约外部调用的时候都不花费任何 gas

contract ViewAndPure {
uint public x = 1;

// 没有修改链上的数据x, 仅仅只是读取x的值
function addToX(uint y) public view returns (uint) {
return x + y;
}

// 没有修改链上的数据, 也没有读取链上的值x
function add(uint i, uint j) public pure returns (uint) {
return i + j;
}
}