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