이전글
솔리디티
이번 글에서는 이더리움에서 사용하는 스마트 컨트랙트 용 고급 언어인 솔리디티에 대해 알아보겠습니다.
I. 솔리디티
지금까지 이더리움에서 스마트 컨트랙트를 실행하기 위해서는 EVM 코드를 포함한 컨트랙트 계정을 생성하고, 해당 계정을 호출해야 한다는 사실에 대해 알아봤습니다. 또한 스마트 컨트랙트를 실행하기 위한 EVM 코드는 다음처럼 작성해야 한다는 사실 또한 알아봤습니다.
PUSH1 0x03 PUSH2 0x0004 PUSH1 0x09 SWAP2 ADD ADD PUSH1 0x20 MSTORE
위와 같은 방식으로 매번 코드를 작성하는 것은 매우 불편합니다. 따라서 이더리움의 EVM 코드를 더욱 쉽게 작성하기 위한 고급 언어인 솔리디티가 등장했습니다.
솔리디티는 C, 자바, 파이썬, 자바스크립트 등을 기반으로 만들어진 스마트 컨트랙트용 언어입니다. 다음은 간단한 솔리디티 코드의 예시입니다.
// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.17 and less than 0.9.0
pragma solidity ^0.8.17;
contract HelloWorld {
string public greet = "Hello World!";
}
솔리디티로 작성된 코드는 솔리디티 컴파일러에 의해 EVM 코드로 변환됩니다. 아래는 위 코드의 EVM 코드입니다. 코드가 길어서 일부 생략하였습니다.
PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 ...... PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER
II. ABI
솔리디티로 작성된 코드가 EVM 코드로 컴파일되는 과정에서는 ABI라고 부르는 파일도 생성됩니다. ABI는 Application Binary Interface의 약자입니다. 코드에 존재하는 함수들의 입력과 출력 등 핵심 정보를 요약하여 담고 있습니다.
예를 들어 API를 호출하는 경우 {name: 'json'} 처럼 json 형식으로 입력 데이터를 보낼 수 있습니다. 이와 유사하게 ABI를 이용하면 스마트 컨트랙트 상의 특정 함수에 데이터를 보내거나 얻는 것이 가능합니다.
ABI는 API와는 다르게 Binary(이진) 데이터를 사용합니다. 따라서 json 형식으로 ABI를 만든 후 이 데이터를 다시 이진 데이터로 변환하는 과정을 거칩니다.
블록체인에 데이터를 보내는 경우 ABI 이용하여 컨트랙트 계정을 호출하는 트랜잭션을 생성합니다. 데이터를 받아오는 경우 ABI를 이용하여 트랜잭션 생성 없이 데이터를 불러옵니다.
III. 전체적인 내용 정리
지금까지 이더리움의 계정, 트랜잭션, EVM, 솔리디티 등 이더리움을 이루는 주요 내용들에 대해 알아봤습니다. 마지막으로 지금까지 다뤘던 내용을 정리해 보겠습니다.
이더리움에 스마트 컨트랙트를 배포하고, 해당 컨트랙트에 특정 데이터를 입력하는 상황을 가정해 보겠습니다.
이더리움에 스마트 컨트랙트를 배포하기 위해서는 EOA가 필요합니다. EOA는 계정 생성과정 없이 개인키와 공개키 쌍만 생성하면 됩니다.
이제 스마트 컨트랙트 코드를 솔리디티로 작성합니다. 그리고 솔리디티 컴파일러를 이용하여 EVM 코드와 ABI를 생성합니다.
그다음 스마트 컨트랙트를 배포합니다. 스마트 컨트랙트 배포를 위해서는 EOA에서 EVM 코드를 담은 컨트랙트 생성 트랜잭션을 생성해야 합니다.
트랜잭션이 블록에 포함되면 컨트랙트 계정이 생성됩니다.
이제 EOA에서 컨트랙트 계정으로 새로운 트랜잭션을 보내 스마트 컨트랙트를 실행합니다. 먼저 스마트 컨트랙트에 보낼 데이터를 ABI를 이용하여 특정한 형식으로 만듭니다.
트랜잭션이 전송된다면 EVM이 연산을 시작합니다.
연산이 끝나면 컨트랙트 계정의 상태가 변경됩니다. 이러한 방식으로 스마트 컨트랙트를 배포하고 실행하여, 컨트랙트 계정의 상태를 변경할 수 있습니다.
지금까지 솔리디티와 스마트 컨트랙트의 전체적인 실행 과정에 대해 알아봤습니다. 감사합니다.
다음글
'이더리움 > 이더리움과 월드 컴퓨터' 카테고리의 다른 글
[이더리움과 월드 컴퓨터] 3-2. NFT (0) | 2023.03.21 |
---|---|
[이더리움과 월드 컴퓨터] 3-1. 토큰 (0) | 2023.03.18 |
[이더리움과 월드 컴퓨터] 2-4. 컨트랙트 계정 (0) | 2023.02.14 |
[이더리움과 월드 컴퓨터] 2-3. EVM (0) | 2023.02.10 |
[이더리움과 월드 컴퓨터] 2-2. EOA (0) | 2023.02.07 |