[Mastering Ethereum] 7. Smart Contracts & Solidity -(1)스마트 컨트랙트와 솔리디티
이 글은 Mastering Ethereum, by Andreas M. Antonopoulos, Gavin Wood를 참고 및 재구성하여 작성하였습니다.
Overview
‘스마트 컨트랙트’라는 용어는 블록체인이 등장하기 전부터 사용되긴 했지만, 이더리움의 등장으로 블록체인에 스마트 컨트랙트를 도입함으로써 그 개념이 재조명되었습니다. 특정 조건이 만족될 때, 해당 계약이 이행되게 하는 if-then 구조의 스크립트로서, 스마트 컨트랙트는 계약의 당사자가 서로를 알지 못하거나 신뢰할 수 없더라도 특정 조건이 충족되지 않으면 계약이 실행되지 않기 때문에 중개인 없이도 계약을 이행할 수 있다 장점이 있습니다. 이번 장에서는 스마트 컨트랙트의 개념 및 생애주기와 스마트 컨트랙트를 작성하는 언어인 솔리디티의 다양한 문법에 대해 알아보고자 합니다.
정의
책에서는 스마트 컨트랙트를 ‘이더리움 네트워크 프로토콜의 일부인 EVM 상에서 결정론적(deterministic)으로 작동하는 불변(immutable)의 컴퓨터 프로그램’ 이라고 정의합니다. 여기서 핵심은 결정론적 & 불변성입니다. 스마트 컨트랙트는 일단 배포되면 변경될 수 없고, 실행 결과는 그것을 실행하는 사람에 따라 달라지면 안된다는 특징을 갖습니다.
life cycle
- 스마트 컨트랙트의 생성
스마트 컨트랙트가 생성되는 과정은 아래 그림과 같습니다. 솔리디티로 컨트랙트 코드를 작성하고, 작성된 코드를 bytecode로 컴파일한 뒤, 컨트랙트를 생성하는 트랜잭션에 의해 이더리움 플랫폼 상에 배포하는 방식입니다. Bytecode와 ABI에 대한 내용은 아래 부분에 조금 더 자세히 추가하였습니다.
- 스마트 컨트랙트의 실행
컨트랙트를 생성하는 트랜잭션은 0x0으로 시작하는 주소로 전송되고, 각 컨트랙트는 이더리움 주소로 식별됩니다. 스마트 컨트랙트는 트랜잭션으로 ‘호출’된 경우에만 실행되며, 병렬적으로 실행되지 않는 single-threaded의 특징이 있습니다.
한편, 이더리움에서 트랜잭션은 원자성(atomic), 즉 all or not의 특징이 있습니다. 모든 실행이 성공적으로 종료된 경우에만 모든 변경사항이 블록체인 상에 기록이 되고, 오류로 인해 특정 부분의 실행이 실패하면 트랜잭션이 아예 실행되지 않았던 처음 상태로 롤백됩니다. 여기서 실행을 위해 가스로 소비된 이더는 원 계정에서 차감되지만, 컨트랙트나 계정의 상태에는 영향을 미치지 않습니다. - 스마트 컨트랙트의 삭제
불변성을 갖는 스마트 컨트랙트 코드는 변경할 수는 없지만, 삭제는 가능합니다. SELFDESTRUCT라는 EVM 명령어를 통해 해당 컨트랙트가 빈 계정으로 남겨지게 처리할 수 있습니다. 이 연산은 음의 가스(가스 환불)를 제공하여 네트워크 자원을 효율적으로 사용할 수 있게끔 하는 동기부여 역할을 합니다. 컨트랙트 코드에 이 연산코드가 접근할 수 없는 경우에는 삭제할 수 없습니다.
이더리움 고급언어, 솔리디티
솔리디티는 스마트 컨트랙트를 작성하는데 가장 널리 사용되는 명령형 프로그래밍 언어로, 이 책의 저자인 Gavin Wood에 의해 개발되었습니다. 솔리디티는 작성된 프로그램을 EVM bytecode로 변환하기 위한 솔리디티 컴파일러(solc)를 지원합니다. solc로 실행된 결과는 이더리움 블록체인 상에서 실행될 수 있는 16진수 바이너리입니다. 솔리디티 외에도 스마트 컨트랙트를 작성하기 위한 바이퍼(Vyper), 밤부(Bamboo) 등의 언어가 존재하기는 하지만, 책에서는 솔리디티를 사용하여 대부분의 스마트 컨트랙트를 구현하였기 때문에 여기서도 솔리디티에 대한 부분만 다루고자 합니다.
Bytecode, ABI
솔리디티 코드를 컴파일하여 생성된 바이트코드는 트랜잭션에 담기고, 마이너가 채굴에 성공하면 해당 트랜잭션은 블록체인에 합류됩니다. 컴파일된 바이트코드는 ABI와 함께 EVM으로 전달되는데, ABI(application binary interface)는 컴퓨터와 사용자 간의 인터페이스입니다. 그렇다면 ABI는 왜 필요한 것일까요?
ABI를 통해 사용자는 컨트랙트 내의 함수를 쉽게 호출할 수 있습니다. 이더리움 블록체인 상에 존재하는 수많은 트랜잭션 중에서 사용자에게 필요한 컨트랙트를 호출하기 위한 수단이 ABI 입니다. 스마트 컨트랙트의 ABI는 컨트랙트에 포함된 함수들과 매개변수들을 json 배열 형태로 저장하며, solc — abi *.sol 명령어를 통해 컨트랙트의 ABI를 얻을 수 있습니다. 아래는 책에 수록된 Faucet.sol 파일의 ABI를 나타낸 것입니다.
마무리
이 글에서는 투명성 및 중개인 비용 절감이라는 기술적 장점을 가지고 있는 스마트 컨트랙트가 블록체인 생태계에 어떻게 적용되는지에 대해 알아보았습니다. 후속 글인 7장의 (2)편에서는 솔리디티를 사용하여 간단한 스마트 컨트랙트를 구현하는 방법에 대해 다루고자 합니다.