首页 > 其他分享 >solidity calldata学习

solidity calldata学习

时间:2024-06-15 10:10:07浏览次数:13  
标签:calldata TokenDistribution solidity gas 学习 token address distributions

在 Solidity 中,calldata 是一种数据位置标识符,用于指定函数参数的存储位置。calldata 特别适用于函数的外部调用参数,并且是只读的。以下是对 Solidity 中数据位置的一些说明:

  • storage: 用于状态变量,数据持久存储在区块链上。修改状态变量会消耗gas。
  • memory: 用于临时变量,这些变量仅在函数执行期间存在,不会永久存储在区块链上。相对于 storagememory 中的数据处理速度更快且更便宜。
  • calldata: 主要用于函数参数,特别是外部函数调用的参数。calldata 数据不可修改,使用 calldata 可以减少不必要的数据复制,提升性能并降低gas费用。

在你的代码中,TokenDistribution[] calldata distributions 表示 distributions 参数是一个 TokenDistribution 结构体数组,并且这个数组是只读的,存储在 calldata 中。

以下是 calldata 的一些关键点:

  1. 只读: 你不能修改 calldata 中的数据。
  2. 低gas消耗: 由于 calldata 是不可变的,编译器能够进行一些优化,使得函数参数的处理更高效,减少了gas消耗。
  3. 外部调用: calldata 仅用于外部函数调用时的参数传递(即从外部账户或其他合约调用该函数)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Test {

    // 定义一个结构体来存储代币地址和数量
    struct TokenDistribution {
        address tokenAddress;
        uint256 amount;
    }

    function mint(TokenDistribution[] calldata distributions, address to) public onlyAdmin {
        require(to != address(0), "Invalid recipient address.");

        for (uint i = 0; i < distributions.length; i++) {
            require(distributions[i].tokenAddress != address(0), "Invalid token address.");
            IERC20 token = IERC20(distributions[i].tokenAddress);
            bool sent = token.transfer(to, distributions[i].amount);
            require(sent, string(abi.encodePacked("Token transfer failed for token index ", uintToStr(i))));
        }
    }
}

在上述代码中,mint 函数的 distributions 参数使用了 calldata 关键字。这意味着这个参数是只读的,且数据直接从外部调用传递到合约中,而不会在内存中复制一份。这在处理大数组时特别有用,因为可以显著降低gas消耗。

 

标签:calldata,TokenDistribution,solidity,gas,学习,token,address,distributions
From: https://www.cnblogs.com/zhanchenjin/p/18249042

相关文章

  • Vue2学习八-Vue核心(生命周期)
    目录17.生命周期17.1什么是生命周期17.2 分析生命周期17.3生命周期总结17.生命周期17.1什么是生命周期<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>引出生命周期</title> <!--引入Vue--> <scripttype="text/java......
  • Vue2学习九-Vue组件化编程(非单文件组件、单文件组件)
    18.非单文件组件18.1.基本使用Vue中使用组件的三大步骤: 一、定义组件(创建组件) 二、注册组件 三、使用组件(写组件标签)一、如何定义一个组件? 使用Vue.extend(options)创建,其中options和newVue(options)时传入的那个options几乎一样,但也有点区别; 区别如下: 1.......
  • 注册中心理论学习
    注册中心介绍注册中心(也称为服务注册中心或服务发现服务)是微服务架构中的一个关键组件,它负责服务的注册与发现。在微服务体系中,服务实例的数量和位置是动态变化的,注册中心提供了一个集中的地方来存储这些信息,使得服务之间能够相互发现和通信。注册中心的主要功能包括:服务注......
  • 【学习笔记】爱立信SPO 1400 CRAFT软件基础知识2一图形用户界面之菜单栏
    一、前期准备提示:下面所有学习内容都是基于以下条件完成的条件1.已经正确安装并正常运行SPO1400CRAFT软件(以下简称LCT)条件2.确认已正确使用爱立信SPO1400CRAFT软件通过网络登录设备(以下简称NE)具体登录教程参考:使用爱立信SPO1400CRAFT软件通过网络登录设备的详细......
  • QT210开发板学习(1):SEC S5PC110 Test B/D驱动安装
    把开发板的开关拨到USBBOOT,通过USB线连接到开发板的OTG口,打开板上总电源,会提示驱动安装失败我们需要下载驱动(win7-64-DNW-USB)https://github.com/joyjohn131/QT210/tree/main/1打开dseo13b.exe,依次点击Next,Yes选择"EnableTestMode","Next",提示完成开启选择"SignaS......
  • 大模型的学习
    一. 理解大模型的局限性1.理解力的挑战        当前的大模型,尽管能够生成类似人类的文本和在特定任务中表现优异,但在真正理解上下文和语义方面仍存在局限。例如,GPT-3等模型可以生成流畅的文章,但在遇到复杂逻辑推理或多步骤推理时,容易出现错误。这说明,模型在语义理......
  • 深度学习网络结构之---Inception
    目录一、Inception名称的由来二、Inception结构 三、Inceptionv2四、Inceptionv3 1、深度网络的通用设计原则2.卷积分解(FactorizingConvolutions)3.对称卷积分解3.非对称卷积分解 五、Inceptionv4一、Inception名称的由来        Inception网络名......
  • 【目标检测】基于深度学习的车牌识别管理系统(含UI界面)【python源码+Pyqt5界面 MX_002
    系统简介:        车牌识别技术作为经典的机器视觉任务,具有广泛的应用前景。通过图像处理方法,车牌识别技术能够对车牌上的字符进行检测、定位和识别,从而实现计算机对车牌的智能化管理。在现实生活中,车牌识别系统已在小区停车场、高速公路出入口、监控区域和自动收费站......
  • Java学习之旅:一位学生的经验与心得
    在大学的时光里,我自主学习了Java作为我的主要编程语言。经过一段时间的学习和实践,我不仅对Java有了更深入的了解,也体会到了编程的乐趣和挑战。今天,我想与大家分享我的Java学习心得和一些具体的编程经验。一、初识Java的魅力通过学习Java的基础语法,如变量、数据类型、运算符......
  • boost-Asio 基础学习1.5--域名主机名解析筛选resolver
    在开发过程中往往看见的不是ipv4或者ipv6,而是主机的域名!如www.badiu.com而上期文章也说了......