【區塊鏈安全 | 第十八篇】類型之引用類型(二)

文章目錄

  • 引用類型
    • 數組切片
    • 結構體

在這里插入圖片描述

引用類型

數組切片

數組切片是對數組中連續部分的一個視圖。它的語法為 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.pswp.cn/pingmian/74107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74107.shtml
英文地址,請注明出處:http://en.pswp.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…