侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 29 篇文章
  • 累计创建 40 个标签
  • 累计创建 185 个分类

玩以太坊链上项目的必备技能(单位以及全局变量-Solidity之旅七)

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

以太币单位(Ether)

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

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

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

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

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

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

时间单位

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

Solidity 时间单位有:secondsminuteshoursdaysweeksseconds是时间的缺省单位。

早期版本(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;

特殊变量(全局变量)

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

区块和交易属性

  • 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.timestampblockhash 产生随机数,除非你明确知道自己做的用意。

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

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

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

img