玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)

这篇具有很好参考价值的文章主要介绍了玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

constant(常量)

说到常量这一概念,拥有现代编程经历的您,对这一词再熟悉不过了。

常量常量,顾名思义便是变量值始终不变,这在很多面向对象程序语言中都有。

相对 Solidity 来说,它也是支持常量的。

假若将状态变量(State Vriable)声明为constant(常量),而它的值是在编译时有确定的表达式来给它赋值。

我们知道常量值是在编译时确定的,所以区块数据(例如 block.timestamp, address(this).balance 或者 block.number)或执行数据( msg.valuegasleft() )或对外部合约的调用来给它们赋值都是不允许的。

允许可能对内存分配产生副作用(side-effect)的表达式,但那些可能对其他内存对象产生副作用的表达式则不允许。

内建(built-in)函数 keccak256sha256ripemd160ecrecoveraddmodmulmod 是允许的(即使他们确实会调用外部合约, keccak256 除外)。

允许内存分配器的副作用的原因是它可以构造复杂的对象,例如: 查找表(lookup-table)。 此功能尚不完全可用。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract ConstantExample {
    
    address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
    uint public constant MY_UINT = 123;

}

constant 和 immutable 状态变量,区块链,区块链,solidity,constant,常量,不可变量

immutable(不可变量)

状态变量声明为immutable(不可变量)constant声明的状态变量限制少。

可以在合约的构造函数中或声明时为不可变的变量分配任意值。 不可变量只能赋值一次,并且在赋值之后才可以读取。

编译器生成的合约创建代码将在返回合约之前修改合约的运行时代码,方法是将对不可变量的所有引用替换为分配给它们的值。 如果要将编译器生成的运行时代码与实际存储在区块链中的代码进行比较,则这一点很重要。

不可变量可以在声明时赋值,不过只有在合约的构造函数执行时才被视为视为初始化。 这意味着,你不能用一个依赖于不可变量的值在行内初始化另一个不可变量。 不过,你可以在合约的构造函数中这样做。

这是为了防止对状态变量初始化和构造函数顺序的不同解释,特别是继承时,出现问题。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract ImmutableExample {
    
    address public immutable MY_ADDRESS;
    uint public immutable MY_UINT;

    constructor(uint _myUint) {
        MY_ADDRESS = msg.sender;
        MY_UINT = _myUint;
    }

}

constant 和 immutable 状态变量,区块链,区块链,solidity,constant,常量,不可变量

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract ConstantImmutableExample {
    
    string constant TEXT = "abc";
    bytes32 constant MY_HASH = keccak256("abc");
    uint immutable decimals;
    uint immutable maxBalance;
    address immutable owner = msg.sender;

    constructor(uint decimals_, address ref) {
        decimals = decimals_;
        maxBalance = ref.balance;
    }

    function isBalanceTooHigh(address _other) public view returns (bool) {
        return _other.balance > maxBalance;
    }

}

constant 和 immutable 状态变量,区块链,区块链,solidity,constant,常量,不可变量文章来源地址https://www.toymoban.com/news/detail-787536.html

到了这里,关于玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【项目管理】AI时代项目经理必备技能

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 项目经理在AI时代仍然是非常关键的角色

    2024年02月08日
    浏览(28)
  • 在本地以太坊私链上,使用go调用智能合约,获取事件日志

    完整go项目文件目录      

    2024年02月11日
    浏览(45)
  • 谁在以太坊区块链上循环交易?TuGraph+Kafka的0元流图解决方案

    都在说数据已经成为新时代的生产资料。 但随着大数据和人工智能等技术的发展,即便人们都知道数据的价值日益凸显,却无法凭借一己之力获取和分析如此大规模的数据。 要想富,先修路。要想利用新时代的数据致富,也必须要有趁手的工具。只有合适的工具才能完成大

    2024年02月11日
    浏览(27)
  • OpenWrt新手必备之技能

    Openwrt 的生态相当复杂,初次接触的人会感受到不少困惑,应该选择什么样的硬件,从哪里找到合适的固件,需要安装哪些插件,自自己动手还是拿来主义,系统不小心搞坏了怎么重置,如何更新或切换其他的固件,下面我们就这些困惑逐步展开解释。 首先你需要一个支持

    2023年04月18日
    浏览(29)
  • 电源工程师必备技能汇总

    三、熟练运用Maxwell、JMAG、FLUX、Saber其中一种磁件仿真软件,能够利用仿真定性、定量分析,利用仿真指导磁性器件设计; . 负责开关电源产品的设计与开发; 2. 负责产品总体方案设计,包括方案选型、器件选型、可靠性设计、原理图/PCB设计等; 3. 负责产品的测试与验证,

    2024年02月07日
    浏览(38)
  • 程序员必备技能之调试

    目录 前言 本期内容介绍 一、什么是Bug? 二、调试以及调试的重要性 2.1什么是调试? 2.2调试的基本步骤 ​三、Debug和Release介绍 Debug和Release 四、windows环境下的调试介绍 4.1调试环境 4.2一些调试常用的快捷键 4.3调试时查看当前程序的信息 a、查看临时变量的值 b、查看程序的

    2024年02月10日
    浏览(51)
  • 软件测试必备7大技能

    1.在测试中最重要的文档,他是测试工作的核心,是一组在测试时输入输出的标准,是软件需求的具体对照。编写测试用例,是测试人员的基本功,真正能写好的人并不多。 2.测试用例包含的内容:用例编号,用例名称,测试背景,前置条件,优先级,测试数据,测试步骤,

    2024年02月08日
    浏览(31)
  • FPGA开发必备技能:MATLAB应用

    FPGA开发必备技能:MATLAB应用 FPGA作为一种高性能的可编程逻辑器件,在各个领域都有着广泛的应用。而MATLAB作为一个重要的科学计算软件,也能够在FPGA开发中发挥巨大的作用。本文将介绍如何使用MATLAB来进行FPGA开发。 首先,我们需要了解MATLAB的特点和功能。MATLAB是一款强大

    2024年03月16日
    浏览(40)
  • (必备技能)使用Python实现屏幕截图

    在csdn上有很多纯copy,这给我复现带来了很大的麻烦,所以我想根据我的个人找截图的经历记录下来,给未来的自己看,免得忘记了云云。 由于我比较喜欢用opencv处理图像,所以截屏最后都会附带一个使用opencv显示图片的一个步骤。 1、下载pyautogui包 注:使用pyautogui方法获取

    2024年02月07日
    浏览(32)
  • 性能测试必备监控技能windows篇

    在手头没有专门的第三方监控时,该怎么监控服务指标呢?本篇就windows下监控进行分享,也是我们在进行性能测试时,必须掌握的。下面我们就windows下常用的三种监视工具进行说明: 任务管理器 资源监视器 性能监视器 在[开始] - [开始搜索]框中输入 taskmgr 打开任务管理 r

    2024年02月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包