Solidity

新執行緒的solidity等價物

  • September 11, 2020

我想創建一個具有存款功能的合約。

但我還希望在建構子中啟動一個“執行緒”,以特定頻率輪詢外部數據源(通過 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

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