solidity基础 -- 可视范围

        在 Solidity 编程语言中,可视范围(Visibility)用于控制合约中变量和函数的访问权限。这对于确保合约的安全性、模块化以及代码的可维护性至关重要。Solidity 提供了四种可视范围修饰符:publicprivateexternal 和 internal。以下将结合给定代码进行详细介绍。

        注意:使用继承时请确保代码的正确性,以防丢失个人财产,在这里友情提示您,不要复制来源不明的solidity代码并进行部署。本文为自己梳理总结,如有不足还请指出,感谢包容。

        学习更多solidity知识请访问 Github -- solidity基础 ,更多实例在 Smart contract

  • public:外部和内部可见(为 storage/state 变量创建 getter 函数)

    private:仅在当前合同中可见

    external:仅在外部可见(仅适用于函数)- 即只能通过消息调用(通过this.func)

    internal:仅在内部可见,合约内部进行调用

 

1. public 可视范围

  • 定义:具有 public 可视范围的变量或函数在合约内部和外部都可见。对于状态变量(storage 变量),Solidity 会自动为其创建一个 getter 函数,使得外部合约或用户可以通过该 getter 函数访问该变量的值。
  • 实例:在 VisibilityBase 合约中,uint public z = 2; 声明了一个 public 状态变量 z。外部合约或用户可以通过调用 getter 函数(例如 contractInstance.z())来获取 z 的值。同时,在合约内部,其他函数也可以直接访问 z。例如:
function accessZ() public view returns (uint) {
    return z;
}

 

2. private 可视范围

  • 定义private 可视范围的变量和函数仅在当前合约中可见。这意味着其他合约,包括继承自该合约的子合约,都无法访问这些 private 成员。
  • 实例:在 VisibilityBase 合约中,uint private x = 0; 声明了一个 private 状态变量 x。只有在 VisibilityBase 合约内部的函数才能访问 x。例如:
function accessX() private view returns (uint) {
    return x;
}

外部合约无法直接访问 x,继承自 VisibilityBase 的子合约也不能访问 x

 

3. external 可视范围

  • 定义external 可视范围仅适用于函数,意味着该函数只能通过外部消息调用(例如通过 this.func 的方式),而不能在合约内部直接调用。外部函数通常用于处理大量数据,因为它们可以接收 calldata,这是一种只读的、存储在合约调用栈中的数据类型,比 memory 更节省 gas。
  • 实例:在 VisibilityBase 合约中,function externalFunc() external pure returns (uint) { return 300; } 定义了一个 external 函数 externalFunc。外部合约可以通过以下方式调用:
VisibilityBase contractInstance = new VisibilityBase();
uint result = contractInstance.externalFunc();

然而,在 VisibilityBase 合约内部,不能直接调用 externalFunc,例如:

// 以下代码会报错
function internalCallExternal() public pure {
    externalFunc(); // 错误:不能在内部直接调用 external 函数
}

4. internal 可视范围

  • 定义internal 可视范围的变量和函数仅在合约内部以及继承自该合约的子合约中可见。在合约内部,函数可以直接调用 internal 函数,而不需要通过合约实例。
  • 实例:在 VisibilityBase 合约中,uint internal y = 1; 声明了一个 internal 状态变量 yfunction internalFunc() internal pure returns (uint) { return 100; } 定义了一个 internal 函数 internalFunc。在 VisibilityBase 合约内部,其他函数可以直接访问 y 和调用 internalFunc,例如:

function accessYAndInternalFunc() public view returns (uint) {
    return y + internalFunc();
}

如果有一个继承自 VisibilityBase 的子合约,子合约也可以访问 y 和调用 internalFunc。例如:

contract SubContract is VisibilityBase {
    function accessFromSub() public view returns (uint) {
        return y + internalFunc();
    }
}

总结

  • public:状态变量和函数可以在合约内部和外部访问。对于状态变量,Solidity 会自动生成 getter 函数。

  • private:状态变量和函数只能在当前合约内部访问,外部和其他合约无法访问。

  • internal:状态变量和函数可以在当前合约内部以及继承它的子合约中访问,但不能在外部访问。

  • external:函数只能在合约外部调用,不能在合约内部直接调用。

 

代码实例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VisibilityBase {
    uint private x = 0;
    uint internal y = 1;
    uint public z = 2;

    function privateFunc () private pure returns (uint) {
        return 0;
    }

    function internalFunc() internal pure returns  (uint) {
        return 100;        
    }

    function publicFunc() public pure returns (uint) {
        return 200;
    }

    function externalFunc() external pure returns (uint) {
        return 300;
    }
}

在这个合约中:

  • x 是 private,只能在 VisibilityBase 内部访问。

  • y 是 internal,可以在 VisibilityBase 及其子合约中访问。

  • z 是 public,可以在合约内部和外部访问。

  • privateFunc 是 private,只能在 VisibilityBase 内部调用。

  • internalFunc 是 internal,可以在 VisibilityBase 及其子合约中调用。

  • publicFunc 是 public,可以在合约内部和外部调用。

  • externalFunc 是 external,只能在合约外部调用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容: 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置,我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…

SpringBoot 日志与配置文件

SpringBoot 配置文件格式 Properties 格式 Component ConfigurationProperties(prefix "person") //和配置文件person前缀的所有配置进行绑定 Data public class Person {private String name;private Integer age;private Date birthDay;private Boolean like;pr…

oracl:数据查询语言DQL

SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系数据库的标准编程语言。 sql分类: 基本查询语法 数据查询语言(DQL - Data Query Language) 查询的关键词 select where对查询结果进行过滤…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…

神经网络和深度学习

应用 类型 为什么近几年飞速发展 数据增长,算力增长,算法革新 逻辑回归 向量化 浅层神经网络(Shallow neural network) 单条训练数据前向传播计算表达式 batch训练数据前向传播计算表达式 反向传播计算表达式 参数随机初始化 不能全部设为0 原因是同一…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂,论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此,本文通过精简代码(约300行),从代码运行角度讲解扩散模型。 本文包括扩散模型的3项技术复现: 1.DDPM (Denoising…

浅谈网络 | 容器网络之Flannel

目录 云原生网络架构深度解构:Flannel的设计哲学与实现机制Flannel架构解析:三层核心设计原则UDP模式(用户态隧道)VXLAN模式(内核态隧道)Host-GW模式(直连路由) 生产环境架构选型与调…

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天,开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型,就在刚刚,凭一己之力让英伟达大跌18%,纳斯达克大跌3.7%,足足是给中国AI产…

用BGP的路由聚合功能聚合大陆路由,效果显著不?

正文共:666 字 11 图,预估阅读时间:1 分钟 之前我们统计过中国境内的IP地址和路由信息(你知道中国大陆一共有多少IPv4地址吗?),不过数量比较多,有8000多条。截止到2021年底&#xff…

AI DeepSeek-R1 Windos 10 环境搭建

1、安装: 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …

SOME/IP--协议英文原文讲解4

前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1.3 End…

工作总结:git篇

文章目录 前言基础Gerrit1.克隆2.新建本地分支和checkout3.添加到暂存区新增文件到暂存区修改已经添加到暂存区的文件取消添加到暂存区的文件 4.提交到本地仓库在不重复提交的情况下,修改本次提交 5.提交到远程仓库6.评审其他辅助命令 前言 目前也算是工作一段时间…

SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由

前言 在微服务架构中,API 网关是各个服务之间的入口点,承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理,通常需要通过中心化的配置管理系统来实现灵活的路由更新,而无需重启网关服务。Nacos 作为一个开源…

WireShark4.4.2浏览器网络调试指南:数据统计(八)

概述 Wireshark 是一款功能强大的开源网络协议分析软件,被广泛应用于网络调试和数据分析。随着互联网的发展,以及网络安全问题日益严峻,了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟:生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

【PowerShell专栏】实现Terminal工具的安装

微软已经发布了Windows Terminal的版本,提供各个命令操作工具的集成环境,在Windows Terminal中,我们可以集中实现多页签的各个命令方式,相比传统的命令执行分离,着实方便了不少。图为Terminal 界面: 如何实现Windows Terminal的安装呢?有好几种方式可以实现Windows Term…

从0到1:C++ 开启游戏开发奇幻之旅(二)

目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能&#xff08;AI&#xff09; 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例&#xff1a;开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…

九大服务构建高效 AIOps 平台,全面解决GenAI落地挑战

最近,DevOps运动的联合创始人Patrick Debois分享了他对AI平台与软件研发关系的深刻见解,让我们一起来探讨这个话题。 在AI的落地过程中,我们面临着两个主要难题: 引入AI编码工具后的开发者角色转变:随着像GitHub Copilot这样的AI工具的普及,工程师的角色正在发生深刻变革…