欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Solidity錯誤處理是什么

本篇內(nèi)容介紹了“Solidity錯誤處理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

西藏網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,西藏網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為西藏成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的西藏做網(wǎng)站的公司定做!

什么是錯誤處理

錯誤處理是指在程序發(fā)生錯誤時的處理方式,Solidity處理錯誤和我們常見的語言不一樣,Solidity是通過回退狀態(tài)的方式來處理錯誤。發(fā)生異常時會撤消當(dāng)前調(diào)用(及其所有子調(diào)用)所改變的狀態(tài),同時給調(diào)用者返回一個錯誤標(biāo)識。注意捕捉異常是不可能的,因此沒有try ... catch...。

為什么Solidity處理錯誤要這樣設(shè)計呢? 我們可以把區(qū)塊鏈理解為是全球共享的分布式事務(wù)性數(shù)據(jù)庫。全球共享意味著參與這個網(wǎng)絡(luò)的每一個人都可以讀寫其中的記錄。如果想修改這個數(shù)據(jù)庫中的內(nèi)容,就必須創(chuàng)建一個事務(wù),事務(wù)意味著要做的修改(假如我們想同時修改兩個值)只能被完全的應(yīng)用或者一點都沒有進行。 學(xué)習(xí)過數(shù)據(jù)庫的同學(xué),應(yīng)該理解事務(wù)的含義,如果你對事務(wù)一詞不是很理解,建議你搜索一下“數(shù)據(jù)庫事務(wù)“。 Solidity錯誤處理就是要保證每次調(diào)用都是事務(wù)性的。

如何處理

Solidity提供了兩個函數(shù)assert和require來進行條件檢查,如果條件不滿足則拋出異常。assert函數(shù)通常用來檢查(測試)內(nèi)部錯誤,而require函數(shù)來檢查輸入變量或合同狀態(tài)變量是否滿足條件以及驗證調(diào)用外部合約返回值。 另外,如果我們正確使用assert,有一個Solidity分析工具就可以幫我們分析出智能合約中的錯誤,幫助我們發(fā)現(xiàn)合約中有邏輯錯誤的bug。

除了可以兩個函數(shù)assert和require來進行條件檢查,另外還有兩種方式來觸發(fā)異常:

  1. revert函數(shù)可以用來標(biāo)記錯誤并回退當(dāng)前調(diào)用

  2. 使用throw關(guān)鍵字拋出異常(從0.4.13版本,throw關(guān)鍵字已被棄用,將來會被淘汰。)

當(dāng)子調(diào)用中發(fā)生異常時,異常會自動向上“冒泡”。 不過也有一些例外:send,和底層的函數(shù)調(diào)用call, delegatecall,callcode,當(dāng)發(fā)生異常時,這些函數(shù)返回false。

注意:在一個不存在的地址上調(diào)用底層的函數(shù)call,delegatecall,callcode 也會返回成功,所以我們在進行調(diào)用時,應(yīng)該總是優(yōu)先進行函數(shù)存在性檢查。

在下面通過一個示例來說明如何使用require來檢查輸入條件,以及assert用于內(nèi)部錯誤檢查:

pragma solidity ^0.4.0;

contract Sharer {
    function sendHalf(address addr) public payable returns (uint balance) {
        require(msg.value % 2 == 0); // 僅允許偶數(shù)
        uint balanceBeforeTransfer = this.balance;
        addr.transfer(msg.value / 2);  // 如果失敗,會拋出異常,下面的代碼就不是執(zhí)行
        assert(this.balance == balanceBeforeTransfer - msg.value / 2);
        return this.balance;
    }
}

我們實際運行下,看看異常是如何發(fā)生的:

  1. 首先打開Remix,貼入代碼,點擊創(chuàng)建合約。如下圖: Solidity錯誤處理是什么

  2. 運行測試1:附加1wei (奇數(shù))去調(diào)用sendHalf,這時會發(fā)生異常,如下圖:

Solidity錯誤處理是什么

  1. 運行測試2:附加2wei 去調(diào)用sendHalf,運行正常。

  2. 運行測試3:附加2wei以及sendHalf參數(shù)為當(dāng)前合約本身,在轉(zhuǎn)賬是發(fā)生異常,因為合約無法接收轉(zhuǎn)賬,錯誤提示上圖類似。

assert類型異常

在下述場景中自動產(chǎn)生assert類型的異常:

  1. 如果越界,或負的序號值訪問數(shù)組,如i >= x.length 或 i < 0時訪問x[i]

  2. 如果序號越界,或負的序號值時訪問一個定長的bytesN。

  3. 被除數(shù)為0, 如5/0 或 23 % 0。

  4. 對一個二進制移動一個負的值。如:5<<i; i為-1時。

  5. 整數(shù)進行可以顯式轉(zhuǎn)換為枚舉時,如果將過大值,負值轉(zhuǎn)為枚舉類型則拋出異常

  6. 如果調(diào)用未初始化內(nèi)部函數(shù)類型的變量。

  7. 如果調(diào)用assert的參數(shù)為false

require類型異常

在下述場景中自動產(chǎn)生require類型的異常:

  1. 調(diào)用throw

  2. 如果調(diào)用require的參數(shù)為false

  3. 如果你通過消息調(diào)用一個函數(shù),但在調(diào)用的過程中,并沒有正確結(jié)束(gas不足,沒有匹配到對應(yīng)的函數(shù),或被調(diào)用的函數(shù)出現(xiàn)異常)。底層操作如call,send,delegatecall或callcode除外,它們不會拋出異常,但它們會通過返回false來表示失敗。

  4. 如果在使用new創(chuàng)建一個新合約時出現(xiàn)第3條的原因沒有正常完成。

  5. 如果調(diào)用外部函數(shù)調(diào)用時,被調(diào)用的對象不包含代碼。

  6. 如果合約沒有payable修飾符的public的函數(shù)在接收以太幣時(包括構(gòu)造函數(shù),和回退函數(shù))。

  7. 如果合約通過一個public的getter函數(shù)(public getter funciton)接收以太幣。

  8. 如果**.transfer()**執(zhí)行失敗

當(dāng)發(fā)生require類型的異常時,Solidity會執(zhí)行一個回退操作(指令0xfd)。 當(dāng)發(fā)生assert類型的異常時,Solidity會執(zhí)行一個無效操作(指令0xfe)。 在上述的兩種情況下,EVM都會撤回所有的狀態(tài)改變。是因為期望的結(jié)果沒有發(fā)生,就沒法繼續(xù)安全執(zhí)行。必須保證交易的原子性(一致性,要么全部執(zhí)行,要么一點改變都沒有,不能只改變一部分),所以需要撤銷所有操作,讓整個交易沒有任何影響。

注意assert類型的異常會消耗掉所有的gas, 而require從大都會版本(Metropolis, 即目前主網(wǎng)所在的版本)起不會消耗gas。

“Solidity錯誤處理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

當(dāng)前標(biāo)題:Solidity錯誤處理是什么
文章起源:http://chinadenli.net/article46/jhggeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)品牌網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化網(wǎng)站內(nèi)鏈微信小程序網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化