You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:15:08