728x90
 

[지금 무료] 블록체인과 솔리디티 | 박민 박 - 인프런

박민 박 | Solinity 언어와 Truffle 빌드 프레임 워크를 사용하는 Ethereum 블록체인에서의 탈중앙화 애플리케이션 (Dapp) 개발, [임베딩 영상] 블록체인과 솔리디티 이 강의는 블록체인에 대한 이해를 높

www.inflearn.com

이번 글은 [블록체인과 솔리디티] 섹션 1 강의를 정리한 글이다.

 


솔리디티

솔리디티는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어로 C++, Pyhton , JavaScript 의 영향을 받은 고수준의 언어이다. 솔리디티는 정적 타입이며, 상속, 라이브러리, 유저 정의 타입을 지원하는 특징이 있다.

이더리움 버추얼 머신이라는 EVM을 타겟으로 디자인되어 있다.

  • Ethereum Virtual Machine

이더리움 네트워크 노드들이 공유하는 하나의 거대한 가상머신이다.

 

스마트 컨트랙트는 특성상 한번 블록체인 위에 올라가면 바꿀 수 없고, 누구나 확인할 수 있기 때문에 신중하게 작성해야 한다. 

솔리디티로 스마트 컨트랙트를 작성하는 방법

 

Remix - Ethereum IDE

 

remix.ethereum.org

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에서 어떤 것이 실행될 때, 가스가 발생하는데, 가스는 수수료라고 이야기할 수 있다.

가스 리밋

수수료의 한계치로 가스 리밋을 낮게 설정하면 일을 끝마치기 전에 가스(수수료)를 다 사용하게 된다.

이런 경우 이더리움에서는 지금까지 한 일들을 취소시키고 지금까지 수수료는 돌려주지 않는다. 채굴자들이 일을 했기 때문에 수수료 돌려주지 않는 것이다.

가스 프라이스

가스 프라이스는 가스당 가격으로 가격이 비싸지면 채불자들은 수수료를 많이 받을 수 있기에 비싼 가스 프라이스가 먼저 채굴되는 경향이 있다.

가스 프라이스 * 가스 사용량 = 수수료

 

+ Recent posts