Solidity
新執行緒的solidity等價物
我想創建一個具有存款功能的合約。
但我還希望在建構子中啟動一個“執行緒”,以特定頻率輪詢外部數據源(通過 oraclize/chainlink 或類似方法)。
或者我應該只呼叫每個新塊而不是設置循環?
contract SimpleOraclizeContract is usingOraclize { function SimpleOraclizeContract() { // something like this in java new thread().run(new Runnable(){ while(true){ sleep(10); if(oraclize_getPrice() > 100) { doSomething(); } } }) } function updatePrice() payable { if (oraclize_getPrice("URL") > this.balance) { LogNewOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer.."); oraclize_query("URL", "json(https://api.kraken.com/0/public/Ticker?pair=ETHXBT).result.XETHXXBT.c.0"); } }
鑑於上面的程式碼,我如何每 10 秒或每個新塊呼叫 oraclize_getPrice(“URL”) (我假設是繼承的)?完全在應付功能之外。
出於安全原因,智能合約不允許呼叫外部服務。您將無法啟動新執行緒,此功能不存在。您能否詳細說明您的需求,以了解我們如何為您提供幫助?
使用這種形式的智能合約,您嘗試做的事情是不可能的。
- 合約不能定期自動執行。它必須由事務呼叫
- 智能合約沒有執行緒,只有單執行緒同步執行
- 合約不能與鏈下服務(例如 API)互動
如果你想在你的合約中包含某種鏈下價值,你必須向他們提供交易。
contract USDPrice { address admin; uint price; constructor() public { admin = msg.sender; } function setPrice(uint newPrice) external { require(admin == msg.sender, "only admin is allowed to set price"); price = newPrice; } }
然後你可以製作一個軟體(例如Java)來查詢你想要用於更改的API。如果它檢測到更改,它會使用該值發起呼叫
setPrice
。