Solidity中internal与private修饰符的区别是什么?
Solidity中private与internal访问权限的具体差异
二者的共性是仅在合约体系内部可见,部署后均不会出现在公开ABI中,外部账户、无继承关系的第三方合约都无法直接调用,对外完全不可见。核心差异仅存在于继承链的访问权限规则中:
- 继承场景访问权限不同
internal修饰的函数、状态变量,允许当前合约的所有子合约(即所有继承了该合约的派生合约)直接访问、重写,是Solidity默认的访问权限修饰符(未显式声明修饰符的状态变量/函数默认是internal)private修饰的函数、状态变量,仅允许在定义它的合约本身内部访问,即便是继承了该合约的子合约也完全无法读取、修改、调用,更不能重写
参考示例代码:
// 父合约 contract BaseContract { uint internal internalVal = 10; uint private privateVal = 20; function internalFunc() internal pure returns(string memory) { return "internal function"; } function privateFunc() private pure returns(string memory) { return "private function"; } } // 继承父合约的子合约 contract DerivedContract is BaseContract { function testAccess() public view returns(uint, string memory) { // 合法:可以访问父合约的internal属性、方法 uint getInternalVal = internalVal; string memory getInternalRes = internalFunc(); // 以下两种写法都会直接触发编译报错,无法访问父合约的private属性、方法 // uint getPrivateVal = privateVal; // string memory getPrivateRes = privateFunc(); return (getInternalVal, getInternalRes); } } - 存储布局差异(进阶注意项)
private修饰的状态变量不会影响子合约的存储布局规则,子合约可以定义和父合约private变量同名的变量,不会产生存储冲突;而internal变量如果子合约定义同名变量会产生覆盖问题,开发时需要注意。
内容的提问来源于stack exchange,提问作者Adam Kozlowski
相关产品推荐
相关产品推荐

