鍍金池/ 教程/ Linux/ 單位和全局可用變量
簡介
編程規(guī)范
雜項
源文件的布局
單位和全局可用變量
合約的結(jié)構(gòu)
通用模式
常見問題
深入理解 Solidity
安裝Solidity
智能合約介紹
合約
Solidity 編程實例
http://solidity.readthedocs.io/en/latest/security-considerations
類型
表達式和控制結(jié)構(gòu)

單位和全局可用變量

以太單位

數(shù)詞后面可以有一個后綴, wei, finney, szabo 或 ether 和 ether 相關(guān)量詞 之間的轉(zhuǎn)換,在以太幣數(shù)量后若沒有跟后綴,則缺省單位是“wei“,?? 如? 2 ether? == 2000 finney?? (這個表達式)計算結(jié)果為true。?

時間單位

后綴的秒,分,小時,天,周,年,? 數(shù)量詞的時間單位之間可以用來轉(zhuǎn)換,秒是基本單位。下面是常識:

  • 1 = 1秒????????????? (原文使用了兩個==,可能有誤 --譯者注)
  • 1分鐘 = 60秒???? (原文使用了兩個==,可能有誤 --譯者注)
  • 1小時 = 60分鐘 (原文使用了兩個==,可能有誤 --譯者注)
  • 1天=24小時?????? (原文使用了兩個==,可能有誤 --譯者注)
  • 1周= 7天
  • 1年= 365天

如果你使用這些單位執(zhí)行日歷計算,要注意以下問題。?? 因為閏秒,所以每年不總是等于365天,甚至每天也不是都有24小時,。由于無法預(yù)測閏秒,一個精確的日歷庫必須由外部oracle更新。

這些后綴不能用于變量。如果你想解釋一些輸入變量, 如天,你可以用以下方式:

function?f(uint?start,?uint?daysAfter) {

??if?(now?>=?start?+?daysAfter?*?1 days) { ... }}

Special Variables and Functions

特殊的變量和函數(shù)

有特殊的變量和函數(shù)總是存在于全局命名空間,主要用于提供關(guān)于blockchain的信息。

塊和交易屬性

  • block.coinbase (address): :當前塊的礦工的地址
  • block.difficulty (uint):當前塊的難度系數(shù)
  • block.gaslimit (uint):當前塊汽油限量
  • block.number (uint):當前塊編號
  • block.blockhash (function(uint) returns (bytes32)):指定塊的哈希值——最新的256個塊的哈希值
  • block.timestamp (uint):當前塊的時間戳
  • msg.data (bytes):完整的calldata
  • msg.gas (uint):剩余的汽油
  • msg.sender (address):消息的發(fā)送方(當前調(diào)用)
  • msg.sig (bytes4):calldata的前四個字節(jié)(即函數(shù)標識符)
  • msg.value (uint):所發(fā)送的消息中wei的數(shù)量
  • now (uint):當前塊時間戳(block.timestamp的別名)
  • tx.gasprice (uint):交易的汽油價格
  • tx.origin (address):交易發(fā)送方(完整的調(diào)用鏈)

請注意

msg的所有成員的值,包括msg.sender和msg.value可以在每個 external函數(shù)調(diào)用中改變。這包括調(diào)用庫函數(shù)。

如果你想在庫函數(shù)實現(xiàn)訪問限制使用msg.sender, 你必須手動設(shè)置msg.sender作為參數(shù)。

請注意

由于所有塊可伸縮性的原因,(所有)塊的Hash值就拿不到。你只能訪問最近的256塊的Hash值,其他值為零。

數(shù)學和加密功能

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

計算 (x + y) % k?? (按指定的精度,不能超過2**256)

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

compute (x * y) % k where the multiplication is performed with arbitrary precision and does not wrap around at 2256. (按指定的精度,不能超過2**256)

計算compute (x * y) % k?

sha3(...) returns (bytes32):

計算(緊湊排列的)參數(shù)的Ethereum-SHA-3 的Hash值值

sha256(...) returns (bytes32):

計算(緊湊排列的)參數(shù)的SHA-256 的Hash值

ripemd160(...) returns (bytes20):

計算(緊湊排列的)參數(shù)的 RIPEMD-160 的Hash值

ecrecover(bytes32, byte, bytes32, bytes32) returns (address):

恢復(fù)橢圓曲線特征的公鑰-參數(shù)為(data, v, r, s)

在上述中,“緊湊排列”,意思是沒有填充的參數(shù)的連續(xù)排列,也就是下面表達式是沒有區(qū)別的

sha3("ab", "c")

sha3("abc")

sha3(0x616263)

sha3(6382179)

sha3(97, 98, 99)

如果需要填充,要用顯示的形式表示: sha3(“x00x12”) 和 sha3(uint16(0x12))是相同的。

在一個私有的blockchain里,你可能(在使用)sha256, ripemd160 或 ecrecover (的時候) 碰到"Out-of-Gas"(的問題)??。原因在于這個僅僅是預(yù)編譯的合約,合約要在他們接到的第一個消息以后才真正的生成(雖然他們的合約代碼是硬編碼的)。對于沒有真正生成的合約的消息是非常昂貴的,這時就會碰到“Out-of-Gas”的問題。 這一問題的解決方法是事先把1wei 發(fā)送到各個你當前使用的各個合約上。這不是官方或測試網(wǎng)的問題。

合約相關(guān)的

this (current contract’s type):

當前的合約,顯示可轉(zhuǎn)換地址

selfdestruct(address)::

銷毀當前合約,其資金發(fā)送給指定的地址

此外,當前合同的所有函數(shù)均可以被直接調(diào)用(包括當前函數(shù))。

? Copyright 2015, Ethereum. Revision 37381072.

Built with?Sphinx?using a?theme?provided by?Read the Docs.