solidity区块及交易属性
在介绍区块及交易属性之前,我们需要先知道solidity中自带了一些全局变量和函数,这些变量和函数可以认为是solidity提供的API,这些 API 主要表现为Solidity 内置的特殊的变量及函数,它们存在于全局命名空间里,主要分为以下几类:
有关区块和交易的属性
ABI编码函数
有关错误处理
有关数学及加密功能
有关地址和合约
我们在编写智能合约的时候就可以通过这些API来获取区块和交易的属性(Block And Transaction Properties),简单来说这些API主要用来提供一些区块链当前的信息,下表列出常用的一些API:
API
描述
blockhash(uint blockNumber) returns (bytes32)
返回给定区块号的哈希值,只支持最近256个区块,且不包含当前区块
block.coinbase (address)
获取当前块矿工的地址
block.difficulty (uint)
获取当前块的难度
block.gaslimit (uint)
获取当前块的gaslimit
block.number (uint)
获取当前区块的块号
block.timestamp (uint)
获取当前块的Unix时间戳(从1970/1/1 00:00:00 UTC开始所经过的秒数)
gasleft() (uint256)
获取剩余gas
msg.data (bytes)
获取完整的调用数据(calldata)
msg.gas (uint)
获取当前还剩的gas(已弃用)
msg.sender (address)
获取当前调用发起人的地址
msg.sig (bytes4)
获取调用数据(calldata)的前四个字节(例如为:函数标识符)
msg.value (uint)
获取这个消息所附带的以太币,单位为wei
now (uint)
获取当前块的时间戳(实际上是block.timestamp的别名)
tx.gasprice (uint)
获取交易的gas价格
tx.origin (address)
获取交易的发送者(全调用链)
注意:
msg的所有成员值,如msg.sender,msg.value的值可以因为每一次外部函数调用,或库函数调用发生变化(因为msg就是和调用相关的全局变量)。
不应该依据 block.timestamp, now 和 block.blockhash来产生一个随机数(除非你确实需要这样做),这几个值在一定程度上被矿工影响(比如在×××合约里,不诚实的矿工可能会重试去选择一个对自己有利的hash)。
对于同一个链上连续的区块来说,当前区块的时间戳(timestamp)总是会大于上一个区块的时间戳。为了可扩展性的原因,你只能查最近256个块,所有其它的将返回0.
接下来使用代码演示一下常用的全局变量:
pragma solidity ^0.4.17;
contract SolidityAPI {
function getSender() public constant returns(address) {
// 获取当前调用发起人的地址
return msg.sender;
}
function getValue() public constant returns(uint) {
// 获取这个消息所附带的以太币,单位为wei
return msg.value;
}
function getBlockCoinbase() public constant returns(address) {
// 获取当前块矿工的地址
return block.coinbase;
}
function getBlockDifficulty() public constant returns(uint) {
// 获取当前块的难度
return block.difficulty;
}
function getBlockNumber() public constant returns(uint) {
// 获取当前区块的块号
return block.number;
}
function getBlockTimestamp() public constant returns(uint) {
// 获取当前块的Unix时间戳
return block.timestamp;
}
function getNow() public constant returns(uint) {
// 获取当前块的时间戳
return now;
}
function getGasprice() public constant returns(uint) {
// 获取交易的gas价格
return tx.gasprice;
}
}
ABI编码函数
ABI全称Application Binary Interface,翻译过来就是:应用程序二进制接口,是调用智能合约函数以及合约之间函数调用的消息编码格式定义,也可以理解为智能合约函数调用的接口说明。类似Webservice里的SOAP协议一样;也就是定义操作函数签名,参数编码,返回结果编码等。
简单来说从外部施加给以太坊的行为都称之为向以太坊网络提交了一个交易, 调用合约函数其实是向合约地址(账户)提交了一个交易,这个交易有一个附加