Solidity

混音警告:斷言

  • December 18, 2017

我正在嘗試在 remix 上編譯契約並遇到以下警告:

如果您永遠不希望x為假,請使用assert(x),而不是在任何情況下(除了程式碼中的錯誤)。如果x可能為假,則使用 require(x) ,例如無效輸入或外部組件故障。

我的程式碼中使用斷言的部分是:

assert(checkPlayerExists(msg.sender) == false);
assert(number >= 1 && number <= 10);
assert(msg.value >= minimumBet);

希望有人解釋一下,因為它似乎有點神秘。

這是一種誤用,assert因為根據輸入,表達式的計算結果可能為false. 改為使用require()

assert()旨在檢查契約本身的邏輯錯誤。斷言在任何情況下都必須始終為真的事實,因此任何錯誤的可能性都是邏輯問題。

考慮:

uint balanceAlice = 10;
uint balanceBob = 5;
uint conserveFunds = balanceAlice + balanceBob;

// do stuff
uint conservedFunds = balanceAlice + balanceBob;

// whatever we did, we should always end up with the same funds accounted for.
// ANY departure from this principal means the contract contains a logic error. 
assert(conserveFunds == conservedFunds)

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/33741