区块链学习(5) – solidity函数
  n52Qc2vwKhjY 2023年11月02日 55 0

一、solidity中的高级类型函数类型(Function types):函数类型表示一个函数,可以用于将函数作为参数传递给其他函数或将函数赋值给变量。函数类型可以声明为externalinternalexternal函数只能在外部调用,而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部署(每一次部署就是发起一次交易,我们在链上做任何修改操作就是发起一次交易),如下图显示:

区块链学习(5) – solidity函数_外部调用


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 {
    // ...
}

选择合适的可见性级别可以确保合约的安全性和模块化。对于不需要从外部访问的函数和变量,使用privateinternal可见性可以减少潜在的安全风险。同时,使用external可见性可以在适当的情况下节省Gas成本。


三、在Solidity中,有两个标识符可用于标记函数,使得在调用这些函数时不消耗Gas。这两个标识符分别是viewpure

  1. viewview函数表示该函数不会修改区块链上的状态(即不会更改存储变量的值、发出事件或创建其他合约等)。view函数通常用于读取区块链上的数据。当通过Web3库(如web3.js或web3.py)在本地节点调用view函数时,不会消耗Gas。
function getMyValue() public view returns (uint) {
    return myValue;
}
  1. purepure函数比view函数的限制更严格。除了不能修改区块链状态之外,pure函数还不能访问区块链上的任何数据(包括合约的存储变量、区块信息和交易信息等)。pure函数通常用于处理输入参数并返回计算结果。与view函数一样,通过Web3库在本地节点调用pure函数时,不会消耗Gas。
function add(uint a, uint b) public pure returns (uint) {
    return a + b;
}

需要注意的是,当viewpure函数作为合约的一部分被调用时(例如在另一个函数中调用它们),仍然会消耗Gas。这是因为合约内部的函数调用需要执行和处理,这些操作在EVM中仍然消耗Gas。仅当从外部(即通过Web3库)调用viewpure函数时,才不消耗Gas。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
n52Qc2vwKhjY