Block chain

ABI

Bittersweet- 2022. 8. 23. 10:33
728x90

ABI(Application Binary Interface)

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를 사용하는 이유??

ABI는 보통 두 프로그램 모듈의 인터페이스 역할을 하고 그 중 하나는 기계어 레벨에 있는 경우가 많다. 인터페이스는 데이터를 기계 코드로 인코딩/디코딩하기 위한 방법이다.

이더리움에서 기본적으로 EVM에 솔리디티 컨트랙트 호출을 할 때 인코딩을 하거나, 트랜잭션들로부터 데이터를  읽는 방법이다.

 

* EVM - 이더리움 블록체인 네트워크의 노드를이 공유하는 하나의 가상 머신이라고 볼 수 있다. 

* 솔리디티 컨트랙트(스마트 컨트랙트) - 특정 계약의 내용을 구현한 컴퓨터 코드(code)로서 계약의 조건을 만족시키게 되면 모든 이더리움 노드에서 무조건적으로 실행되는 코드. 솔리디티의 관점에서 컨트랙트는 무수한 코드들(함수)과 데이터가 이더리움 블록체인의 특정 주소에 존재하는 것

* 트랜잭션 - 블록체인 참여자간의 전송, 수신을 통해 저장되는 거래기록. 디지털 자산을 내 지갑에서 다른 지갑으로 이동 시키는 것.

 

ABI는 컨트랙트 내 함수를 호출하거나 컨트랙트로부터 데이터를 얻는 방법이다.

이더리움 스마트 컨트랙트는 이더리움 블록체인에 배포된 바이트 코드이다. 컨트랙트 내에 여러 개의 함수가 있을 수 있을 것이다. ABI는 컨트랙트 내 어떤 함수를 호출할 지 지정하는 데 필요하며, 우리가 생각했던 대로 함수가 데이터를 리턴한다는 것을 보장하기 위해 반드시 필요하다.

 

이더리움 생태계의 수많은 트랜잭션 중 나에게 필요한 컨트랙트를 호출하기 위해 필요한 수단이 ABI라고 할 수 있다. 하지만 말그대로 너무 많은 컨트랙터가 무질서하게 올라가다 보면 나에게  필요한 함수가 있는지 없는지도 모를 수 있을 것이다. 

 

이런 상황을 방지하기 위해 몇가지 함수 Interface 규격을 정해서 이에 만족하는 함수를 모아 놓은 것이 ERC20이다.

 

그래서 우리는 ERC 20 코인을 접했을 때 totalSupply, balanceOf, allowence, transfer, approve, transferFrom 과 같은 함수들이 존재한다는 것을 알고 ABI를 통해 이들을 호출해 사용할 수 있다.

 

컨트랙트는 블록체인의 특정 주소에 바이트 코드로 저장되어 있다. ABI는 이 컨트랙트와 low-level에서 통신할 수 있게 하는 통신 규약(흡사 API)과도 같은 역할을 한다.