ABI 란, 컨트랙트 함수와 매개변수들을 JSON 형식으로 나타낸 리스트다.
다음은 ERC20 Interface 의 BalanceOf 함수 ABI 이다.
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "tokenOwner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
함수 이름과 매개변수들이 들어가 있는 것을 알 수 있다.
ABI 는 보통 두 프로그램 모듈의 인터페이스 역할을 하고 그 중 하나는 종종 기계어 레벨에 있다. 인터페이스는 데이터를 기계 코드로 인코딩/디코딩 하기 위한 방법이다.
이더리움에서 기본적으로 EVM 에 솔리디티 컨트랙트 호출을 할 때 인코딩을 하거나, 트랜잭션들로부터 데이터를 읽는 방법이다.
ABI는 컨트랙트 내의 함수를 호출하거나 컨트랙트로부터 데이터를 얻는 방법이다. 이더리움 스마트 컨트랙트는 이더리움 블록체인에 배포된 바이트코드다. 컨트랙트 내에 여러 개의 함수가 있을 수 있을 것이다. ABI는 컨트랙트 내의 어떤 함수를 호출할지를 지정하는데 필요하며, 우리가 생각했던 대로 함수가 데이터를 리턴한다는 것을 보장하기 위해 반드시 필요하다.
이더리움 생태계에는 정말 많은 트랜잭션들이 존재할 것이다. 그 중에서 나에게 필요한 컨트랙트를 호출하기 위한 수단이 ABI 인 것이다.
하지만, 말한대로 너무 많은 컨트랙트가 무질서하게 올라가다보면 나에게 필요한 함수가 거기에 존재하기는 하는지 모를 수도 있을 것이다. 이것을 방지하기 위해서
그래서 우리는 ERC 20 코인을 접했을 때 totalSupply, balaceOf, allowance, transfer, approve, transferFrom 과 같은 함수들이 존재한다는 것을 알고 ABI 를 통해 이들을 호출해 사용할 수 있는 것이다.
컨트랙트는 블록체인의 특정 주소에 바이트코드로 저장되어 있다. ABI 는 이 컨트랙트와 low level 에서 통신 할 수 있게 하는 통신 규약( 흡사 API ) 과도 같은 역할을 한다.
감사합니다