📜챕터 4

4장 · 스마트 컨트랙트

비트코인이 나온 지 5년이 지났다. 송금은 됐다. 위조도 막았다. 중간에 은행도 없다. 그런데 사람들이 깨달았다. 블록체인이 결국 "장부에 숫자 옮기기"밖에 안 된다는 걸. 에스크로, 대출, 보험, 투표 등 현실의 계약은 거의 다 조건부다. 지금은 전부 사람이 중간에서 판단하고 실행한다. 은행, 변호사, 공증인이 그 역할을 한다.

이 챕터의 질문

조건부 계약을 은행도, 변호사도, 공증인도 없이 자동으로 실행할 수는 없을까?

비탈릭의 질문

2013년, 비탈릭 부테린이라는 19살 청년이 물었어요.

"트랜잭션에 이미 Data 필드가 있잖아. 거기에 숫자 대신 코드를 넣으면 어떨까? 조건이 맞으면 자동으로 실행하게 하면?"

Data 필드는 단순 송금이면 비어 있는 자리예요. 비탈릭은 여기에 실행 가능한 코드를 담자고 제안했어요. 조건을 코드로 정의하고, 충족되면 블록체인이 자동으로 실행한다. 은행도, 변호사도 필요 없다. 이게 스마트 컨트랙트예요.

Signature (v, r, s): 전체 필드에 서명트랜잭션: RLP 인코딩From / To보내는 주소 · 받는 주소Value보낼 금액Nonce내 지갑의 N번째 요청Gas Limit / Max Fee실행 한도 · 수수료 상한Data실행할 코드를 담는 자리RLP: 파싱 통일어떤 노드든 동일하게 해석재사용 불가복사해서 100번 뿌려도 1번만 처리숫자 대신 코드를 넣으면?→ 스마트 컨트랙트의 탄생바꿔치기 차단1바이트만 바뀌어도 검증 실패
챕터 3의 트랜잭션 구조 그대로. 비탈릭은 비어 있던 Data 필드에 코드를 담자고 제안했다

왜 외부 서버로 실행하면 안 되나

외부 서버에서 프로그램을 돌리고 결과만 블록체인에 기록하면 안 될까요?

안 돼요. 그 서버 운영자를 신뢰해야 하기 때문이에요. 운영자가 결과를 조작하면? 서버가 꺼지면? 결국 1장에서 본 단일 신뢰 지점 문제로 다시 돌아가요.

스마트 컨트랙트의 실행 주체는 서버 한 대가 아니라 수천 개의 노드 전체예요. 그래야 세 가지가 동시에 보장돼요.

  • 투명성: 코드가 공개되어 있고, 누구나 실행 결과를 검증할 수 있어요
  • 강제성: 조건이 충족되면 아무도 막을 수 없어요. 배포한 사람도요
  • 가용성: 네트워크가 살아있는 한 24시간 365일 작동해요
외부 서버 방식스마트 컨트랙트 방식운영자결과 조작 가능 ⚠외부 서버 1대여기서만 코드 실행서버가 꺼지면 계약도 멈춤결과만 기록블록체인검증 불가능한 결과 저장스마트 컨트랙트 코드체인 위에 공개, 누구나 열람노드 1같은 코드 실행노드 2같은 코드 실행노드 3같은 코드 실행… 수천 개 노드가 같은 결과를 검증투명성강제성가용성누구나 검증 · 배포자도 못 막음 · 24시간 365일
외부 서버는 결국 운영자를 믿어야 한다. 스마트 컨트랙트는 수천 노드 전체가 실행 주체다

스마트 컨트랙트는 어떻게 만드나

Solidity로 작성 → 컴파일러(solc)가 바이트코드로 변환 → 트랜잭션으로 블록체인에 배포. 한 번 배포되면 수정하거나 삭제할 수 없어요.

// 에스크로 컨트랙트 예시
contract Escrow {
    address public buyer;
    address public seller;
    uint public amount;
 
    function deposit() public payable {
        amount = msg.value;        // 구매자가 금액 예치
    }
 
    function release() public {
        require(msg.sender == buyer);       // 구매자만 실행 가능
        payable(seller).transfer(amount);   // 판매자에게 자동 송금
    }
}

"집 등기가 넘어오면 대금을 지급"이라는 계약이 코드로 표현돼요. 구매자가 release()를 호출하는 순간 조건 확인 후 자동 송금. 판매자가 요청할 필요도, 은행이 처리할 필요도 없어요.

① 배포: 한 번만Solidity 코드contract Escrow { }solc 컴파일바이트코드0x6080604052…배포 트랜잭션(Data 필드에 담아서)블록체인에 컨트랙트 생성주소 0x1f98… · 이후 수정 불가 🔒② 실행: 누구나 호출 가능구매자조건 충족 후 호출release() 호출트랜잭션컨트랙트 자동 실행require(조건) 확인자동 송금판매자대금 수령은행도, 변호사도, 공증인도 없다. 코드가 조건을 확인하고 실행한다
배포는 한 번, 이후 수정 불가. 실행은 조건만 맞으면 누구의 허락도 없이 자동으로

토큰: 스마트 컨트랙트로 만드는 디지털 자산

스마트 컨트랙트가 가능해지면서 누구나 자신만의 디지털 자산을 발행할 수 있게 됐어요. 이게 토큰이에요. 코인과는 달라요.

코인토큰
발행 방식블록체인 메인넷에서 태생적 발행스마트 컨트랙트로 발행
예시ETH, BTCUSDC, UNI, LINK

토큰에는 두 가지 기본 방식이 있어요.

ERC-20: 대체 가능 토큰

1만원 지폐와 또 다른 1만원 지폐는 동일한 가치예요. ERC-20이 이런 방식이에요. 계좌별 잔액을 숫자로 추적해요.

mapping(address => uint256) public balanceOf;
 
function transfer(address to, uint256 amount) public {
    require(balanceOf[msg.sender] >= amount); // 잔액이 충분한지 먼저 확인
    balanceOf[msg.sender] -= amount; // 철수 잔액 감소
    balanceOf[to] += amount;         // 영희 잔액 증가
}

ERC-721: 대체 불가능 토큰 (NFT)

주민등록증은 다른 사람 것으로 대체할 수 없어요. 각각 고유해요. ERC-721이 이런 방식이에요. 토큰 ID별 소유자를 추적해요.

mapping(uint256 => address) public ownerOf;
 
function transferFrom(address from, address to, uint256 tokenId) public {
    require(ownerOf[tokenId] == from); // #42의 소유자가 철수인지 확인
    ownerOf[tokenId] = to;             // #42의 소유자를 영희로 변경
}

핵심 차이 한 줄: ERC-20은 "철수가 얼마나 갖고 있나"를 추적하고, ERC-721은 "이 토큰이 누구 것인가"를 추적해요.

토큰 표준은 계속 확장된다

ERC-20과 ERC-721은 가장 기본이 되는 두 가지예요. 실제로는 용도에 따라 훨씬 다양한 표준이 있어요. 표준이 나뉘는 이유는 하나예요. 용도가 달라지면 필요한 기능이 달라지기 때문이에요.

그런데 새로운 문제가 생겼어요

스마트 컨트랙트가 블록체인 위에서 코드를 실행할 수 있게 됐어요. 그런데 전 세계 수천 개의 노드가 저마다 다른 컴퓨터예요. 어떤 노드는 리눅스, 어떤 노드는 윈도우. 같은 코드를 각자의 OS에서 직접 실행하면 결과가 달라질 수 있어요.

같은 수식도 리눅스에서 돌리면 100.000000001, 윈도우에서 돌리면 99.999999999가 나올 수 있어요. 부동소수점 처리 방식이 OS마다 미묘하게 달라서요. 수천 개의 노드가 서로 다른 결과를 갖고 어떻게 합의하나요?

다음 챕터의 질문

서로 다른 수천 대의 컴퓨터에서, 어디서 실행해도 똑같은 결과를 내려면 어떻게 해야 할까?

5장에서 EVM이 이 문제를 어떻게 해결했는지 알아볼게요.

핵심 요약

개념역할
스마트 컨트랙트조건 충족 시 자동 실행되는 블록체인 위의 코드
Solidity스마트 컨트랙트 작성 언어
배포트랜잭션으로 바이트코드를 블록체인에 올리는 것. 이후 수정 불가
ERC-20대체 가능 토큰. 잔액 추적
ERC-721대체 불가능 토큰(NFT). 소유자 추적
토큰 표준용도에 따라 다양하게 확장됨
📚 참고자료 보기

실제 역사 한 토막

본문 비탈릭의 질문은 이해를 돕기 위해 재구성한 거예요. 실제로는 비탈릭이 비트코인 위에 기능을 얹으려는 프로젝트(컬러드 코인, Mastercoin)에 참여하다 한계를 느꼈고, 2013년 말 아예 범용 프로그래밍이 가능한 새 블록체인을 백서로 제안한 게 이더리움이에요. Data 필드를 가진 트랜잭션 구조 자체가 그 설계의 일부고요.