읽는 데 7분
동영상 가이드를 선호하시나요? 라덱과 함께 11분도 채 걸리지 않는 시간 동안 이더리움에서 스마트 계약이 어떻게 작동하는지 배워보세요.
개요
스마트 계약은 이더리움 블록체인의 핵심 요소이며, 이더리움 개발에서 매우 중요한 부분을 차지합니다. 이 가이드에서는 이더리움 블록체인의 스마트 계약 작동 방식에 대한 개요를 살펴보겠습니다. 여기에는 이더리움 IDE 설정 방법과 스마트 계약 작성 및 배포 과정이 포함됩니다.
스마트 계약이란 무엇인가요?
스마트 계약은 현실 세계의 계약과 똑같습니다. 유일한 차이점은 디지털이라는 점입니다. 사실, 스마트 계약은 블록체인에 저장된 컴퓨터 프로그램입니다. 스마트 계약은 관련 당사자들이 미리 설정한 조건이 충족될 때 자동으로 실행되는 코드 조각입니다. 예를 들어, 누군가가 법정화폐를 입금하면 토큰을 발행하는 스마트 계약이 있습니다.
스마트 계약을 통해 익명의 당사자들 간에 중앙 기관의 개입 없이도 안전하고 신뢰할 수 있는 거래가 이루어질 수 있습니다. 이더리움의 스마트 계약은 주로 솔리디티(Solidity) 와 바이퍼(Vyper)로 작성됩니다. 솔리디티는 C++, 자바스크립트, 파이썬의 영향을 받은 고수준 객체 지향 언어이며, 이더리움 가상 머신(EVM)과 통합되도록 설계되었습니다. 바이퍼는 파이썬에서 영감을 받은 실험적인 계약 기반 언어입니다.
가상 머신은 실행 중인 코드와 실행 머신 사이에 추상화 계층을 형성합니다. 특정 블록에서는 단 하나의 블록체인 상태만 존재할 수 있습니다. 이더리움 블록체인은 EVM(이더리움 가상 머신)을 통해 상태를 유지합니다. EVM은 블록마다 새로운 유효한 상태를 산출하기 위한 규칙을 정의함으로써 이를 수행합니다.
이를 수학적 모델로 표현하기 위해, Y를 상태 전이 함수로 가정할 수 있다. 이 함수는 Y(S, T) = S'로 표기할 수 있으며, 여기서:
S는 이전의 유효한 상태이며,
T는 다음 블록에 추가될 새로운 유효한 전이들의 집합이며,
'S'는 새로운 유효 상태입니다.
이 함수는 기존 유효 상태와 새로운 유효 트랜잭션 집합을 입력으로 받아, 새로운 유효 상태를 출력으로 생성합니다. EVM과 이더리움 상태의 작동 방식에 대한 자세한 내용은 EVM에 관한 이 포괄적인 블로그 게시물에서 확인하실 수 있습니다.
지금까지 EVM의 기술적 측면을 살펴보았으니, 이제 실제로 어떻게 작동하는지 알아보겠습니다. EVM은 스마트 계약의 바이트코드를 실행하는 샌드박스 환경을 생성합니다. 즉, 기계 코드는 호스트 머신의 네트워크, 파일 시스템 또는 프로세스와 완전히 격리되어 있습니다. EVM에서 실행되는 모든 명령어에 대해 시스템은 실행 비용을 추적합니다. 명령어 실행과 관련된 이 비용은 가스 단위로 측정됩니다. 이 명령어를 실행하려는 사용자는 가스 수수료로 지불할 이더를 미리 확보해야 합니다. 가스와 가스 수수료에 대한 자세한 내용은 여기에서 확인하세요.
EVM 역시 튜링 완전성을 갖추고 있습니다. 이는 비트코인처럼 실행된 금융 거래 건수당 요금을 부과하는 방식이 아니라, 실행된 소프트웨어 명령어 건수당 요금을 부과하는 시스템을 구현함으로써 가능해집니다. 이더리움 네트워크가 튜링 완전성을 갖추고 있다는 것은, 이를 전 세계적인 피어투피어 분산 컴퓨터로 간주할 수 있음을 의미합니다.
스마트 계약은 어떻게 작동하나요?
누군가 집을 팔고 싶을 때면 중개인을 찾게 마련입니다. 중개인은 거래 처리와 매수자·매도자 간의 중개 역할을 대가로 총 금액의 일정 비율을 수수료로 받습니다. 이제 중개인을 배제하고 대신 스마트 계약을 도입한다고 가정해 봅시다.
이 시스템은 해당 부동산에 대해 특정 금액보다 높은 가격이 제시될 때마다, 매물을 구매자에게 매각하고 소유권을 이전하며, 판매자에게 대금을 이체하도록 프로그래밍되어 있습니다. 이를 통해 거래 과정에서 중개인이 배제됩니다. 거래가 양 당사자 간에 직접 이루어지기 때문에 전체 과정이 더 저렴하고 안전합니다.
스마트 계약은 블록체인에 저장되므로, 블록체인의 특정 속성을 계승합니다. 그중에서도 특히 주목할 만한 두 가지 속성은 ‘불변성’과 ‘전반적 분산성’입니다. 불변성이란 스마트 계약이 배포된 후에는 그 누구도 이를 조작할 수 없음을 의미합니다. 그리고 전반적 분산성이란 블록체인 네트워크에 속한 모든 참여자가 계약의 결과를 검증한다는 뜻입니다. 누군가 계약을 변경하려고 시도하면, 네트워크상의 다른 참여자들이 이를 무효로 판정하게 되므로, 계약을 조작하는 것은 사실상 불가능합니다.
스마트 계약은 어떻게 배포되나요?
스마트 계약은 배포될 때 먼저 컴파일되어 바이트코드로 변환됩니다. 이 바이트코드는 이후 블록체인에 저장되며, 이에 주소가 할당됩니다. 계약 주소는 계약을 생성한 사람의 주소(발신자)와 생성자가 전송한 트랜잭션 수(논스)를 기반으로 결정됩니다. 발신자 주소와 논스는 RLP 인코딩된 후 keccak-256 알고리즘을 사용하여 해시 처리됩니다.
대부분 솔리디티(Solidity)로 작성되는 스마트 계약은 종종 이더리움 리믹스(Ethereum Remix) IDE를 사용하여 배포 및 테스트됩니다. 리믹스 IDE는 이더리움 스마트 계약을 위한 오픈소스 브라우저 기반 통합 개발 환경(IDE)입니다.
Remix IDE를 사용하여 계약을 배포해 보겠습니다. Sepolia 테스트넷에 계약을 배포할 예정입니다. 이를 위해서는 테스트용 ETH가 필요합니다. 시작하려면 ETH 지갑을 생성하기 위한 MetaMask 브라우저 확장 프로그램과 테스트용 ETH가 필요합니다.
Quicknode Faucet에 접속하면 테스트용 ETH를 받을 수 있습니다. 지갑을 연결하고 MetaMask 지갑에서 Sepolia 테스트 네트워크를 선택하세요. “지갑 주소” 필드에 지갑 주소가 자동으로 입력될 것입니다. 다음으로 “계속”을 클릭하면, 다음 단계에서 트위터에 공유할 경우 테스트용 ETH를 두 배로 받을 수 있습니다. 몇 분 이내에 지갑에 테스트용 ETH가 입금될 것입니다(네트워크가 혼잡할 경우 더 오래 걸릴 수 있습니다).

이더리움 리믹스(Ethereum Remix) IDE로 이동하여 새로운 솔리디티(Solidity) 파일을 생성하세요. 예를 들어, TestContract.sol.
다음 코드를 새로 만든 솔리디티 스크립트에 붙여넣으세요:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
contract TestContract {
uint256 private count = 0;
function increment() public {
count += 1;
}
function getCount() public view returns (uint256) {
return count;
}
}
위 코드에 대한 설명:
1행: SPDX 라이선스 유형을 지정합니다. 이는 Solidity ^0.6.8 이후 추가된 내용입니다.
스마트 계약의 소스 코드가 공개될 때마다, 이러한 라이선스는 저작권 문제를 해결하거나 예방하는 데 도움이 될 수 있습니다. 라이선스 유형을 명시하고 싶지 않다면, ‘UNLICENSE’라는 특수 라이선스를 사용하거나 해당 주석 전체를 생략할 수 있습니다(이 경우 오류는 발생하지 않으며, 단지 경고만 표시됩니다).
2행: Solidity 버전 선언.
4행: TestContract라는 이름의 계약을 시작합니다.
6행: unsigned 정수형 사적 변수 count를 선언하고, 그 값을 0으로 할당합니다.
8~10행: public 유형의 increment() 함수를 선언합니다. 이는 함수 외부 및 다른 계약에서도 이 함수에 접근할 수 있음을 의미하며, count의 값을 1 증가시킵니다.
12~14행: getCount() 함수를 public 타입으로 선언하고, 불변 값(view)으로 지정합니다. 이는 이 함수가 블록체인 상태를 읽기만 할 수 있고, 아무것도 쓸 수 없음을 의미합니다. returns 키워드를 사용하여 함수가 값(여기서는 부호 없는 정수)을 반환하도록 지정합니다. count의 값을 함수에서 반환합니다.
먼저 왼쪽 메뉴에서 Solidity 아이콘을 클릭한 다음, “Compile TestContract.sol”을 클릭하여 스마트 계약을 컴파일하세요. Ctrl+S / Cmd+S 단축키를 사용하여 계약을 컴파일할 수도 있습니다.
왼쪽 사이드바에 표시된 Solidity 컴파일러 버전이 계약서에 사용된 버전과 동일한지 확인하세요. 버전이 일치하지 않으면 오류가 발생합니다.

계약서 컴파일이 성공하면 왼쪽 메뉴의 ‘컴파일러’ 탭에 녹색 체크 표시가 나타납니다. 계약서를 배포하기 전에 MetaMask에서 Sepolia 테스트넷을 선택했는지 반드시 확인하세요.

이제 계약을 배포하려면 왼쪽 메뉴에서 이더리움 아이콘을 클릭하고, “Environment” 아래 드롭다운 메뉴에서 “Injected Provider - MetaMask”를 선택한 다음 “Deploy”를 클릭하세요. MetaMask에서 거래를 승인하세요.

이제 계약이 배포되었으므로, “배포된 계약” 섹션에서 해당 계약을 확인할 수 있습니다.

스마트 계약은 Hardhat, Foundry 또는 기타 이더리움 라이브러리를 사용하여 배포할 수도 있습니다.
스마트 계약을 사용하는 방법은 무엇인가요?
Remix IDE 내에서 직접 스마트 계약과 상호작용할 수 있습니다. 이를 위해 “배포된 계약(Deployed Contracts)” 섹션에서 해당 계약을 펼친 다음, getCount. count의 초기값이 0인 것을 확인할 수 있습니다.
자, 이제 다음을 클릭하세요. 증가 카운트의 값을 1 증가시키기 위해서입니다. 이는 쓰기 작업이므로(블록체인에서 단순히 읽기만 하는 것이 아니라 데이터를 기록하게 됩니다), 이에 대한 가스 수수료를 지불해야 합니다. MetaMask에서 거래를 확인하세요.
거래가 완료되면 다음을 클릭하세요. getCount 다시 실행하면 count의 값이 1 증가한 것을 확인할 수 있습니다. 우리는 개수 체인에 기록한 다음, 업데이트된 값을 조회하는 방식입니다.
또한 다양한 이더리움 라이브러리를 사용하여 스마트 계약과 상호작용할 수 있습니다. 다음은 Ruby를 사용한 예시입니다. 이를 위해서는 ABI(애플리케이션 바이너리 인터페이스)와 스마트 계약 주소가 필요합니다. ABI는 계약에서 사용되는 함수와 유형을 정의합니다. ABI에 대한 자세한 내용은 당사의 종합 가이드에서 확인하세요.
결론
끝까지 잘 해내신 것을 축하합니다! 이제 EVM(이더리움 가상 머신)이 어떻게 작동하는지 알게 되셨습니다. 스마트 계약 테스트 및 개발을 위해 이더리움 리믹스(Remix) IDE를 설정하는 방법도 익히셨습니다. 스마트 계약을 작성하고, 테스트용 ETH를 얻는 방법을 배우며, 테스트넷에 계약을 배포해 보셨습니다. 또한 리믹스 IDE를 통해 스마트 계약과 상호 작용하는 방법과 블록체인에 데이터를 기록하는 방법도 확인하셨습니다.
Quicknode 가이드에서 Solidity와 Vyper에 대해 자세히 알아보세요.
이더리움에 관한 더 많은 기사와 가이드를 받아보시려면 뉴스레터를 구독해 주세요. 의견이 있으시면 트위터를 통해 언제든지 연락해 주세요. 또한, 여러분이 만나볼 수 있는 가장 멋진 개발자들이 모인 저희 디스코드 커뮤니티 서버에서 언제든지 저희와 대화를 나눌 수 있습니다 :)
