Solidity之旅(七)单位以及全局变量

​01

以太币单位(Ether)

甭管是虚拟货币还是现实中的“稳定币”,他们都有各自的货币单位。当然咯,作为以太坊区块链上交易的虚拟货币以太坊也是有属于自己的那一套货币单位的。

而目前以太币(Ether)主要分为这三个:wei、gwei以及ether。或许您之前还见过 finney 和 szabo,但这两个早在solidity 0.7.0就被删除了,而gwei却是solidity 0.6.11新添加的!

使用起来很容易,便是在数字后边跟上这些以太币单位,当然,数字与以太币单位之间需要空格隔开的,这一点想必您应该是清楚的吧!

若没加以太币单位,那么它缺省为wei。

assert(1 wei == 1);assert(1 gwei == 1e9);assert(1 ether == 1e18);

关于assert的用法,我们后续会讲到,可以理解为断言,用于判断表达式是否为true,反之则抛出错误!

02

时间单位

说到时间单位,您肯定会想到生活中的时(hour)、分(minute)、秒(second)以及天(day)、周(week)。

Solidity时间单位有:seconds、minutes、hours、days和weeks,seconds是时间的缺省单位。

早期版本(solidity 0.5.0之前但不包括)还有一个years用来表示年的时间,由于闰年的缘故,便废除了。

  • 1 == 1 seconds

  • 1 minutes == 60 seconds

  • 1 hours == 60 minutes

  • 1 days == 24 hours

  • 1 weeks == 7 days

uint today = 今天的时间戳;uint tomorrow = today + 1 days;

03

特殊变量(全局变量)

它们是Solidity在全局命名空间 预设的一些变量和函数,用于获取区块链信息和一些通用的工具函数。

04

区块和交易属性

blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希 —— 仅可用于最新的256个区块且不包括当前区块,否则返回0 。

  • block.basefee(uint):当前区块的基础费用

  • block.chainid(uint):当前链id

  • block.coinbase(address):挖出当前区块的矿工地址

  • block.difficulty(uint):当前区块难度

  • block.gaslimit(uint):当前区块gas限额

  • block.number(uint):当前区块号

  • block.timestamp(uint):自unix epoch起始当前区块以秒计的时间戳

  • gasleft() returns(uint256):剩余的gas

  • msg.data(bytes):完整的calldata

  • msg.sender(address):消息发送者(当前调用)

  • msg.sig(bytes4):calldata的前4字节(也就是函数标识符)

  • msg.value(uint):随消息发送的wei的数量

  • tx.gasprice(uint):交易的gas价格

  • tx.origin(address):交易发起者(完全的调用链)

不要依赖block.timestamp和blockhash产生随机数,除非你明确知道自己做的用意。

时间戳和区块哈希在一定程度上都可能受到挖矿矿工影响。例如,挖矿社区中的恶意矿工可以用某个给定的哈希来运行赌场合约的payout函数,而如果他们没收到钱,还可以用一个不同的哈希重新尝试。

当前区块的时间戳必须严格大于最后一个区块的时间戳,但这里能确保也需要它是在权威链上的两个连续区块。

在Solidity 0.7.0, now(block.timestamp的别名)被移除了。

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

原文链接:

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

想学习更多有关区块链的文章请关注微信公众号:BSN研习社

猜你喜欢

转载自blog.csdn.net/BSN_yanxishe/article/details/134854352