W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Solidity 中的錯(cuò)誤提供了一種方便且高效的方式來(lái)向用戶(hù)解釋操作失敗的原因。它們可以在合約內(nèi)部和外部定義(包括接口和庫(kù))。
它們必須與revert 語(yǔ)句一起使用, 這會(huì)導(dǎo)致當(dāng)前調(diào)用中的所有更改都被還原并將錯(cuò)誤數(shù)據(jù)傳遞回調(diào)用者。
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; /// Insufficient balance for transfer. Needed `required` but only /// `available` available. /// @param available balance available. /// @param required requested amount to transfer. error InsufficientBalance(uint256 available, uint256 required); contract TestToken { mapping(address => uint) balance; function transfer(address to, uint256 amount) public { if (amount > balance[msg.sender]) revert InsufficientBalance({ available: balance[msg.sender], required: amount }); balance[msg.sender] -= amount; balance[to] += amount; } // ... }
錯(cuò)誤不能被重載或覆蓋,而是被繼承。只要范圍不同,就可以在多個(gè)地方定義相同的錯(cuò)誤。錯(cuò)誤實(shí)例只能使用revert語(yǔ)句創(chuàng)建。
該錯(cuò)誤會(huì)創(chuàng)建數(shù)據(jù),然后通過(guò)還原操作將其傳遞給調(diào)用者,以返回到鏈外組件或在try/catch 語(yǔ)句中捕獲它。請(qǐng)注意,錯(cuò)誤只能在來(lái)自外部調(diào)用時(shí)被捕獲,在內(nèi)部調(diào)用或同一函數(shù)內(nèi)部發(fā)生的還原無(wú)法被捕獲。
如果不提供任何參數(shù),則錯(cuò)誤只需要四個(gè)字節(jié)的數(shù)據(jù),您可以使用上面的NatSpec進(jìn)一步解釋錯(cuò)誤背后的原因,它沒(méi)有存儲(chǔ)在鏈上。這使得它同時(shí)成為一個(gè)非常便宜和方便的錯(cuò)誤報(bào)告功能。
更具體地說(shuō),錯(cuò)誤實(shí)例以與函數(shù)調(diào)用相同名稱(chēng)和類(lèi)型的函數(shù)相同的方式進(jìn)行 ABI 編碼,然后將其用作revert操作碼中的返回?cái)?shù)據(jù)。這意味著數(shù)據(jù)包含一個(gè) 4 字節(jié)選擇器,后跟ABI 編碼數(shù)據(jù)。選擇器由錯(cuò)誤類(lèi)型簽名的 keccak256-hash 的前四個(gè)字節(jié)組成。
筆記
合同可能會(huì)因同名的不同錯(cuò)誤或什至在調(diào)用者無(wú)法區(qū)分的不同位置定義的錯(cuò)誤而恢復(fù)。對(duì)于外部,即 ABI,只有錯(cuò)誤的名稱(chēng)是相關(guān)的,而不是定義它的合同或文件。
如果您可以定義 ,該語(yǔ)句將等效于 . 但是請(qǐng)注意,這是一個(gè)內(nèi)置類(lèi)型,不能在用戶(hù)提供的代碼中定義。require(condition, "description");if (!condition) revert Error("description")error Error(string)Error
同樣,失敗assert或類(lèi)似的情況將恢復(fù)為內(nèi)置類(lèi)型的錯(cuò)誤Panic(uint256)。
筆記
錯(cuò)誤數(shù)據(jù)應(yīng)該只用于給出失敗的指示,而不是作為控制流的手段。原因是內(nèi)部調(diào)用的還原數(shù)據(jù)默認(rèn)通過(guò)外部調(diào)用鏈傳播回來(lái)。這意味著內(nèi)部調(diào)用可以“偽造”恢復(fù)看起來(lái)可能來(lái)自調(diào)用它的合約的數(shù)據(jù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: