天天看點

【Solidity】4.機關和全局可變量 - 深入了解Solidity索引機關和全局可變量

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77877841" target="_blank">【Solidity】1.一個Solidity源檔案的布局</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77892188" target="_blank">【Solidity】2.合約的結構體</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77930835" target="_blank">【Solidity】3.類型</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77942459" target="_blank">【Solidity】4.機關和全局可變量</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77964409" target="_blank">【Solidity】5.表達式和控制結構</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77981249" target="_blank">【Solidity】6. 合約</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77989384" target="_blank">【Solidity】7. 部件</a>

<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/78016231" target="_blank">【Solidity】8. 雜項</a>

一個字面上的數字可以帶有wei,finney,szabo或者以太網的字尾,可以在以太網的子目錄之間進行轉換,其中沒有字尾的以太網貨币号被假定為魏。 2 ether == 2000 finney評估為true。

可以使用文字數字後的秒,分,小時,天,周和年份進行字尾轉換,其中以秒為機關,以下列方式将機關視為天真的時間機關:

<code>1 == 1 seconds</code>

<code>1 minutes == 60 seconds</code>

<code>1 hours == 60 minutes</code>

<code>1 days == 24 hours</code>

<code>1 weeks == 7 days</code>

<code>1 years == 365 days</code>

如果您使用這些機關執行月曆計算,請小心,因為不是每年等于365天,甚至每天都沒有24小時,因為閏秒。 由于無法預測閏秒的事實,必須由外部的oracle更新精确的月曆庫。

這些字尾不能應用于變量。 如果你想解釋某些輸入變量,例如。 天,你可以通過以下方式做到:

有一些特殊的變量和函數總是存在于全局命名空間中,主要用于提供關于塊鍊的資訊。

<code>block.blockhash(uint blockNumber) returns (bytes32)</code> 給定塊的哈希 - 僅适用于256個不包括目前最新塊

<code>block.coinbase (address)</code> 目前塊礦工位址

<code>block.difficulty (uint)</code> 目前塊難度

<code>block.gaslimit (uint)</code> 目前塊gaslimit

<code>block.number (uint)</code> 目前資料塊号

<code>block.timestamp (uint)</code> 目前塊時間戳從unix紀元開始為秒

<code>msg.data (bytes)</code> 完整的calldata

<code>msg.gas (uint)</code> 剩餘gas

<code>msg.sender (address)</code> 該消息(目前呼叫)的發送者

<code>msg.sig (bytes4)</code> 呼叫資料的前四個位元組(即功能辨別符)

<code>msg.value (uint)</code> 發送的消息的數量

<code>now (uint)</code> 目前塊時間戳(block.timestamp的别名)

<code>tx.gasprice (uint)</code> gas價格的交易

<code>tx.origin (address)</code> 交易的發送者(全調用鍊)

msg的所有成員的值(包括msg.sender和msg.value)可以針對每個外部函數調用進行更改。 這包括對庫函數的調用。

如果要使用msg.sender在庫函數中實作通路限制,則必須手動提供msg.sender的值作為參數。

<code>assert(bool condition)</code>:

如果條件不滿足,則抛出 - 用于内部錯誤。

<code>require(bool condition)</code>:

如果條件不滿足,則抛出 - 用于輸入或外部元件中的錯誤。

<code>revert()</code>:

中止執行并恢複狀态更改

<code>addmod(uint x, uint y, uint k) returns (uint)</code>

計算(x + y)%k,其中以任意精度執行加法,并且不在2 ** 256處圍繞

<code>mulmod(uint x, uint y, uint k) returns (uint)</code>

計算(x * y)%k,其中乘法以任意精度執行,并且不會在2 ** 256處循環。

<code>keccak256(...) returns (bytes32)</code>

計算的(緊湊)參數的Ethereum-SHA-3(Keccak-256)的散列

<code>sha256(...) returns (bytes32)</code>

計算(緊密包裝)參數的SHA-256散列

<code>sha3(...) returns (bytes32)</code>

keccak256的别名

<code>ripemd160(...) returns (bytes20)</code>

計算(緊密包裝)參數的RIPEMD-160哈希值

<code>ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)</code>

在上面,“緊密包裝”意味着參數是無連接配接的連接配接。 這意味着以下内容完全相同:

如果需要填充,可以使用顯式類型轉換:<code>keccak256("\x00\x12")</code> 與<code>keccak256(uint16(0x12))</code>相同。

請注意,常量将使用存儲它們所需的最少位元組數來打包。 這意味着,例如<code>keccak256(0) == keccak256(uint8(0))</code>和<code>keccak256(0x12345678) == keccak256(uint32(0x12345678))</code>

這可能是你在一個私人的塊上遇到了sha256,ripemd160或ecrecover的Out-of-Gas。 這樣做的原因是那些被實作為所謂的預編譯合同,這些合同在收到第一條消息之後才真正存在(盡管他們的合同代碼是寫死的)。 對非現有合約的消息更昂貴,是以執行将會進入“Out-of-Gas”錯誤。 這個問題的解決方法是首先發送例如 在您将實際合同中使用這些合約之前,每個合約1 Wei。 官網或測試網不是問題。

<code>&lt;address&gt;.balance (uint256)</code>

<code>&lt;address&gt;.transfer(uint256 amount)</code>

發送一定量wei向位址,抛出失敗

<code>&lt;address&gt;.send(uint256 amount) returns (bool)</code>

發送一定量wei向位址,失敗時傳回false

<code>&lt;address&gt;.call(...) returns (bool)</code>

發出低級CALL,失敗傳回false

<code>&lt;address&gt;.callcode(...) returns (bool)</code>

發出低級CALLCODE,失敗時傳回false

<code>&lt;address&gt;.delegatecall(...) returns (bool)</code>

發出低級DELEGATECALL,失敗傳回false

使用send有一些危險:如果調用堆棧深度為1024(這可以始終被呼叫者強制),則傳輸失敗,如果接收方耗盡gas,則傳輸失敗。 是以為了使安全的以太網傳輸,始終檢查發送的傳回值,使用轉移甚至更好:使用接收方提取錢的模式。

不鼓勵使用callcode,将來會被删除。

<code>this</code>

目前合約,明确轉換為位址

<code>selfdestruct(address recipient)</code>

摧毀目前的合同,将資金送到給定的位址

<code>suicide(address recipient)</code>

selfdestruct的别名

此外,目前合約的所有功能都可以直接調用,包括目前的功能。

繼續閱讀