-
이더리움의 애플리케이션 바이너리 인터페이스(ABI, Application Binary Interface)블록체인 2024. 9. 25. 17:39728x90반응형
이더리움의 애플리케이션 바이너리 인터페이스(ABI, Application Binary Interface)는 스마트 컨트랙트와 외부 애플리케이션 간의 소통 방식을 정의한 규약입니다. 이더리움에서 스마트 컨트랙트는 블록체인에 저장된 코드로, 이를 실행하려면 외부에서 정확한 방법으로 데이터를 보내야 합니다. ABI는 이러한 데이터의 형식과 함수를 호출하는 방법을 정해줍니다.
ABI의 역할:
- 함수 호출 규칙: 스마트 컨트랙트는 여러 함수로 구성되어 있을 수 있는데, ABI는 어떤 함수를 호출할지, 그리고 그 함수에 어떤 데이터를 보내야 할지 정해줍니다.
- 데이터 인코딩: ABI는 스마트 컨트랙트에 전달할 데이터 형식을 정의하고, 컨트랙트가 반환하는 데이터를 이해할 수 있도록 변환하는 역할을 합니다.
실생활 예시:
ABI를 실생활에서 이해하기 위해, 이를 자판기와 비교해 볼 수 있습니다. 자판기는 다양한 음료를 제공하는데, 각 버튼은 특정 음료를 선택하는 기능을 합니다. 이더리움 스마트 컨트랙트의 ABI는 자판기의 버튼과 비슷합니다. 각 버튼이 음료를 선택하는 방법을 정의하고, 그에 맞는 돈을 넣으면 음료가 나오는 것처럼, ABI는 스마트 컨트랙트의 특정 기능을 호출하고 필요한 데이터를 전달하는 방법을 알려줍니다.
자판기와 스마트 컨트랙트 비교:
- 자판기: 여러 종류의 음료가 있고, 각 음료에 맞는 버튼이 있다.
- 예: '콜라' 버튼을 누르면 콜라가 나오고, '사이다' 버튼을 누르면 사이다가 나온다.
- 스마트 컨트랙트: 여러 함수가 있고, 각 함수는 특정 기능을 한다.
- 예: '송금' 함수가 있으면, 송금 기능을 실행하고, '잔액 조회' 함수가 있으면 잔액을 확인한다.
예시로 살펴보는 ABI:
스마트 컨트랙트의 함수가 아래와 같다고 가정해봅시다.
contract VendingMachine { function buyCola(uint256 amount) public payable { // 콜라 구매 로직 } function checkStock() public view returns (uint256) { // 재고 확인 로직 } }
이 스마트 컨트랙트를 호출하기 위해 외부 애플리케이션은 ABI를 통해 어떤 함수가 있는지, 어떤 인자를 보내야 하는지를 알아야 합니다.
1. 함수 호출 (콜라 구매):
ABI는 buyCola 함수가 uint256 형태의 amount라는 인자를 받는다는 정보를 제공하며, 따라서 외부 애플리케이션은 아래와 같은 데이터를 전송해야 합니다.
- 함수: buyCola
- 인자: 3 (콜라 3개 구매)
2. 데이터 반환 (재고 확인):
ABI는 checkStock 함수가 uint256 타입의 값을 반환한다고 정의합니다. 즉, 이 함수를 호출하면 콜라 재고량을 반환받을 수 있습니다.
이렇게 ABI는 스마트 컨트랙트와 외부 애플리케이션 간에 일종의 ‘약속’ 역할을 하여, 정확한 형식의 데이터를 주고받는 것을 보장합니다.
ABI의 역할 요약:
- JSON 포맷으로 정의: ABI는 스마트 컨트랙트의 함수 이름, 파라미터 타입, 반환 타입, 접근 제어(public, view 등) 등을 JSON 형식으로 표현합니다.
- 외부 애플리케이션과의 통신: 외부 애플리케이션은 이 ABI를 파싱(parse)하여 스마트 컨트랙트의 함수를 호출하거나, 이벤트 로그를 해석하는 데 사용합니다.
- 함수 호출 방법: 외부 애플리케이션은 ABI를 바탕으로, 이더리움 블록체인 상의 특정 컨트랙트 주소에 함수 호출 요청을 보내는 방식으로 스마트 컨트랙트와 상호작용합니다.
구체적인 흐름:
- ABI 준비: 스마트 컨트랙트가 컴파일되면 해당 컨트랙트의 ABI가 생성됩니다. 이 ABI는 JSON 파일로 제공되며, 컨트랙트에서 사용 가능한 모든 함수와 변수의 정보를 담고 있습니다.
[ { "constant": false, "inputs": [ { "name": "amount", "type": "uint256" } ], "name": "buyCola", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": true, "inputs": [], "name": "checkStock", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" } ]
- 외부 애플리케이션에서 ABI 파싱: 외부 애플리케이션(예: 웹, 모바일 앱, 또는 백엔드)은 이 ABI 파일을 파싱하여 스마트 컨트랙트의 구조와 함수 시그니처를 인식합니다. 예를 들어, Web3.js나 ethers.js 같은 라이브러리를 이용해 ABI를 읽고 함수를 호출할 수 있습니다.
- 함수 호출: 애플리케이션은 ABI를 기반으로 특정 함수를 호출할 수 있습니다. 예를 들어 buyCola(3)라는 함수를 호출하면, 해당 함수에 대한 데이터는 ABI를 통해 적절히 인코딩되어 블록체인 네트워크로 전송됩니다.
const contract = new web3.eth.Contract(ABI, contractAddress); contract.methods.buyCola(3).send({ from: userAddress, value: web3.utils.toWei('1', 'ether') });
- 결과 반환: 함수 실행이 완료되면 컨트랙트는 결과를 반환하거나 트랜잭션 로그를 남기며, 외부 애플리케이션은 이 결과를 ABI를 통해 다시 해석합니다.
요약:
- ABI는 스마트 컨트랙트의 함수 및 데이터 구조를 JSON으로 표현한 것입니다.
- 외부 애플리케이션은 ABI를 파싱하여 스마트 컨트랙트와 상호작용할 수 있으며, ABI를 통해 함수를 호출하거나 데이터를 해석할 수 있습니다.
따라서, ABI는 스마트 컨트랙트의 "사용 설명서" 역할을 하며, 이를 통해 외부에서 스마트 컨트랙트의 기능을 안전하고 정확하게 사용할 수 있게 됩니다.
728x90반응형'블록체인' 카테고리의 다른 글
이더리움 on chain, off chain 이란 무엇인가? (0) 2024.09.21 **오라클 네트워크(Oracle Network)**란 무엇인가? (6) 2024.09.21 EVM(Ethereum virtual machine)이란 (0) 2024.09.19 비트코인(블록체인)은 왜 개인키로 암호화하고 공개키로 복호화하는것인가? (1) 2024.09.19 SPV(Stratum Payment Verification) 노드 (3) 2024.09.18