由於版本更新比較快。過去一部分寫法,現在使用0.5.10
版本開發合約時,部分報錯。再去翻翻官方的最新的文檔。
文章目錄
一、特殊變量
msg
msg.sender
(address
) 消息發送者(當前調用)msg.value
(uint
) 隨消息發送的 wei 的數量msg.data
(bytes
) 完整的 calldatamsg.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
<address>.balance
(uint256
): 以 Wei 爲單位的地址類型的餘額。<address payable>.transfer(uint256 amount)
: 向地址類型發送數量爲 amount 的 Wei,失敗時拋出異常,發送 2300 gas 的礦工費,不可調節。<address payable>.send(uint256 amount) returns (bool)
:向地址類型發送數量爲 amount 的 Wei,失敗時返回false
,發送 2300 gas 的礦工費用,不可調節。<address>.call(...) returns (bool)
: 發出低級函數CALL
,失敗時返回false
,發送所有可用 gas,可調節。<address>.callcode(...) returns (bool)
:已禁止使用。<address>.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
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 哈希。地址本身是用這個生成的。