본문으로 건너뛰기
Change page

스마트 계약의 구조

페이지 최근 업데이트: 2026년 4월 15일

스마트 컨트랙트는 이더리움 주소 체계 상에서 실행되는 프로그램이며, 거래가 발생할 때 실행되는 데이터와 함수로 구성되어 있습니다. 지금부터 그 구성 요소에 대해 전반적으로 살펴보도록 하겠습니다.

필수 구성 요소

스마트 계약에 대해 먼저 읽어보시기 바랍니다. 자바 스크립트나 파이썬과 같은 프로그래밍 언어에 상당히 익숙하다는 것을 전제합니다.

데이터

모든 계약 데이터는 storage 또는 memory 위치에 할당되어야 합니다. 이 중 스토리지 사용은 비용이 더 발생하므로 여러분은 어떤 것을 활용할 지 미리 고려해야 합니다.

저장 공간

영구적인 데이터는 스토리지로 간주되며 상태 변수 형태로 표현됩니다. 이런 값은 블록체인 상에 영구히 남게 되므로, 컨트랙트 컴파일 시에 스토리지 형태로 사용할 변수를 명확히 구분할 필요가 있습니다.

// Solidity 예시
contract SimpleStorage {
    uint storedData; // 상태 변수
    // ...
}
# Vyper 예시
storedData: int128

여러분이 객체 지향적인 언어를 사용해 보았다면 대부분의 변수 타입에는 익숙할 것입니다. 하지만 이더리움 개발이 처음이라면 address는 생소할 수 있습니다.

address 유형은 이더리움 주소를 저장할 수 있으며, 이는 20바이트 또는 160비트와 같습니다. 또한 16진수로 표기되며 0x로 시작합니다.

기타 유형에는 다음이 포함됩니다:

  • 불리언
  • 정수
  • 고정 소수점 숫자
  • 고정 크기 바이트 배열
  • 동적 크기 바이트 배열
  • 유리수 및 정수 리터럴
  • 문자열 리터럴
  • 16진수 리터럴
  • 열거형

더 많은 설명은 문서를 참고하십시오:

메모리

메모리 변수는 컨트랙스 함수가 실행되는 시간에만 사용이 가능하기 때문에, 블록체인에는 저장되지 않고 비용도 저렴합니다.

Solidity 문서 (opens in a new tab)에서 EVM이 데이터(저장 공간, 메모리, 스택)를 저장하는 방법에 대해 자세히 알아보세요.

환경 변수

여러분이 컨트랙트에 정의한 변수 외에도 특별하게 사용할 수 있는 전역 변수가 있습니다. 그것을 통해 주로 블록체인과 현재 트랜잭션에 대한 정보를 알 수 있습니다.

예시:

속성상태 변수설명
block.timestampuint256현재 블록 에포크 타임스탬프
msg.sender주소메시지의 발신자(현재 호출)

함수

함수는 거래에 대한 정보를 간단한 방법으로 가져오거나 설정할 수 있습니다.

함수 호출에는 두 가지 방법이 있습니다.

  • internal – EVM 호출을 생성하지 않습니다
    • 내부 함수와 상태 변수는 내부에서만 (즉, 현재 계약 또는 그로부터 파생된 계약 내에서만) 접근할 수 있습니다
  • external – EVM 호출을 생성합니다
    • 외부 함수는 계약 인터페이스의 일부로, 다른 계약 및 트랜잭션을 통해 호출할 수 있습니다. 외부 함수 f는 내부에서 호출할 수 없습니다(예: f()는 작동하지 않지만 this.f()는 작동합니다).

public 또는 private일 수도 있습니다

  • public 함수는 계약 내에서 내부적으로 또는 메시지를 통해 외부에서 호출할 수 있습니다
  • private 함수는 정의된 계약에서만 볼 수 있으며 파생된 계약에서는 볼 수 없습니다

함수와 상태 변수 모두 public 또는 private 설정이 가능합니다.

계약의 상태 변수를 업데이트하는 함수 예제입니다:

// Solidity 예시
function update_name(string value) public {
    dapp_name = value;
}
  • string 유형의 매개변수 valueupdate_name 함수에 전달됩니다
  • public으로 선언되어 누구나 접근할 수 있습니다
  • view로 선언되지 않았으므로 계약 상태를 수정할 수 있습니다

View 함수

이 함수들은 컨트랙트 데이터를 변경하지 않습니다. 흔히 "getter" 함수라고도 하며 사용자의 지갑의 잔액을 얻을 때 사용될 때의 예시입니다.

// Solidity 예시
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

상태를 수정하는 것으로 간주되는 것:

  1. 상태 변수에 쓰기
  2. 이벤트 발생시키기 (opens in a new tab).
  3. 다른 계약 생성하기 (opens in a new tab).
  4. selfdestruct 사용하기.
  5. 호출을 통해 이더 전송
  6. view 또는 pure로 표시되지 않은 함수 호출하기.
  7. 저수준 호출 사용
  8. 특정 오프코드를 포함하는 인라인 어셈블리 사용

생성자 함수

constructor 함수는 계약이 처음 배포될 때 한 번만 실행됩니다. 많은 클래스 기반 프로그래밍 언어의 constructor와 마찬가지로, 이 함수는 종종 상태 변수를 지정된 값으로 초기화합니다.

# Vyper 예시

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

내장 함수

컨트랙트를 작성할 때 정의하는 변수와 함수 외에 추가적으로 사용할 수 있는 특별한 내장 함수가 있습니다. 대표적인 함수에는 아래가 있으며,

  • address.send() – 솔리디티
  • send(address) – Vyper

다른 계정으로 ETH를 송금할 때 사용할 수 있습니다.

함수 작성하기

당신의 함수에는 다음이 필요합니다:

  • 매개변수 변수 및 타입(매개변수를 받는 경우)
  • 내부/외부 선언
  • 순수(pure)/뷰(view)/지급(payable) 선언
  • 반환 타입(값을 반환하는 경우)

완전한 계약은 다음과 같을 수 있습니다. 여기서 constructor 함수는 dapp_name 변수에 대한 초기값을 제공합니다.

이벤트와 로그

이벤트는 스마트 계약이 프론트엔드나 다른 구독 애플리케이션과 통신할 수 있게 합니다. 트랜잭션이 검증되어 블록에 추가되면, 스마트 계약은 이벤트를 방출하고 정보를 로그로 기록할 수 있으며, 프론트엔드는 이를 처리하고 활용할 수 있습니다.

주석이 달린 예시

이것들은 Solidity로 작성된 몇 가지 예시입니다. 코드를 사용해보고 싶다면 Remix (opens in a new tab)에서 상호작용할 수 있습니다.

Hello world

토큰

고유 디지털 자산

더 읽어보기

스마트 계약에 대한 더 완전한 개요를 원한다면 Solidity와 Vyper의 문서를 확인하세요:

이 아티클이 도움이 되었나요?