이번 글은 [블록체인과 솔리디티] 섹션 1 강의를 정리한 글이다.
솔리디티
솔리디티는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어로 C++, Pyhton , JavaScript 의 영향을 받은 고수준의 언어이다. 솔리디티는 정적 타입이며, 상속, 라이브러리, 유저 정의 타입을 지원하는 특징이 있다.
이더리움 버추얼 머신이라는 EVM을 타겟으로 디자인되어 있다.
- Ethereum Virtual Machine
이더리움 네트워크 노드들이 공유하는 하나의 거대한 가상머신이다.
스마트 컨트랙트는 특성상 한번 블록체인 위에 올라가면 바꿀 수 없고, 누구나 확인할 수 있기 때문에 신중하게 작성해야 한다.
솔리디티로 스마트 컨트랙트를 작성하는 방법
remix라는 웹 기반의 솔리디티 에디터를 사용하여 솔리디티로 스마트 컨트랙트를 작성하도록 하겠다.
remix는 웹 브라우저에서 사용 가능한 IDE이고 솔리디티 프로그램을 테스트, 실행해볼 수 있는 도구이다.
솔리디티의 특징
솔리디티는 튜링완전하는 특징을 가진다. 튜링완전하다는 것은 반복문과 제어문을 사용할 수 있다고 간단하게 말할 수 있다.
솔리디티는 msg.sender, msg.value라는 특수한 변수가 존재한다.
- msg.sender: 메세지를 보낸 주소
- msg.value: 메세지를 보낸 값
스마트 컨트랙트 구조
컨트랙트는 클래스와 비슷하여 상태 변수, 함수, 함수 변경자, 이벤트, 구조체, 열거형 등을 포함한다. 또한 상속과 다양성도 지원이 된다.
// 1. 컨트랙트 선언
contract Sample {
// 2. 상태 변수 선언
uint256 data;
address owner;
// 3. 이벤트 정의
event logData(uint256 dataToLog);
// 4. 함수 변경자 정의
modifier onlyOwner() {
if(msg.sender != owner) revert();
_;
}
// 5. 생성자
function Sample(uint256 initData, address initOwner) {
data = initData;
onwer = initOwner;
}
// 6. 함수(메소드) 정의
function getData() returns (uint256 returned) {
return data;
}
function setData(uint256 newData) onlyOwner {
logData(newData);
data = newData;
}
}
```
위 코드는 스마트 컨트랙트 작성 시에 뼈대 코드로 활용하기 좋다.
솔리디티 데이터 타입
- string & byte
문자열을 표현하는 데이터 타입으로 둘의 차이점은 string은 UTF8로 인코딩 되어 우리가 알아보기 쉽도록 표현된다.
- mapping
키와 value 쌍을 이야기하며, 위 예제에서는 address 값으 키로 sting value를 맵핑하였다.
- 정적 배열 & 동적 배열
동적 배열을 사용하며 블록체인 상에 마치 데이터베이스처럼 값을 계속 추가하며 사용할 수 있다.
- interface
인터페이스를 사용하여 추상 계층을 작성할 수 있다.
- modifier
modifier라는 한정자를 가지고 있으며, 한정자는 함수를 실행하면 함수를 실행하는 조건으로 자리할 수 있다.
다른 언어의 데코레이터(decorator)와 비슷한 역할을 수행한다.
데코레이터란? 함수나 메서드에 적용되어, 해당 함수나 메서드의 기능을 확장하거나 변경하는 역할을 한다.
데이터위치와 문법
- storage - 상태변수, 로컬변수
- memory - 로컬변수
스토리지는 전역 변수와 같고, 블록체인 내에 저장된다. 메모리는 로컬변수와 같으며 사용 후 휘발된다.
솔리디티 문법
if, else, while, for, break, continue, return, ?(삼항연산자) 등을 지원한다.
가시성
가시성이란 누가 접근할 수 있는가를 정의하며, external, pubric, internal, private 등 4가지가 있다.
- external
다른 컨트롤러나 트랜젝션을 통해 호출될 수 있다. 그렇기 때문에 function f를 f() 이렇게 그냥 부르면 동작하지 않고 this.f()로 호출해야 한다.
- pubric
모든 방법으로 접근할 수 있다.
Getter()가 자동 생성되어 값을 가져올 수 있다.
- internal
내부적으로만 접근할 수 있다. 접근을 위해 this를 사용할 수 없다는 특징을 가진다.
- private
상속된 컨트랙트에서는 접근할 수 없다.
가스
EVM에서 어떤 것이 실행될 때, 가스가 발생하는데, 가스는 수수료라고 이야기할 수 있다.
가스 리밋
수수료의 한계치로 가스 리밋을 낮게 설정하면 일을 끝마치기 전에 가스(수수료)를 다 사용하게 된다.
이런 경우 이더리움에서는 지금까지 한 일들을 취소시키고 지금까지 수수료는 돌려주지 않는다. 채굴자들이 일을 했기 때문에 수수료 돌려주지 않는 것이다.
가스 프라이스
가스 프라이스는 가스당 가격으로 가격이 비싸지면 채불자들은 수수료를 많이 받을 수 있기에 비싼 가스 프라이스가 먼저 채굴되는 경향이 있다.
가스 프라이스 * 가스 사용량 = 수수료
'자기개발 > 블록체인' 카테고리의 다른 글
[솔리디티 깨부수기] funtion3 : view와 Pure (0) | 2024.05.06 |
---|---|
[솔리디티 깨부수기] funtion2 : 접근 제한자 (0) | 2024.05.06 |
[솔리디티 깨부수기] Ether/GWei 그리고 Gas & Function1 (0) | 2024.04.29 |
[ 솔리디티 깨부수기 ] Hello Solidity & data type (0) | 2024.04.16 |
[블록체인] (0) | 2024.04.03 |