본문으로 건너뛰기
0%

Solidity 스마트 컨트랙트 소개

Daniel Idowu headshot

작성자 Daniel Idowu

2022년 10월 4일에 게시됨5분 읽기

Solidity 스마트 컨트랙트는 다중 서명 지갑부터 탈중앙화 거래소에 이르기까지 다양한 용도로 사용됩니다. Solidity는 스마트 컨트랙트 작성을 위해 특별히 만들어진 주요 web3 프로그래밍 언어 중 하나로, 그 인기가 꾸준히 상승하고 있습니다.

이 글에서는 Solidity 스마트 컨트랙트가 무엇인지, 어떻게 작동하는지, 그리고 그 속성에 대해 소개합니다. 또한 Solidity 스마트 컨트랙트 문법과 데이터 타입을 살펴보며 다음 프로젝트에서 Solidity 스마트 컨트랙트를 다루는 데 필요한 기초를 다집니다. Solidity에 대한 지식을 넓히려면 Alchemy University의 무료 Solidity 문법 강좌를 수강하세요.

Solidity 스마트 컨트랙트란 무엇인가?

Solidity 스마트 컨트랙트는 Solidity로 작성되어 Ethereum 블록체인에 배포되고 Ethereum Virtual Machine(EVM)에서 실행되는 프로그램입니다. Ethereum은 스마트 컨트랙트 코드와 데이터(상태)를 지정된 주소에 저장합니다.

사전에 정해진 조건이 충족되면, 블록체인에 저장된 프로그램인 스마트 컨트랙트가 중개자 없이 실행됩니다. 즉, 스마트 컨트랙트는 Ethereum 상태 내 계정들의 동작을 관리하는 프로그램입니다.

Solidity 또는 EVM과 호환되는 다른 프로그래밍 언어로 스마트 컨트랙트를 작성할 수 있습니다. EVM과 호환되려면 먼저 바이트코드로 컴파일되어야 합니다.

Solidity는 스마트 컨트랙트 작성을 위한 객체지향 고급 언어입니다. Solidity로 작성된 스마트 컨트랙트는 투표, 크라우드펀딩, 블라인드 경매, 다중 서명 지갑 등 다양한 목적으로 사용될 수 있습니다.

스마트 컨트랙트는 어떻게 작동하는가?

스마트 컨트랙트는 블록체인에 저장된 프로그램입니다. 스마트 컨트랙트는 여러 당사자 간의 합의를 코드로 강화하고, 사전 조건이 충족되면 규칙을 자동으로 실행합니다. 이는 스마트 컨트랙트에 관여하는 모든 당사자가 시간 손실이나 제3자의 개입 없이 결과를 즉시 확신할 수 있음을 의미합니다. 스마트 컨트랙트는 또한 워크플로우를 자동화하여 실행 시 다음 이벤트를 트리거할 수 있습니다.

ERC20 표준을 따르는 스마트 컨트랙트는 ERC20 토큰으로 간주됩니다. ERC20 토큰은 보유자 간 토큰 전송을 가능하게 합니다.

Solidity 스마트 컨트랙트의 속성은 무엇인가?

스마트 컨트랙트는 본질적으로 불변하고 결정론적입니다. 즉, 스마트 컨트랙트가 Ethereum에 배포 또는 구축되면, 자체 파괴를 트리거하는 조건이 프로그래밍되어 있지 않는 한 결코 사라지지 않습니다. 코드는 항상 프로그래밍된 조건에 따라 실행됩니다.

또한 스마트 컨트랙트는 결정론적인데, 이는 각 네트워크 노드가 특정 메서드에 동일한 입력이 주어졌을 때 동일한 결과를 산출할 수 있기 때문입니다. 만약 서로 다른 노드가 스마트 컨트랙트 실행 시 서로 다른 출력을 도출한다면, 합의 프로토콜이 위반되고 스마트 컨트랙트는 사용할 수 없게 됩니다.

또한 스마트 컨트랙트는 퍼미션리스합니다. 이는 ETH를 보유하고 인터넷에 접근할 수 있는 사람이라면 누구든지 Ethereum에 스마트 컨트랙트를 배포할 수 있다는 뜻입니다.

마지막으로, 스마트 컨트랙트는 조합 가능합니다. 이는 다른 프로젝트의 스마트 컨트랙트를 여러분의 프로젝트를 위한 빌딩 블록으로 사용할 수 있다는 의미입니다. 스마트 컨트랙트는 개방형 API와 같다고 볼 수 있으며, 사용자는 dApp 개발자가 되기 위해 자신만의 스마트 컨트랙트를 작성할 필요 없이 그것들과 상호작용하는 방법만 알면 됩니다.

Solidity 스마트 컨트랙트 문법

Solidity 학습을 시작하는 데 도움이 되는 여러 자료가 있지만, 이 섹션에서는 Solidity 스마트 컨트랙트 작성에 사용되는 문법을 다룹니다.

1. 컨트랙트

Solidity의 컨트랙트는 객체지향 언어의 클래스와 유사합니다. 각 컨트랙트는 상태 변수, 함수, 함수 수정자, 이벤트, 오류, 구조체 타입 및 열거형 타입의 선언을 포함할 수 있습니다. 이 글에서는 생성자, 상태 변수, 정수 변수에 대해 좀 더 자세히 다루겠습니다. 또한 컨트랙트는 다른 컨트랙트로부터 상속받을 수 있습니다.

라이브러리와 인터페이스라고 불리는 특수한 컨트랙트도 있습니다.

2. 시맨틱 버저닝

Solidity는 대부분의 소프트웨어처럼 시맨틱 버저닝을 사용합니다. 이는 메이저 버전을 업데이트하지 않는 한 큰 변경 사항이 없다는 뜻입니다. 각 Solidity 버전에 도입된 주요 변경 사항은 문서에서 확인할 수 있습니다. 2022년 8월 기준 Solidity의 최신 버전은 v0.8.16입니다.

3. 생성자

생성자는 배포, 즉 컨트랙트 생성 시 단 한 번만 호출됩니다. 생성자는 constructor 키워드로 선언되는 선택적 함수로, 컨트랙트 초기화 코드를 실행할 수 있게 합니다.

생성자 코드가 실행되기 전, 상태 변수는 인라인으로 초기화한 경우 지정된 값으로, 그렇지 않은 경우 기본값으로 초기화됩니다.

생성자가 실행된 후, 컨트랙트의 최종 코드가 블록체인에 배포됩니다.

생성자가 없는 경우, 컨트랙트는 기본 생성자를 사용합니다.

4. 상태 변수

상태 변수는 값이 컨트랙트 스토리지에 저장되는 변수입니다. 각 함수는 자체 스코프를 가지며, 상태 변수는 항상 해당 스코프 바깥에 정의되어야 합니다.

상태 변수는 가시성을 따릅니다. public 가시성 키워드를 사용하여 상태 변수를 public으로 만들 수 있으며, 이는 다른 스마트 컨트랙트가 접근할 수 있는 getter 함수를 제공합니다.

5. 수정자

Solidity에서 수정자는 선언적인 방식으로 함수의 의미를 변경합니다. 다시 말해, 수정자는 자신이 적용된 함수의 동작을 변경합니다. 수정자는 코드 중복을 없애는 데 유용하며, 스마트 컨트랙트 내 여러 함수에서 동일한 조건을 확인하기 위해 재사용될 수 있습니다.

6. 정수 변수

Solidity에는 두 가지 유형의 정수 변수가 있습니다: 부호 없는 정수(uint)와 부호 있는 정수(int)입니다. 부호 있는 정수는 음수와 양수 값을 모두 저장할 수 있는 값 데이터 타입입니다. 반면 부호 없는 정수는 부호가 없으므로 반드시 음수가 아닌 값이어야 하는 값 데이터 타입입니다.

Solidity 데이터 타입

다른 프로그래밍 언어와 마찬가지로 Solidity에는 다양한 데이터 타입 분류가 있습니다. 다만 Solidity는 여러 기본 데이터 타입을 조합하여 더 복잡한 데이터 타입을 만들 수 있다는 점에서 독특합니다. 이 섹션에서는 Solidity의 주요 데이터 타입을 설명합니다.

1. Booleans

Solidity에서 _bool_로 표기되는 boolean이 가질 수 있는 값은 상수 true와 false입니다.

2. Strings

문자열 리터럴은 큰따옴표 또는 작은따옴표로 작성합니다. 문자열은 여러 개의 연속된 부분으로 나눌 수 있으며, 이는 긴 문자열을 다룰 때 유용합니다.

3. Numbers

_Fixed_와 _ufixed_는 각각 다양한 크기의 부호 있는 고정소수점 숫자와 부호 없는 고정소수점 숫자를 나타냅니다.

4. Bytes

Solidity에서 byte는 8비트 부호 있는 정수를 의미합니다. 비트는 메모리에 0 또는 1의 이진값으로 저장됩니다. Solidity에서 byte 데이터 타입은 바이트의 시퀀스를 나타냅니다.

Solidity에는 두 가지 유형의 byte 타입이 있습니다: 고정 크기 바이트 배열동적 크기 바이트 배열입니다. bytesX 키워드는 변수를 정의하는 데 사용되며, 여기서 X는 1부터 32까지의 바이트 시퀀스 길이를 나타냅니다.

Solidity의 bytes는 바이트의 동적 배열을 나타냅니다. 다만 이는 값 타입이 아닙니다.

5. Address

address는 Ethereum 주소의 크기인 20바이트 값을 가집니다. address 체크섬 테스트를 통과하는 16진수 리터럴은 address 타입입니다. 39자에서 41자 사이의 16진수 리터럴이 체크섬 테스트를 통과하지 못하면 오류가 발생합니다. 정수 타입의 경우 앞에, bytesNN 타입의 경우 뒤에 0을 추가하여 오류를 없앨 수 있습니다.

6. Payable address

payable address는 address payable로 표기되며, address와 유사하지만 transfer와 send라는 추가 멤버를 가지고 있습니다. 이러한 구분이 필요한 이유는 일반 address가 Ether(ETH)를 받도록 만들어지지 않은 스마트 컨트랙트일 수 있기 때문입니다. address payable은 Ether를 보낼 수 있는 address입니다.

7. Enums

Enum은 Solidity에서 열거형 값이라고도 불리며, 정수 상수의 이름과 같은 상수 값을 생성할 수 있게 해주는 사용자 정의 타입을 만드는 한 가지 방법입니다. Enum은 기본 값 타입에 비해 스마트 컨트랙트를 더 읽기 쉽고 유지 관리하기 쉽게 만듭니다.

Enum은 모든 정수 타입과 명시적으로 상호 변환이 가능하지만, 암묵적 변환은 허용되지 않습니다. 정수로부터의 명시적 변환은 런타임에 값이 enum의 범위 내에 있는지 검사하며, 그렇지 않으면 패닉 오류를 발생시킵니다. 따라서 Enum은 코드 내 버그 발생을 줄여줍니다.

Enum은 최소 하나의 멤버가 필요하며, 선언 시 기본값은 첫 번째 멤버입니다. Enum은 256개를 초과하는 멤버를 가질 수 없습니다.

8. Arrays

배열은 동일한 데이터 타입을 가진 변수들의 그룹이며, 각 변수는 고유한 인덱스를 가집니다. 배열은 컴파일 타임에 고정된 크기를 가질 수 있으며, 이 경우 고정 배열이 되고, 동적인 크기를 가질 수도 있으며, 이 경우 동적 배열이 됩니다.

고정 크기 배열은 선언 시 크기가 미리 정해져 있습니다. new 키워드를 사용하여 추가 배열 멤버를 도입할 수는 없습니다. 대신 데이터 변수는 인라인으로 초기화되어야 합니다.

동적 크기 배열은 선언 시 크기가 미리 정해져 있지 않습니다. 대신 크기는 런타임에 결정됩니다.

배열 요소는 매핑이나 구조체(사용자 정의 데이터 구조)를 포함하여 어떤 타입이든 될 수 있습니다.

9. Mappings

Solidity에서 매핑은 다른 프로그래밍 언어의 해시 테이블이나 딕셔너리처럼 작동합니다. 매핑은 참조 타입으로 작동하며 키-값 쌍의 형태로 데이터를 저장합니다. 이때 키는 참조 타입을 제외한 내장 데이터 타입 중 무엇이든 될 수 있으며, 값은 어떤 타입이든 될 수 있습니다.

매핑 타입의 상태 변수가 public인 경우, Solidity는 자동으로 getter 함수를 생성합니다.

10. Structs (사용자 정의 타입)

struct, 즉 구조체는 새로운 데이터 타입을 정의할 수 있게 해줍니다. Struct 타입은 매핑과 배열 내부에서 사용될 수 있으며, 그 자체로 중첩된 매핑과 배열을 포함할 수 있습니다. 다만 struct의 크기는 유한해야 하므로, struct가 자기 자신과 같은 타입의 멤버를 포함하는 것은 불가능합니다.

스마트 컨트랙트 컨텍스트란 무엇인가?

스마트 컨트랙트 컨텍스트는 트랜잭션이 실행되는 환경에 대한 정보를 제공합니다. 스마트 컨트랙트 함수가 트랜잭션을 통해 호출되면, 호출된 함수는 몇 가지 추가 정보를 전달받습니다. 스마트 컨트랙트 함수 내부에서는 이러한 컨텍스트 변수에 접근할 수 있습니다.

여러분은 메시지 발신자, 가스 가격, 그리고 트랜잭션에서 수행된 테스트에 접근할 수 있습니다. 따라서 코드 로직에서 상호 교환적으로 사용할 수 있는 여러 컨텍스트 변수에 접근할 수 있는 것입니다.

더 배우려면 Ethereum 개발자 부트캠프에 등록하세요

이 글에서는 Solidity 스마트 컨트랙트를 시작하는 데 필요한 기초를 소개하고, 이해를 높이기 위해 주요 데이터 타입과 문법을 설명했습니다. Solidity로 스마트 컨트랙트를 만드는 방법을 더 배우려면 Alchemy의 무료 온라인 Ethereum Developer Bootcamp에 등록하세요. 개발 경험이 전혀 없는 개발자라면, Alchemy University의 3주짜리 Ethereum을 위한 JavaScript 속성 강좌를 선행 과정으로 수강하는 것이 좋습니다.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.