Solidity
Solidity:投擲有任何捕捉機制嗎?如果不切換到返回使用可能會更好?
根據經驗豐富的導師,這裡似乎
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 的交易沒有發生(附帶的影響是所有提供的氣體都被破壞了)。您正在綜合最佳實踐,以便制定適合您的模式。這裡有幾個指針。
安全發送:
- 先做樂觀記賬……確保發送前的完整狀態,因為在與不受信任的合約交談後,我們無法再做進一步的流量控制假設。
- 嘗試
send()
並檢查結果。- 如果出現問題,還原更改(例如使用
throw
)。上面,你有發送後的會計。
不受信任的合約
我不清楚為什麼應該將資金發送給兩個可能的接收者之一,但無論如何都存在問題。
- 一次不要與一個以上的外部契約交談。也就是說,
sends()
二合一交易是一個危險信號。我的口味太忙了。建議:將其分解為較小的功能並專注於會計而不是直接進入
send()
. 跟踪誰欠了算術/儲存操作。throw
在這種情況下,您不需要這樣做,if() {} else {}
邏輯應該可以正常工作。使用撤回模式一次處理一個索賠和一個使用者。https://github.com/ConsenSys/smart-contract-best-practices#favor-pull-over-push-for-external-calls
希望能幫助到你。