DEV Community

Cover image for APIs in SOLIDITY Smart Contracts: Is this even possible?!
Chidozie Zeno Ezeanekwe
Chidozie Zeno Ezeanekwe

Posted on • Edited on

APIs in SOLIDITY Smart Contracts: Is this even possible?!

Is it possible to use APIs in Solidity Smart Contracts?

The answer is yes.
APIs or Application Programming Interfaces are a way for applications to communicate with each other and exchange data. Over the years, developers have become more and more familiar with APIs and their use in developing applications.

In the context of Solidity Smart Contracts

using APIs can be a powerful tool to enhance the functionality of a Smart Contract. APIs can be used to access external data sources and perform various tasks, such as executing trades, sending and receiving payment, and more.

The most common way to use APIs in Solidity Smart Contracts is with an Oracle.

An oracle in Solidity can be implemented as a smart contract, allowing it to connect to external data sources and provide data to other Smart contracts on the Ethereum blockchain.

This is particularly useful for smart contracts that need to interact with external data, such as stock prices, weather, or even sports scores.

So why is it easier to create oracles in Solidity 0.8 and above?

The main reason is that Solidity 0.8 introduced a new feature called "external function calls", which allows smart contracts to call functions in other smart contracts. This means that we can create a smart contract that acts as an oracle, and other smart contracts can call that oracle to access external data.

In this article, we will be discussing how to use a weather API to power a smart contract - how to set up a weather API, and use it to power a smart contract.

The following code example shows how to connect to a weather API in Solidity.

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


// Create a contract to connect to the weather API
contract WeatherApi {
 // Store the API key
 string apiKey;

 // constructor to set the API key
 constructor(string _apiKey) public {
  apiKey = _apiKey;
 }

 // Function to connect to the API
 function getWeatherData() public returns (string result) {
  // Make an HTTP request to the API
  bytes memory response = http.post(weatherApiURL, json.encode(apiKey));

  // If the response is valid, store the result
  if (response.length > 0) {
   result = response.toString();
  }
  // If the response is not valid, throw an error
  else {
   require(false, "Error connecting to weather API");
  }

  // Return the result
  return result;
 }
}
Enter fullscreen mode Exit fullscreen mode

The code above creates a contract to connect to a weather API. The constructor takes in an API key and stores it in the apiKey variable. The getWeatherData() function makes an HTTP request to the API and stores the response in a result variable. If the response is not valid, the function throws an error. Once the result is stored, it is returned from the function.

Using the Weather API in Other Smart Contracts

Once the WeatherApi contract is set up, it can be used in other smart contracts to power them with real-world data.

The following code example shows how to use the WeatherApi contract in another smart contract.

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Create a contract to use the WeatherApi
contract WeatherSmartContract {
 WeatherApi weatherApi;

 // Constructor to set the WeatherApi
 constructor(address _weatherApi) public {
  weatherApi = WeatherApi(_weatherApi);
 }

 // Function to get the current temperature
 function getCurrentTemperature() public returns (uint result) {
  // Call the WeatherApi and store the result
  string memory response = weatherApi.getWeatherData();

  // Parse the response to get the temperature
  uint temperature = parseTemperature(response);

  // Return the temperature
  return temperature;
 }

 // Helper function to parse the response
 function parseTemperature(string memory response) private returns (uint temperature) {
  // Parse the response to get the temperature
  // Code to parse the response goes here

  // Return the temperature
  return temperature;
 }
}

Enter fullscreen mode Exit fullscreen mode

The code above creates a contract to use the WeatherApi contract. The constructor takes in the address of the WeatherApi contract and stores it in the weatherApi variable. The getCurrentTemperature() function calls the WeatherApi contract to get the weather data, parses the response to get the temperature, and returns the temperature.

However, itโ€™s important to note that using APIs in Solidity Smart Contracts can be a risky endeavor. As with any type of code, itโ€™s important to ensure that your Smart Contract is properly tested and includes robust error handling. This will help to ensure that the Smart Contract is secure and that it operates as expected.

Also, Kindly connect with me on linkedin and follow me on Twitter, I follow back.

Top comments (2)

Collapse
 
cold0z profile image
Jihad Haddou

// Note: Blockchains inherently lack the capability to communicate with external APIs directly.
// The following code is not working as expected BlockChaine CANNOT talk to api
// External data retrieval typically requires the use of oracles or off-chain solutions
NOT WORKING

Collapse
 
draculajul profile image
Dracula

This is amazing, working on a project that need to source data from a rest api, did you test this contract and if yes can you please send me the contract hash