We’ve met with the Oraclize people a few times, and we love what they do. There are also important synergies in what Streamr and Oraclize can do together. Let me explain, and show an example.

For fun, and to demonstrate Streamr and Oraclize working in tandem, we built a little example that watches the flippening (Ethereum potentially overtaking Bitcoin as the leading blockchain) in real-time. This idea was inspired by flippening.watch, which lists many metrics such as market cap and number of transactions, but none related to social media. So we chose to add some analytics using social media data. Using the streaming Twitter API and Streamr we build a process that listens to raw tweets mentioning either Ethereum or Bitcoin, counts the tweets in various timeframes, and makes the results available from our API. Later in this post, we’ll query this data from a smart contract.

Just to show you what the data currently looks like, here’s a table of real-time Twitter statistics, as received from our streaming API:

WindowEthereum tweetsBitcoin tweetsFlippening1 min1 hour24 hours

In the Streamr Engine, there’s two ways to convey data to smart contracts. The first method is event-driven: sending transactions directly from the Canvas via the EthereumCall module (see this or this example). The second option is to query for data from our web API when needed. This is preferable in use cases where a smart contract needs the data upon request instead of being constantly notified about the newest data.

Oraclize can easily facilitate this. They offer a request-response bridge between the blockchain and any web API such as Streamr’s. A smart contract can call a function on the Oraclize smart contract in order to request for data from a source such as an URL. Their off-chain system watches for these calls, and when one occurs, they go ahead and fetch the required data, and send the response back to the requesting smart contract by calling its callback function. Oraclize can even generate a proof if required, cryptographically showing that the data really came from our web API.

The results are being calculated from raw tweets using a canvas that counts the tweets in 1 minute, 1 hour, and 24 hour rolling windows and produces the results to a new stream. The result stream can be listened to by external applications, similarly to how this web page subscribes to it to show the table above. However, events in the stream can also be queried via our HTTP API. The following URL returns the latest event in the stream:

To enable a smart contract to get the latest data on demand (for betting purposes, for example 😊), you can use Oraclize. Below is an example for Ethereum, written in Solidity. It requests Oraclize to fetch the current statistics from the Streamr API by calling the oraclize_query function. The result is soon thereafter delivered to the __callback function by Oraclize:

pragma solidity ^0.4.0;

import "github.com/oraclize/ethereum-api/oraclizeAPI.sol"; contract StreamrFlippeningDemo is usingOraclize { string public latest; event newOraclizeQuery(string description, uint256 fee);

event newFlippeningData(string data); function StreamrFlippeningDemo() {

// update();

} function __callback(bytes32 myid, string result) {

if (msg.sender != oraclize_cbAddress()) throw;

latest = result;

newFlippeningData(latest);

}

uint256 fee = oraclize_getPrice("URL");

if (fee > this.balance) {

newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee.", fee);

} else {

newOraclizeQuery("Oraclize query was sent, standing by for the answer..", fee);

oraclize_query("URL", "json(https://eth.streamr.com/api/v1/streams/I1AWyGXDRg28AO33ztPBZg/data/partitions/0/last?wrapper=object&content=json).0.content.flippening_24h");

}

}

}

Streamr Editor is a low-code environment that allows users to build data-driven processes visually using drag and drop. Below, you can see the Canvas that counts tweets for the various time frames on both source streams, and produces the result into another stream (click function update() payable {uint256 fee = oraclize_getPrice("URL");if (fee > this.balance) {newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee.", fee);} else {newOraclizeQuery("Oraclize query was sent, standing by for the answer..", fee);oraclize_query("URL", "json(https://eth.streamr.com/api/v1/streams/I1AWyGXDRg28AO33ztPBZg/data/partitions/0/last?wrapper=object&content=json).0.content.flippening_24h");Streamr Editor is a low-code environment that allows users to build data-driven processes visually using drag and drop. Below, you can see the Canvas that counts tweets for the various time frames on both source streams, and produces the result into another stream (click here to open in full screen):