【区块链安全 | 第十八篇】类型之引用类型(二)

文章目录

  • 引用类型
    • 数组切片
    • 结构体

在这里插入图片描述

引用类型

数组切片

数组切片是对数组中连续部分的一个视图。它的语法为 x[start:end],其中 startend 是表达式,结果类型为 uint256(或者可以隐式转换为 uint256)。切片的第一个元素是 x[start],最后一个元素是 x[end - 1]

如果 start 大于 end,或者 end 大于数组的长度,则会抛出异常。

startend 都是可选的:start 默认为 0,end 默认为数组的长度。

数组切片没有成员。它们可以隐式地转换为其底层类型的数组,并支持索引访问。索引访问相对于切片的起始位置,而不是底层数组的绝对位置。

数组切片没有类型名称,这意味着没有变量可以将数组切片作为类型,它们仅存在于中间表达式中。

注意
目前,数组切片仅在 calldata 类型的数组上可用。数组切片在 ABI 解码函数参数中的辅助数据时非常有用:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.5 <0.9.0;contract Proxy {/// @dev 代理管理的客户端合约地址address client;constructor(address client_) {client = client_;}/// 在对地址参数进行基本验证后,转发调用到客户端实现的 "setOwner(address)"。function forward(bytes calldata payload) external {bytes4 sig = bytes4(payload[:4]);// 由于截断行为,bytes4(payload) 的效果是一样的。// bytes4 sig = bytes4(payload);if (sig == bytes4(keccak256("setOwner(address)"))) {address owner = abi.decode(payload[4:], (address));require(owner != address(0), "Address of owner cannot be zero.");}(bool status,) = client.delegatecall(payload);require(status, "Forwarded call failed.");}
}

结构体

Solidity 提供了一种定义新类型的方式,即结构体(struct),如下例所示:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;// 定义一个具有两个字段的新类型。
// 在合约外部声明结构体允许它被多个合约共享。
// 这里其实不需要这样做。
struct Funder {address addr;uint amount;
}contract CrowdFunding {// 结构体也可以在合约内部定义,这样它只在合约内部以及派生合约中可见。struct Campaign {address payable beneficiary;uint fundingGoal;uint numFunders;uint amount;mapping(uint => Funder) funders;}uint numCampaigns;mapping(uint => Campaign) campaigns;function newCampaign(address payable beneficiary, uint goal) public returns (uint campaignID) {campaignID = numCampaigns++; // campaignID 是返回的变量// 我们不能使用 "campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0)"// 因为右侧会创建一个内存结构体 "Campaign",其中包含一个映射。Campaign storage c = campaigns[campaignID];c.beneficiary = beneficiary;c.fundingGoal = goal;}function contribute(uint campaignID) public payable {Campaign storage c = campaigns[campaignID];// 创建一个新的临时内存结构体,并用给定的值初始化,// 然后将其复制到存储中。// 注意,你也可以使用 Funder(msg.sender, msg.value) 来初始化。c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});c.amount += msg.value;}function checkGoalReached(uint campaignID) public returns (bool reached) {Campaign storage c = campaigns[campaignID];if (c.amount < c.fundingGoal)return false;uint amount = c.amount;c.amount = 0;c.beneficiary.transfer(amount);return true;}
}

该合约并没有提供一个完整的众筹合约功能,但它包含了理解结构体所需的基本概念。结构体类型可以在映射和数组中使用,结构体本身也可以包含映射和数组。

需要注意的是,结构体不能包含其自身类型的成员,尽管结构体可以作为映射成员的值类型,或者可以包含其类型的动态大小数组。这一限制是必要的,因为结构体的大小必须是有限的。

在所有函数中,结构体类型都被分配给了一个数据位置为 storage 的局部变量。这并不会复制结构体,而只是存储一个引用,以便对局部变量成员的赋值实际上会写入状态。

当然,你也可以直接访问结构体的成员,而不必将其分配给局部变量,就像 campaigns[campaignID].amount = 0 这样。

注意
在 Solidity 0.7.0 及之前的版本,允许内存结构体包含存储类型的成员(如映射),并且像上例中的 campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0) 这样的赋值会正常执行,但会默默跳过这些成员。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub上免费学习工具的精选汇总

以下是GitHub上免费学习工具的精选汇总&#xff0c;涵盖编程语言、开发框架、数据科学、面试准备等多个方向&#xff0c;结合工具的功能特点、社区活跃度及适用场景进行分类推荐&#xff1a; 一、编程语言与开发框架 Web Developer Roadmap 简介&#xff1a;为开发者提供全栈学…

[leetcode]2685. 统计完全连通分量的数量

题目链接 题意 给定无向图&#xff0c;求完全连通分量 连通分量就是一个连通块的意思 完全连通分量&#xff1a;就是一个连通块中 &#xff0c;所有点之间都两两有边相连 思路 一个完全联通分量有n个点 那么应该有 C n 2 C_n^2 Cn2​条边 并查集维护连通块 检查每个联通分量…

使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI

使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.3 使用Langchain agents构建Gradio UI16.3.1 创建代理16.3.2 创建Gradio UI16.3.3 运行demo参考文献本章目录如下: 《使…

项目实战 - 用户列表

用户列表想要实现这样的效果&#xff1a; 渲染数据&#xff1a; import React,{useState,useEffect} from react; import { Button,Table, Tag,Modal,Popover, Switch } from antd; import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from ant-design/icons…

吾爱破解安卓逆向学习笔记(4p)

学习目标&#xff0c;了解安卓四大组件&#xff0c;activity生命周期&#xff0c;同时了解去除部分广告和更新提示。 广告类型 1.启动页广告 2.更新广告 3.横幅广告 安卓四大组件 组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面&#xff0c;意思可以…

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…

Vue项目中Vuex在util引入,断点存在default

示例代码 // src/store/index.js import Vue from vue; import Vuex from vuex; ……Vue.use(Vuex); export default new Vuex.Store({…… })// src/utils/index.js import store from /store // 导入默认导出的 store export async function getDict() {store.state.userInf…

FALL靶机渗透实战:从信息收集到特权升级的完整链分析

1.下载靶机&#xff0c;并在虚拟机中打开 2.用kali来确定该靶机的IP kali的IP&#xff1a;192.168.139.152 arp-scan -l 3.扫描端口 nmap -O 192.168.139.172 4.扫目录 gobuster dir -u http://192.168.139.172 -x php,txt,html -w /usr/share/dirbuster/wordlists/directo…

谈谈常见的数据结构(如数组、链表、栈、队列、哈希表、树、图)及其应用场景

一、数组&#xff08;Array&#xff09; 定义&#xff1a;连续存储相同类型数据的线性结构&#xff0c;支持随机访问。 应用场景&#xff1a;列表渲染、数据缓存、算法处理 代码示例&#xff1a; // 数组基本操作 const arr [1, 2, 3, 4]; arr.push(5); // O(1) 平均时间复杂…

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…

力扣HOT100之矩阵:54. 螺旋矩阵

这道题之前在代码随想录里刷过类似的&#xff0c;还有印象&#xff0c;我就按照当初代码随想录的思路做了一下&#xff0c;结果怎么都做不对&#xff0c;因为按照代码随想录的边界条件设置&#xff0c;当行数和列数都为奇数时&#xff0c;最后一个元素无法被添加到数组中&#…

快速构建个人本地知识库管理系统与实现RAG问答

文章目录 摘要一、RAG 和知识库简介1、RAG2、知识库 二、 工作流程三、系统架构设计文件结构知识库构建模块RAG 模块用户交互模块 四、技术实现细节五、系统使用案例结论未来改进方向致谢 摘要 在当今信息爆炸的时代&#xff0c;快速准确地获取知识变得尤为重要。本地 RAG&…

使用DeepSeek API进行情感分析:超简单

文章目录 1. 引言1.1 情感分析概述1.2 为什么选择DeepSeek API1.3 本文目标 2. 技术方案对比2.1 传统情感分析方法2.2 基于LLM的方法DeepSeek API优势 3. DeepSeek 情感分析实战3.1 Few-shot Learning方法3.2 完整的DeepSeek API调用示例3.3 案例演示 4. DeepSeek开发情感分析工…

设置网站主题色color-scheme

color-scheme color-scheme CSS 属性允许元素指示它可以舒适地呈现哪些颜色方案。 操作系统颜色方案的常见选择为“亮色”和“暗色”&#xff0c;或“日间模式”和“夜间模式”。当用户选择其中一种颜色方案时&#xff0c;操作系统会对用户界面进行调整&#xff0c;包括表单控件…

Muduo网络库实现 [三] - Socket模块

目录 设计思路 类的设计 模块的实现 基础模块 特殊模块 集成模块 主函数 主函数实现 主函数测试 疑惑点 设计思路 Socket模块主要是对套接字的基础操作进行封装&#xff0c;简化我们对套接字的操作&#xff0c;不需要调用C的原生接口&#xff0c;而是以面向对象的…

优选算法的巧思之径:模拟专题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、模拟 二、例题讲解 2.1. 替换所有的问号 2.2. 提莫攻击 2.3. Z字形变换 2.4. 外观数列 2.5. 数青蛙 一、模拟 模拟算法说简单点就是照葫芦画瓢&#xff0c;现在草稿纸上模拟一遍算法过程&#xf…

贪心算法(13)(java)合并区间

题目&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff…

A股复权计算_权息数据整理

目录 前置&#xff1a; 步骤&#xff1a; 1 以通达信为参照 2 从优矿获取所需数据 2.1 股票配股信息 2.2 股票分红信息 2.3 股票拆股信息 3 合并数据&#xff0c;制成权息数据表 权息数据截止20250329.7z 视频 前置&#xff1a; 1 本系列将以 “A股复权计算_” 开头…

学习笔记—数据结构—二叉树(链式)

目录 二叉树&#xff08;链式&#xff09; 概念 结构 初始化 遍历 前序遍历 中序遍历 后序遍历 层序遍历 结点个数 叶子结点个数 第k层结点个数 深度/高度 查找值为x的结点 销毁 判断是否为完整二叉树 总结 头文件Tree.h Tree.c 测试文件test.c 补充文件Qu…

Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移

XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…