文章目录
Solidity函数可见性修饰符(public、external、internal、private)
在Solidity中,public、private、internal和external是四个不同的访问修饰符,用于限定函数或状态变量的可见性和可访问性。
public(公共)
- 公共函数可以被合约内部的其他函数调用,也可以通过合约的外部调用接口(ABI)被外部账户或合约调用。
- Solidity会为公共函数生成一个函数选择器,并将其添加到合约的 ABI 中,从而允许外部调用者调用该函数。
- 这种函数可以被继承的合约访问。
pragma solidity ^0.8.0;
contract Example {
uint public myNumber; // 公共状态变量
function setNumber(uint _num) public { // 公共函数
myNumber = _num;
}
}
从合约内部调用公共函数时,函数的上下文(如msg.sender)会被重置为合约的地址。
external 只能被外部地址调用
external:表示函数只能被外部地址调用,即只能通过交易来调用。这通常用于将合约暴露给外部世界,例如公开的接口函数。
外部函数(external functions)只能被合约外部的调用者访问,而
不能从合约内部或其他合约中直接调用
。
private
private修饰符表示函数或状态变量仅能在当前合约内部访问。私有函数和状态变量对于外部地址是不可见的,只能在合约内的其他函数中使用。私有函数对于代码封装和内部逻辑的隐藏非常有用。
只能在当前合约内部调用,不能从合约的派生合约中调用。
internal
internal修饰符表示函数或状态变量可以在当前合约内部以及继承合约中进行访问。**与private修饰符不同,internal修饰符允许继承的合约访问被修饰的函数或状态变量。**对于需要在合约继承链中共享的内部逻辑,使用internal修饰符是有用的。
只能在当前合约或继承自当前合约的合约内部被读取。
状态变量的访问权限
- view 对状态变量只读,这里的状态变量还包含区块链的内建对象数据、时间戳等
- pure 既不修改,也不读取状态变量的值
如果函数不加pure或view,则代表会修改状态变量的值!
总结
函数的访问权限:
- public 最大的访问权限,子类可以继承、可以访问,当前类能访问
- private 仅限内部访问,子类不能继承、不能访问
- internal 子类可以继承、可以访问,当前类可以访问
- external 子类可以继承、可以访问,当前类不能访问
internal 和 private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。
external 与public 类似,只不过这些函数只能在合约之外调用 - 它们不能被合约内的其他函数调用。