ITPub博客

首页 > 区块链 > 区块链 > Solidity之旅(十六)Constant 和 Immutable状态变量

Solidity之旅(十六)Constant 和 Immutable状态变量

区块链 作者:BSN研习社 时间:2023-12-29 16:26:09 0 删除 编辑

01

constant(常量)

说到常量这一概念,拥有现代编程经历的您,对这一词再熟悉不过 了。
常量,常量,顾名思义便是变量值始终不变,这在很多面向对象程序语言中都有。
相对Solidity来说,它也是支持常量的。
假若将状态变量(State Vriable)声明为constant(常量),而它的值是在编译时有确定的表达式来给它赋值。
我们知道常量值是在编译时确定的,所以区块数据(例如block.timestamp,address(this).balance或者block.number)或执行数据(msg.value或gasleft())或对外部合约的调用来给它们赋值都是不允许的。
允许可能对内存分配产生副作用(side-effect)的表达式,但那些可能对其他内存对象产生副作用的表达式则不允许。
内建(built-in)函数keccak256,sha256,ripemd160,ecrecover,addmod和mulmod是允许的(即使他们确实会调用外部合约,keccak256除外)。
允许内存分配器的副作用的原因是它可以构造复杂的对象,例如:查找表(lookup-table)。此功能尚不完全可用。
    
    
    // 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; } }

    02

    immutable(不可变量)

    将状态变量声明为immutable(不可变量)较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; } }

        
        
        // 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;    }
        }

        版权声明:本文为CSDN博主「甄齐才」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        原文链接:

        https://blog.csdn.net/coco2d_x2014/article/details/128424801


        文章原标题:《玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)》

        旨在传播区块链相关技术,如有侵权请与我们联系删除。


        来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70012206/viewspace-3002202/ ,如需转载,请注明出处,否则将追究法律责任。

        请登录后发表评论 登录
        全部评论

        注册时间:2021-12-29

        • 博文量
          177
        • 访问量
          87923