Oracles
Oraclize __callback 函式,gas 使用量不受限制
我正在製作彩票契約並使用 Oraclize 選擇中獎號碼。
這是我現在擁有的:
所有者呼叫 finalize() 函式,該函式不允許新條目,並呼叫 Oraclize(使用 WolframAlpha 作為數據源)。然後,oracle 使用結果呼叫我的 __callback 函式,我的合約使用它來找到獲勝者,分配獎金,並重置合約以再次接受條目。此操作涉及循環,並採取與條目數成比例的步驟。由於條目數量沒有限制,我相信這個操作的gas使用是沒有限制的。
我考慮過這些選項:
- 以某種方式估計氣體使用量,並在 oraclize 呼叫中指定。
- 從回調函式中去掉邏輯,只用它來設置中獎號碼。然後所有者必須呼叫一個分發函式來執行計算繁重的步驟。
我發現這兩種選擇都有問題。在我看來,oraclize 回調函式旨在保持簡單。但是,我想避免所有者必須呼叫合約兩次(這第二個選項也會引發不誠實的所有者在看到中獎號碼時不呼叫分發函式的問題)。
這種類型的用法有共同的模式嗎?解決這個問題的正確方法是什麼?
先感謝您。
老實說,正確和更安全的方法將是您想到的第二個選擇。
您也可以嘗試提前估算 gas 價格,然後將該金額設置為包含在回調中。Oraclize 允許您設置所需的任何金額,儘管您當然希望保持在網路 gas 限制範圍內,否則交易將永遠不會被接受。總是存在不可預見/未綁定循環的風險,儘管緩解它的一種方法是,您可以讓循環監視它是否即將耗盡氣體,並將其所做的任何事情儲存在狀態中,以便您繼續解決手動。
以下是有關設置氣體限制的一些文件: https ://docs.oraclize.it/#ethereum-quick-start-custom-gas-limit-and-gas-price