스마트 컨트랙트 소개
스마트 컨트랙트란 무엇인가요?
"스마트 컨트랙트"는 단순히 이더리움 블록체인에서 실행되는 프로그램입니다. 이는 이더리움 블록체인의 특정 주소에 존재하는 코드(함수)와 데이터(상태)의 모음입니다.
스마트 컨트랙트는 이더리움 계정의 한 종류입니다. 즉, 잔액을 보유하며 트랜잭션의 대상이 될 수 있습니다. 하지만 사용자가 제어하는 것이 아니라 네트워크에 배포되어 프로그래밍된 대로 실행됩니다. 사용자 계정은 스마트 컨트랙트에 정의된 함수를 실행하는 트랜잭션을 제출하여 스마트 컨트랙트와 상호작용할 수 있습니다. 스마트 컨트랙트는 일반적인 계약처럼 규칙을 정의하고 코드를 통해 이를 자동으로 강제할 수 있습니다. 기본적으로 스마트 컨트랙트는 삭제할 수 없으며, 스마트 컨트랙트와의 상호작용은 되돌릴 수 없습니다.
전제 조건
이제 막 시작했거나 덜 기술적인 소개를 찾고 있다면, 스마트 컨트랙트 소개를 추천합니다.
스마트 컨트랙트의 세계로 뛰어들기 전에 계정, 트랜잭션 및 이더리움 가상 머신에 대해 읽어보시기 바랍니다.
디지털 자판기
닉 사보(Nick Szabo) (opens in a new tab)가 설명한 것처럼, 스마트 컨트랙트를 가장 잘 비유할 수 있는 것은 자판기일 것입니다. 올바른 입력이 주어지면 특정 출력이 보장됩니다.
자판기에서 간식을 뽑으려면 다음과 같이 합니다.
돈 + 간식 선택 = 간식 나옴
이러한 로직이 자판기에 프로그래밍되어 있습니다.
스마트 컨트랙트도 자판기처럼 로직이 프로그래밍되어 있습니다. 이 자판기가 Solidity로 작성된 스마트 컨트랙트라면 어떤 모습일지 보여주는 간단한 예시는 다음과 같습니다.
pragma solidity 0.8.7;
contract VendingMachine {
// 컨트랙트의 상태 변수를 선언합니다
address public owner;
mapping (address => uint) public cupcakeBalances;
// 'VendingMachine' 컨트랙트가 배포될 때:
// 1. 배포 주소를 컨트랙트의 소유자로 설정합니다
// 2. 배포된 스마트 컨트랙트의 컵케이크 잔액을 100으로 설정합니다
constructor() {
owner = msg.sender;
cupcakeBalances[address(this)] = 100;
}
// 소유자가 스마트 컨트랙트의 컵케이크 잔액을 증가시킬 수 있도록 허용합니다
function refill(uint amount) public {
require(msg.sender == owner, "Only the owner can refill.");
cupcakeBalances[address(this)] += amount;
}
// 누구나 컵케이크를 구매할 수 있도록 허용합니다
function purchase(uint amount) public payable {
require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");
require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
cupcakeBalances[address(this)] -= amount;
cupcakeBalances[msg.sender] += amount;
}
}
자판기가 판매 직원의 필요성을 없애주는 것처럼, 스마트 컨트랙트는 많은 산업에서 중개자를 대체할 수 있습니다.
무허가성
누구나 스마트 컨트랙트를 작성하여 네트워크에 배포할 수 있습니다. 스마트 컨트랙트 언어로 코딩하는 방법을 배우고, 컨트랙트를 배포할 수 있는 충분한 ETH만 있으면 됩니다. 스마트 컨트랙트를 배포하는 것은 기술적으로 트랜잭션이므로, 단순한 ETH 전송에 가스를 지불하는 것과 같은 방식으로 가스를 지불해야 합니다. 하지만 컨트랙트 배포에 드는 가스 비용은 훨씬 더 높습니다.
이더리움에는 스마트 컨트랙트를 작성하기 위한 개발자 친화적인 언어들이 있습니다.
- Solidity
- Vyper
하지만 이더리움 가상 머신이 컨트랙트를 해석하고 저장할 수 있도록 배포 전에 반드시 컴파일되어야 합니다. 컴파일에 대해 더 알아보기
조합성
스마트 컨트랙트는 이더리움 상에 공개되어 있으며 오픈 API로 생각할 수 있습니다. 즉, 자신의 스마트 컨트랙트에서 다른 스마트 컨트랙트를 호출하여 가능한 기능을 크게 확장할 수 있습니다. 심지어 컨트랙트가 다른 컨트랙트를 배포할 수도 있습니다.
스마트 컨트랙트 조합성에 대해 자세히 알아보세요.
한계
스마트 컨트랙트 단독으로는 오프체인 소스에서 데이터를 가져올 수 없기 때문에 "현실 세계"의 이벤트에 대한 정보를 얻을 수 없습니다. 즉, 현실 세계의 이벤트에 반응할 수 없습니다. 이는 의도적으로 설계된 것입니다. 외부 정보에 의존하면 보안과 탈중앙화에 중요한 합의를 위태롭게 할 수 있기 때문입니다.
하지만 블록체인 애플리케이션이 오프체인 데이터를 사용할 수 있는 것은 중요합니다. 이에 대한 해결책은 오프체인 데이터를 수집하여 스마트 컨트랙트에서 사용할 수 있게 해주는 도구인 오라클입니다.
스마트 컨트랙트의 또 다른 한계는 최대 컨트랙트 크기입니다. 스마트 컨트랙트의 최대 크기는 24KB이며, 이를 초과하면 가스가 고갈됩니다. 이는 다이아몬드 패턴(The Diamond Pattern) (opens in a new tab)을 사용하여 우회할 수 있습니다.
다중서명 컨트랙트
다중서명(Multisig) 컨트랙트는 트랜잭션을 실행하기 위해 여러 개의 유효한 서명이 필요한 스마트 컨트랙트 계정입니다. 이는 상당한 양의 이더나 다른 토큰을 보유한 컨트랙트의 단일 장애점(single point of failure)을 피하는 데 매우 유용합니다. 또한 다중서명은 컨트랙트 실행 및 키 관리 책임을 여러 당사자에게 분산시키고, 단일 개인 키의 분실이 돌이킬 수 없는 자금 손실로 이어지는 것을 방지합니다. 이러한 이유로 다중서명 컨트랙트는 간단한 DAO 거버넌스에 사용될 수 있습니다. 다중서명은 실행을 위해 허용 가능한 M개의 서명 중 N개의 서명(N ≤ M, M > 1)을 요구합니다. N = 3, M = 5 및 N = 4, M = 7이 일반적으로 사용됩니다. 4/7 다중서명은 7개의 가능한 유효 서명 중 4개가 필요합니다. 즉, 3개의 서명을 분실하더라도 자금을 회수할 수 있습니다. 이 경우, 컨트랙트가 실행되려면 키 보유자의 과반수가 동의하고 서명해야 함을 의미하기도 합니다.
스마트 컨트랙트 리소스
오픈제플린 컨트랙트 - 안전한 스마트 컨트랙트 개발을 위한 라이브러리입니다.
- openzeppelin.com/contracts/ (opens in a new tab)
- GitHub (opens in a new tab)
- 커뮤니티 포럼 (opens in a new tab)
더 읽어보기
- 코인베이스: 스마트 컨트랙트란 무엇인가요? (opens in a new tab)
- 체인링크: 스마트 컨트랙트란 무엇인가요? (opens in a new tab)
- 동영상: 쉽게 설명하는 스마트 컨트랙트 (opens in a new tab)
- Cyfrin Updraft: Web3 학습 및 감사 플랫폼 (opens in a new tab)
튜토리얼: 이더리움의 스마트 컨트랙트 서명(EIP-1271)
- EIP-1271: 스마트 컨트랙트 서명하기 및 검증 – EIP-1271이 스마트 컨트랙트에서 서명을 검증할 수 있게 하는 방법과 Safe 구현에 대한 설명입니다.
페이지 최근 업데이트: 2026년 2월 25일