Solidity全局属性和方法

由于版本更新比较快。过去一部分写法,现在使用0.5.10版本开发合约时,部分报错。再去翻翻官方的最新的文档。

文章目录

    • 一、特殊变量
      • msg
      • tx
      • block
      • address
      • alias
      • type
    • 二、ABI编码
      • decode
      • encode
      • encodePacked
      • encodeWithSelector
      • encodeWithSignature
    • 三、错误处理
      • assert
      • require
      • revert
    • 四、合约相关
      • this
      • super
      • selfdestruct
    • 五、数学和密码学函数
      • addmod
      • mulmod
      • keccak256
      • sha256
      • ripemd160

一、特殊变量

msg

  • msg.sender(address) 消息发送者(当前调用)
  • msg.value (uint) 随消息发送的 wei 的数量
  • msg.data (bytes) 完整的 calldata
  • msg.gas (uint) 剩余 gas ,( 弃!)推荐使用gasleft()
  • msg.sig (bytes4) calldata 的前 4 字节(也就是函数标识符)

tx

  • tx.gasprice (uint) 交易的 gas 价格
  • tx.origin (address) 交易发起者(完全的调用链)

block

  • block.blockhash(uint blockNumber) (bytes32) 指定区块的区块哈希,仅可用于最新的 256 个区块且不包括当前区块,( 弃!)推荐使用blockhash(uint blockNumber)
  • block.coinbase (address): 挖出当前区块的矿工地址
  • block.difficulty (uint): 当前区块难度
  • block.gaslimit (uint): 当前区块 gas 限额
  • block.number (uint): 当前区块号
  • block.timestamp (uint): 自 unix epoch 起始当前区块以秒计的时间戳

address

  • .balance (uint256): 以 Wei 为单位的地址类型的余额。
  • .transfer(uint256 amount): 向地址类型发送数量为 amount 的 Wei,失败时抛出异常,发送 2300 gas 的矿工费,不可调节。
  • .send(uint256 amount) returns (bool):向地址类型发送数量为 amount 的 Wei,失败时返回 false,发送 2300 gas 的矿工费用,不可调节。
  • .call(...) returns (bool): 发出低级函数 CALL,失败时返回 false,发送所有可用 gas,可调节。
  • .callcode(...) returns (bool):已禁止使用。
  • .delegatecall(...) returns (bool):发出低级函数 DELEGATECALL,失败时返回 false,发送所有可用 gas,可调节。

alias

  • now (uint): 目前区块时间戳(block.timestamp
  • blockhash(uint blockNumber)returns(bytes32) 指定区块的区块哈希,限制256个之内
  • gasleft() returns(uint) 剩余的 gas, (msg.gas)
  • staticcall()

type

doc

  • type(C).name The name of the contract.
  • type(C).creationCode
  • type(C).runtimeCode

二、ABI编码

decode

abi.decode(bytes memory encodedData, (...)) returns (...)

解码一份已压缩的数据,类型在括号中作为第二个参数给出。

示例 (uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))

encode

abi.encode(...) returns (bytes memory)

对给定参数进行编码

encodePacked

abi.encodePacked(...) returns (bytes memory)

对给定参数执行 紧打包编码

encodeWithSelector

abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory)

对给定参数进行编码,并以给定的函数选择器作为起始的 4 字节数据一起返回

encodeWithSignature

abi.encodeWithSignature(string signature, ...) returns (bytes memory)

等价于 abi.encodeWithSelector(bytes4(keccak256(signature), ...)

三、错误处理

assert导致的交易失败,会扣取剩余的gas,其他的会返回剩余的gas

assert

  • assert(bool condition) 条件不满足,则使当前交易没有效果,用于检查内部错误。

require

  • require(bool condition)条件不满足则撤销状态更改,用于检查由输入或者外部组件引起的错误。
  • require(bool condition, string message),上同,可以同时提供一个错误消息。

revert

  • revert() 终止运行并撤销状态更改。
  • revert(string reason)终止运行并撤销状态更改,可以同时提供一个解释性的字符串。

四、合约相关

this

代表本合约的地址

super

使用继承层次结构中更高一级(父类)的合约的方法。

selfdestruct

selfdestruct(address payable recipient)

销毁合约,并把余额发送到指定地址。

五、数学和密码学函数

addmod

addmod(uint x, uint y, uint k) returns (uint)

计算 (x + y) % k,加法会在任意精度下执行,并且加法的结果即使超过 2**256 也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0 的校验(assert)。

mulmod

mulmod(uint x, uint y, uint k) returns (uint) 

计算 (x * y) % k,乘法会在任意精度下执行,并且乘法的结果即使超过 2**256 也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0 的校验(assert)。

keccak256

keccak256(bytes memory) returns (bytes32)

计算Ethereum-SHA-3 (Keccak-256)哈希。(sha3已放弃使用)

sha256

sha256(bytes memory) returns (bytes32)

计算 SHA-256 哈希。

ripemd160

ripemd160(bytes memory) returns (bytes20)

计算 RIPEMD-160 哈希。地址本身是用这个生成的。

Solidity官方文档

你可能感兴趣的:(Ethereum,区块链,Solidity)