Understanding Smart Contract ABI
Published: 2023-03-03 21:32:57

Photo by <a href="https://unsplash.com/@fabioha?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">fabio</a> on <a href="https://unsplash.com/s/photos/ethereum?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
  
In this article, we will explore what ABI is, why it is important for smart contracts and how it works with an example. 

### What is ABI?

Application Binary Interface (ABI) is a set of rules that defines how software components interact with each other. In the context of smart contracts, ABI defines how external applications should interact with a smart contract. This includes the data types that can be used to communicate with the contract, the order in which data should be sent, and the structure of the function calls that are supported.

ABI is a standardized format that allows different programming languages to communicate with each other, making it easier for developers to build applications that interact with smart contracts. ABI is used to create a contract interface, which is a set of functions and their input and output parameters that define how an external application can interact with a smart contract.

### Why is ABI important for smart contracts?

ABI is important for smart contracts because it allows external applications to interact with them in a standardized way. Without ABI, developers would have to manually write code to interact with each individual smart contract, which would be time-consuming and error-prone. With ABI, developers can write code to interact with any smart contract that conforms to the ABI standard, regardless of which programming language it was written in.

ABI also allows smart contracts to be upgraded without breaking external applications that interact with them. When a smart contract is upgraded, the ABI can be updated to reflect any changes to the contract interface. External applications can then be updated to use the new ABI, without having to change any other code.

### How does ABI work?

ABI is based on a binary format that is used to encode function calls and their parameters. When an external application wants to call a function in a smart contract, it encodes the function call and its parameters using the ABI format. The encoded data is then sent to the smart contract which decodes the data and executes the function.


### ABI Elements 

ABI supports several data types, including integers, booleans, strings, and arrays. It also supports complex data structures, such as structs and mappings. The ABI format includes a function signature, which is a unique identifier for each function. The function signature is based on the function name and the types of its parameters.

### Example

For this example, we are going to write a simple smart contract. 

```solidity
// SPDX-License-Identifier: MIT
   
pragma solidity ^0.8.1;

/// a simple set and get function for mood defined: 

//define the contract
contract MoodDiary{
    
    //create a variable called mood
    string mood;
    
    //create a function that writes a mood to the smart contract
    function setMood(string memory _mood) public{
        mood = _mood;
    }
    
    //create a function the reads the mood from the smart contract
    function getMood() public view returns(string memory){
        return mood;
    }
}
```

With Remix IDE, we can easily get our contract ABI after deploying the smart contract. If you look at the bottom of the screenshot, you will find ABI. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ojqbfgdqdxj0fdofavhk.png)


The complete ABI for our mood smart contract would look like this 

```solidity
[
	{
		"inputs": [],
		"name": "getMood",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	},
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_mood",
				"type": "string"
			}
		],
		"name": "setMood",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	}
]
```


In conclusion, ABI enables smart contracts to be interoperable with external applications. It provides a standardized format for interacting with smart contracts, making it easier for developers to build applications that use them. ABI also allows smart contracts to be upgraded without breaking existing applications.