0

I want to create a contract, which has a deposit function.

But I also want, in the constructor, to start a "thread" that polls an external data source (via oraclize/chainlink or similar) at certain frequency.

Or instead of setting up a loop, should I just call each new block ?

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");
        }
    }

Given the above code how could I call oraclize_getPrice("URL") (which I assume is inherited) every for 10 seconds, or every new block ? Completely outside of a payable function.

2
  • the simple answer: you can't.
    – Majd TL
    Sep 11, 2020 at 6:58
  • @MajdTL nice. Any further info ? Sep 11, 2020 at 7:00

2 Answers 2

1

Smart contracts does not allow for security reason to call outside services. You will not be able to start new threads, this feature does not exist. Can you give more details about your needs to see how we can help you ?

3
  • I thought you could oraclize a call ? Sep 11, 2020 at 6:04
  • Oracles "inject" your data into the smart contract from outside. Smart contracts are not able to call outside services. Sep 11, 2020 at 6:13
  • OK, I will expand question Sep 11, 2020 at 6:15
0

What you are trying to do is not possible with smart contracts in this form.

  • A contract cannot automatically run periodically. It has to be invoked by a transaction
  • There are no threads in smart contracts, only single-thread synchronous execution
  • A contract cannot interact with off-chain services (e.g. an API)

If you want to have some kind of off-chain values in your contract you have to provide them with a transaction.

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;
    }
}

Then you can make a piece of software (e.g. in Java) which queries the API you want to use for changes. If it detects a change it initiates a call to setPrice with the value.

4
  • Hi thanks. I get the single threaded idea. But I thought oraclize was for external api calls, and chainlink ? Sep 11, 2020 at 10:19
  • In essence Chainlink works like this. Of course in reality there is a lot more involved - especially making sure that the correct values are supplied to the contract.
    – Bobface
    Sep 11, 2020 at 10:21
  • ok. But even without chainlink, oraclize can call an external api right ? Sep 11, 2020 at 10:22
  • No. A smart contract can never directly call an API or anything outside the chain. It can only interact with other contracts during execution.
    – Bobface
    Sep 11, 2020 at 10:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.