Solidity的引用类型全解析

引用的本来语意

  • 引用类型,变量本身与变量指向的数据分离,赋值操作是引用拷贝,数据块不受影响
  • 通常的面向对象语言中的所有引用类型变量之间的赋值操作,都是引用拷贝
  • 这一点在Solidity的引用类型中不再成立,solidity的引用类型的变量之间可能发生值拷贝
    在这里插入图片描述

合约的成员变量的特殊性

与一般虚拟机或物理机不同的是,EVM的机器模型中引入了storage,合约成员变量指向固定的持久化(storage)数据块,它并不能像一般引用类型变量一样切换它所指向的数据块,由于这个限制,对成员变量的赋值,引用拷贝从技术上变成不可能
在这里插入图片描述

Location对数据空间的分割

数据块有三个存储位置(calldata,memory,storage),概念上存储空间被分割成三个子空间,引用类型变量被location属性限定,不可能跨域子空间进行指定切换,只能在子空间内部切换
在这里插入图片描述

判定算法(受上述两个原因的影响,编译检查)

一个赋值的操作:

X = a
其中x是被赋值的变量,在赋值操作赋的左侧,a是赋值变量,在赋值操作符的右侧

判定算法:

  • 如果x是成员变量,值拷贝,否则:
  • 如果x与a的location相同,引用拷贝,否则:值拷贝

Calldata的只读属性

  • Calldata的只读属性
  • 你无法向message数据体的calldata数据域中拷东西,正如你不能修改msg.sender或msg.value一样

Mapping不支持拷贝

  • 它不能遍历,没有遍历能力的技术原因在于mapping在storage中的存储方式。
  • 它不能进行值拷贝,因为拷贝就是一种搬运过程,搬运总是先能把东西找全。

检查算法(受上述两个原因的影响,编译检查)

判定算法有三个输出:

  • 引用拷贝,值拷贝。如果输出引用拷贝,不必检查;输出值拷贝,则执行检查算法

检查算法:

  • 检查x和a的类型中是否有mapping元素(它本身是mapping或者嵌入了mapping成分),如果有则出错
  • 检查x是否是calldata(指向的数据块是只可读的,不可改变),如果是则出错
  • 执行值拷贝

代码示例,注意看每行注释

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "hardhat/console.sol";

contract LocalStorageVariable {
    int256[] data1;
    int256[] data2;

   
    function getData1()public view returns(int256[] memory){
        return data1;
    }
    function getData2()public view returns(int256[] memory){
        return data2;
    }

    function insertData1(int256 d)public{
        return data1.push(d);
    }
      function insertData2(int256 d)public{
        return data2.push(d);
    }
    
    function setData1ToData2()public{
        data1 = data2; // 判定算法第一条规则:如果x是成员变量,值拷贝。=》此时进行的是值拷贝,data1和data2再单独插入数据的时候,两组数据互不影响
    }

    function testSecondRule(int256[] calldata pd )public returns(int256[] memory){
        int256[] memory td;
        td = data1; // 判定算法第一条规则:如果x与a的location相同,引用拷贝,否则:值拷贝。=》值拷贝
        data1 = pd; // 值拷贝
        // pd = data1; // 根据判定算法是值拷贝,但是再根据检查算法:检查x是否是calldata(指向的数据块是只可读的,不可改变),如果是则出错 =》会报错
        // int256[] calldata cdt = pd; 根据判定算法第一条,是引用拷贝,则不需要进行检查算法 =》合法
        return td;
    }
}

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

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

相关文章

二叉数之插入操作

首先是题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效…

防火墙技术基础篇:基于IP地址的转发策略

防火墙技术基础篇&#xff1a;基于IP地址的转发策略的应用场景及实现 什么是基于IP地址的转发策略&#xff1f; 基于IP地址的转发策略是一种网络管理方法&#xff0c;它允许根据目标IP地址来选择数据包的转发路径。这种策略比传统的基于目的地地址的路由更灵活&#xff0c;因…

HTML静态网页成品作业(HTML+CSS)——川西旅游介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

CentOS 7安装prometheus

说明&#xff1a;本文介绍如何在CentOS操作系统上安装prometheus Step1&#xff1a;下载安装包 访问Github仓库&#xff0c;下载对应版本的prometheus安装包 https://github.com/prometheus/prometheus/releases 操作系统的版本信息&#xff0c;可通过下面这两个命令查看&am…

反编译抖音 a_bogus vmp

接上篇的继续 反编译 vmp 来进行学习 抖音的不太一样的点在于 他的vmp代码是分散的 好几段代码都是vmp的 然后指令对应的操作还不一样 就很蛋疼… 而且 指令对应的操作也是if else 还有三元表达式形式的 不太好找位置 第一步 看vmp代码结构 484e4f4a403f524300033604d6dbeab…

kafka监控配置和告警配置——筑梦之路

kafka_exporter项目地址&#xff1a;https://github.com/danielqsj/kafka_exporter docker-compose部署kafka_exporter # docker-compose部署多个kafka_exporter&#xff0c;每个exporter对接一个kafka# cat docker-compose.ymlversion: 3.1 services:kafka-exporter-opslogs…

30.标签实现动画

SVG的<set>标签是一个非常有用的工具&#xff0c;它允许开发者在SVG图形中创建简单的动画效果。这个标签主要用于在一段时间内改变一个属性到一个新值。以下是关于如何使用<set>标签的一些详细说明和示例。 <set>标签的基本用法 <set>标签用于在SVG动…

【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 17&#xff0c;又是一个令人愉快的周五~ 题目详情 [110] 平衡二叉树 题目描述 110 平衡二叉树 解题思路 前提&#xff1a;平衡二叉树&#xff1a;左右子树高度差不超过1, 思路&#xff1a;…

Fastjson漏洞之CVE-2017-18349

前言&#xff1a; 要想理解漏洞原理&#xff0c;首先看看Fastjson是什么&#xff0c;具体用来做什么才能更好的找到可以利用的场景&#xff1a; Fastjson 是一个由阿里巴巴开发的 Java 语言实现的高性能 JSON 解析器和生成器。它具有以下特点: 快速&#xff1a;Fastjson 在序列…

【区块链】caliper压力测试

本文上接postman接口测试 参照工程项目使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试 首先启动webase python3 deploy.py startAll vim /opt/bencahmark/caliper-benchmark/networks/fisco-bcos/test-nw/fisco-bcos.json 命令便捷查…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档&#xff1a;Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务&#xff0c;复…

Python编程之旅:从错误到精通的奇妙探险

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初识Python编程的陷阱与解决方案 1. 语法错误&#xff1a;防范于未然 2. 逻辑错误&…

java+Angular+Nginx+原生HTML+JS+CSS+Jquery融合B/S版电子病历系统云HIS系统源码

javaAngularNginx原生HTMLJSCSSJquery融合B/S版电子病历系统云HIS系统源码 Java版云HIS系统融合电子病历系统&#xff0c;是医学专用软件。医院通过电子病历以电子化方式记录患者就诊的信息&#xff0c;包括&#xff1a;首页、病程记录、检查检验结果、医嘱、手术记录、护理记录…

Day24:Leetcode:235. 二叉搜索树的最近公共祖先 + 701.二叉搜索树中的插入操作 + 450.删除二叉搜索树中的节点

LeetCode&#xff1a;235. 二叉搜索树的最近公共祖先 解决方案&#xff1a; 1.思路 对于当前节点x&#xff0c;如果x比p和q的值都大&#xff0c;说明&#xff0c;p和q在x的右子树里面&#xff0c;那么去x的右子树里面去寻找&#xff1b;对于当前节点x&#xff0c;如果x比p和…

VMware Ubuntu虚拟机开机黑屏的解决方法

由于不知名原因&#xff0c;我的VMware虚拟机隔三差五会出现开机即黑屏的现象。经过查阅资料和摸索&#xff0c;发现其中一种方法可以很好地解决我虚拟机的问题。 &#xff08;1&#xff09;打开虚拟机 &#xff08;2&#xff09;在虚拟机还在读条状态时&#xff0c;鼠标左键进…

数字营销:以大数据作引擎,推动企业全面数字化升级

数字营销本质乃是以大数据为核之心&#xff0c;促使营销活动高效运作&#xff0c;消费者线上线下数据的无缝衔接、企业内外部数据的贯通、公域引流私域运营等&#xff0c;皆已成为企业运营的标准配置。 数据即等同于市场&#xff0c;市场即等同于用户&#xff0c;用户乃是企…

【hive和spark】hive on spark和spark读取hive metastore配置

HIVE ON SPARK 和 SPARK READ HIVE METASTORE 具体hadoop 和 hive单机版本安装请参考单节点搭建hadoop和hive 此文是基与这篇基础上升级而来。 零、版本说明&#xff1a; 本例使用的版本&#xff0c;hive和spark版本对标Cloudera 公司的 cdh6.2.0 版本&#xff0c;hdfs图省事…

Android应用URI调起百度地图、高德地图 和 腾讯地图

1、百度地图 地图调起API | 百度地图API SDKhttps://lbs.baidu.com/faq/api?titlewebapi/uri/andriod例&#xff1a;反向地址解析 //反向地址解析URI private final String BAIDU_MAP_NAVI_URI "baidumap://map/geocoder?location";/*** 跳转百度地图*/ private…

消息号 KI261 成本中心 XXXX/123123 冻结而不能直接对 2020.10.08 收入记帐

做AR凭证遇到如上图所示的报错&#xff0c;检查之后发现是科目的成本要素类别与成本中心的控制面板-锁定中的类型不匹配&#xff0c;现在科目的成本要素类别是11&#xff0c;控制面板中锁定了“实际销售收入”与“计划收入”。 成本要素类别“11”代表主营收入或者库存收入&…

新手第一次做抖店,应该注意什么?知道这些技巧让你更快拿到结果

大家好&#xff0c;我是电商花花。 新手第一次刚开始接触抖音小店&#xff0c;都会担心自己做不好&#xff0c;操作不到位的想法&#xff0c;怕自己做店长时间不出单。 其实做店担心不出单是很正常的&#xff0c;但是只要我们掌握正确的做店方法和技巧也能很快就做好抖音小店…