美文网首页
solidity高级理论(三):时间单位与view

solidity高级理论(三):时间单位与view

作者: P叔 | 来源:发表于2018-06-15 14:21 被阅读0次

    solidity高级理论(三):时间单位与view

    关键字:时间单位、view、Gas优化

    solidity使用自己的本地时间单位

    变量 now 将返回当前的unix时间戳(自1970年1月1日以来经过的秒数)。

    注意:Unix时间传统用一个32位的整数进行存储。这会导致“2038年”问题,当这个32位的unix时间戳不够用,产生溢出,使用这个时间的遗留系统就麻烦了。所以,如果我们想让我们的 DApp 跑够20年,我们可以使用64位整数表示时间,但为此我们的用户又得支付更多的 gas。

    Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。

    下面是一些使用时间单位的实用案例:

    uint lastUpdated;
    
    // 将‘上次更新时间’ 设置为 ‘现在’
    function updateTimestamp() public {
      lastUpdated = now;
    }
    
    // 如果到上次`updateTimestamp` 超过5分钟,返回 'true'
    // 不到5分钟返回 'false'
    function fiveMinutesHavePassed() public view returns (bool) {
      return (now >= (lastUpdated + 5 minutes));
    }
    

    view关键字

    当用户从外部调用一个view函数,是不需要支付一分 gas 的。

    这是因为 view 函数不会真正改变区块链上的任何数据 - 它们只是读取。因此用 view 标记一个函数,意味着告诉 web3.js,运行这个函数只需要查询你的本地以太坊节点,而不需要在区块链上创建一个事务(事务需要运行在每个节点上,因此花费 gas)。

    所以,在查询数据的时候最好放在带有view的函数中。

    注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。所以标记为 view 的函数只有在外部调用时才是免费的。

    知识星球二维码380.png

    相关文章

      网友评论

          本文标题:solidity高级理论(三):时间单位与view

          本文链接:https://www.haomeiwen.com/subject/cqcmeftx.html