Back

blockchain - solidity - function 中的external, public, internal, private 区别在于gas 费和 参数所在的位置

发布时间: 2022-07-06 06:32:00

refer to:
https://stackoverflow.com/questions/70019983/what-is-difference-between-internal-and-private-in-solidity

private: 只能被自身访问, 不能被继承的类访问

internal: 无法被其他合约访问,可以被自身访问, 可以被继承的类访问

external: 只能被其他合约或者地址访问,不能被真身和继承的类直接访问 (太奇怪了)

public:  无所禁忌

1. public 可以被任何方法访问,东西放在了memory 中,所以耗费的gas多一些 (例如 460+)

2. external 不能被internal访问, 参数等直接在callback中, 不需要转移到memory 中,所以耗费的gas少很多(例如200+)

view方法,如果调用了event log, 则肯定会消耗gas, 此时就不能用view方法(把view去掉)

例如:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TestVariable {

  string message;
  uint256 amount;

  event ShowVar(string name, address value);
  event ShowVar(string name, string value);
  event ShowVar(string name, uint value);

  function setMessage(string memory _message) public {
    message = _message;
  }

  function getMessage() public view returns(string memory){
    return message;
  }

  function setAmount(uint256 _amount) public{
    amount = _amount;
  }

  function getAmount() public view returns(uint256) {
    return amount;
  }

// 这里就不能声明成view方法
// 这里调用了3个 ShowVar Event, 所以最后tx生成的同时,还会有3个EventLog出来。 function printVariables() public{ emit ShowVar("msg.sender", msg.sender); emit ShowVar("amount", amount); emit ShowVar("message", message); } }

Back