blockchain - solidity - function 中的external, public, internal, private 区别在于gas 费和 参数所在的位置
访问量: 709
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); } }