Solidity

Solidity:投擲有任何捕捉機制嗎?如果不切換到返回使用可能會更好?

  • September 25, 2017

根據經驗豐富的導師,這裡似乎throw建議了機制。我猜不存在擷取機制:https ://ethereum.stackexchange.com/a/2512/4575 。throw

基於此,我有一個問題:首先我必須檢查一些可能需要高氣體值的條件。如果條件失敗throw將發生。所以如果條件失敗,我想把錢還給客戶。否則,錢應該還給集群。

$$ Q $$如果條件失敗,throw就會發生。由於throw終止了程式碼,我無法捕捉到恢復的版本,並應用 1 行程式碼將錢還給客戶。有沒有其他解決方案來處理這個問題? 請注意,條件會改變狀態。所以我必須做throw如果有條件失敗。

function payMeBack() {
   if(require(<some condition>)) //if condition is wrong throw take place and never JUMPS to else side.
      if(!client.send(gainedWei)) throw; 
   else
      if(!cluster.send(gainedWei)) throw; 
   gainedWei = 0;
   client.success = 1;
}

感謝您寶貴的時間和幫助。

沒有用於投擲的捕捉機制。狀態恢復到交易前狀態。忽略操作順序,甚至呼叫合約中發生的操作。Throw表示源自簽署交易的 EOA 的交易沒有發生(附帶的影響是所有提供的氣體都被破壞了)。

您正在綜合最佳實踐,以便制定適合您的模式。這裡有幾個指針。

安全發送:

  1. 先做樂觀記賬……確保發送前的完整狀態,因為在與不受信任的合約交談後,我們無法再做進一步的流量控制假設。
  2. 嘗試send()並檢查結果。
  3. 如果出現問題,還原更改(例如使用throw)。

上面,你有發送的會計。

不受信任的合約

我不清楚為什麼應該將資金發送給兩個可能的接收者之一,但無論如何都存在問題。

  1. 一次不要與一個以上的外部契約交談。也就是說,sends() 二合一交易是一個危險信號。我的口味太忙了。

建議:將其分解為較小的功能並專注於會計而不是直接進入send(). 跟踪誰欠了算術/儲存操作。throw在這種情況下,您不需要這樣做,if() {} else {}邏輯應該可以正常工作。

使用撤回模式一次處理一個索賠和一個使用者。https://github.com/ConsenSys/smart-contract-best-practices#favor-pull-over-push-for-external-calls

希望能幫助到你。

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