一、solidity中的高级类型函数类型(Function types):函数类型表示一个函数,可以用于将函数作为参数传递给其他函数或将函数赋值给变量。函数类型可以声明为external
或internal
。external
函数只能在外部调用,而internal
函数可以在合约内部和继承的合约中调用。
如下合约中:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.8;
contract Storage {
uint256 number;
uint256 public shownumber;
/**
* @dev Store value in variable
* @param num value to store
*/
function store(uint256 _num) public {
number = num;
shownumber = num;
}
/**
* @dev Return value
* @return value of 'number'
*/
function retrieve() public view returns (uint256){
return number;
}
}
remix部署(每一次部署就是发起一次交易,我们在链上做任何修改操作就是发起一次交易),如下图显示:
shownumber是可以看到的,因为该变量为显示声明。
二、在Solidity中,函数和变量的可见性由以下四个标识词控制:
1、public
:此标识词表示函数或变量可以在任何地方访问,包括在当前合约、继承的合约以及其他合约中。对于函数,Solidity还会自动生成一个与之关联的公开getter函数,以方便从外部访问该变量。
uint public myPublicVariable;
function myPublicFunction() public {
// ...
}
2、private
:此标识词表示函数或变量仅在声明它们的合约内部可访问。继承的合约和其他合约无法访问private
函数和变量。
uint private myPrivateVariable;
function myPrivateFunction() private {
// ...
}
3、internal
:此标识词表示函数或变量可以在声明它们的合约以及继承该合约的合约中访问。其他合约无法访问internal
函数和变量。internal
是默认的可见性级别,如果未指定其他可见性标识词,则使用此级别。
uint internal myInternalVariable;
function myInternalFunction() internal {
// ...
}
4、external
:此标识词仅用于函数,表示该函数只能从合约外部调用,不能在合约内部调用(除非使用this
关键字)。在合约外部调用external
函数比调用public
函数更节省Gas。
function myExternalFunction() external {
// ...
}
选择合适的可见性级别可以确保合约的安全性和模块化。对于不需要从外部访问的函数和变量,使用private
或internal
可见性可以减少潜在的安全风险。同时,使用external
可见性可以在适当的情况下节省Gas成本。
三、在Solidity中,有两个标识符可用于标记函数,使得在调用这些函数时不消耗Gas。这两个标识符分别是view
和pure
。
view
:view
函数表示该函数不会修改区块链上的状态(即不会更改存储变量的值、发出事件或创建其他合约等)。view
函数通常用于读取区块链上的数据。当通过Web3库(如web3.js或web3.py)在本地节点调用view
函数时,不会消耗Gas。
function getMyValue() public view returns (uint) {
return myValue;
}
pure
:pure
函数比view
函数的限制更严格。除了不能修改区块链状态之外,pure
函数还不能访问区块链上的任何数据(包括合约的存储变量、区块信息和交易信息等)。pure
函数通常用于处理输入参数并返回计算结果。与view
函数一样,通过Web3库在本地节点调用pure
函数时,不会消耗Gas。
function add(uint a, uint b) public pure returns (uint) {
return a + b;
}
需要注意的是,当view
或pure
函数作为合约的一部分被调用时(例如在另一个函数中调用它们),仍然会消耗Gas。这是因为合约内部的函数调用需要执行和处理,这些操作在EVM中仍然消耗Gas。仅当从外部(即通过Web3库)调用view
和pure
函数时,才不消耗Gas。