---
# System prepended metadata

title: Substrate
tags: [polkadot]

---

---
title: Substrate
tags: polkadot
---

<style>

html, body, .ui-content {
    background-color: #333;
    color: #ddd;
}

.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
    color: #ddd;
}

.markdown-body h1,
.markdown-body h2 {
    border-bottom-color: #ffffff69;
}

.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
    color: #fff;
}

.markdown-body img {
    background-color: transparent;
}

.ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a {
    color: white;
    border-left: 2px solid white;
}

.expand-toggle:hover, 
.expand-toggle:focus, 
.back-to-top:hover, 
.back-to-top:focus, 
.go-to-bottom:hover, 
.go-to-bottom:focus {
    color: white;
}


.ui-toc-dropdown {
    background-color: #333;
}

.ui-toc-label.btn {
    background-color: #191919;
    color: white;
}

.ui-toc-dropdown .nav>li>a:focus, 
.ui-toc-dropdown .nav>li>a:hover {
    color: white;
    border-left: 1px solid white;
}

.markdown-body blockquote {
    color: #bcbcbc;
}

.markdown-body table tr {
    background-color: #5f5f5f;
}

.markdown-body table tr:nth-child(2n) {
    background-color: #4f4f4f;
}

.markdown-body code,
.markdown-body tt {
    color: #eee;
    background-color: rgba(230, 230, 230, 0.36);
}

a,
.open-files-container li.selected a {
    color: #5EB7E0;
}

</style>

이번에는 polkadot network에서 사용하는 blockchain framework인 substrate에 대해 알아보려 한다. 본인이 개발자가 아니다보니 내용이해를 잘 할 수 있을까 싶긴한데 일단 이해하는대로 적어보려한다. 내용은 역시나 [docs](https://docs.substrate.io)를 참고하여 작성했다.

# ~~Substrate~~

![](https://i.imgur.com/QJKoF0Y.png)

시작부터 쎄하다.. 이해못할 것 같은 느낌이..
..15분뒤..
역시나 docs내용이 substrate사용법에 관련된 내용인것으로 보인다.
따라서 글의 방향을 바꿔야할 것 같다.

# 비개발자의 blockchain 개발 도전기 (feat. substrate)

물론 도전기로 바뀌긴 했지만 그래도 Substrate가 뭔지는 알아야하니 간략하게 설명해보자면
> 블록체인 개발자들이 간단하게 DApp을 만드는 것에서 부터 복잡한 네트워크를 구성하는 등의 작업을 '쉽게'할 수 있도록 도와주는 Framework

이라고 말할 수 있을 것 같다. 그럼 얼마나 쉽게 해주는지 비개발자로서 셀프검증을 해보도록 하겠다. [Tutorial](https://docs.substrate.io/tutorials/v3/create-your-first-substrate-chain/)을 참고해서 진행했다.


# Create your first Substrate blockchain
* Blockchain software enables individual computers—called nodes—to communicate with each other to form a decentralized peer-to-peer (P2P) network.

블록체인 소프트웨어는 node라고 불리는 개인컴퓨터들이 서로 통신하여 분산형 P2P네트워크를 형성하게 해준다고 한다. 이를 위해서 Blockchain node는 아래와 같은 component들로 구성되어야 한다.

![](https://i.imgur.com/dXKkgbi.png)

그냥 보기만해도 뭔지 모르겠는 위 component들은 많이 복잡하고 특정 네트워크에 맞춰져 설계되어 있다. 그렇다보니 새로운 컨셉의 블록체인 프로젝트들은 어쩔 수 없이 이를 folk해 새로운 블록체인을 만들어야 한다고 한다.

![](https://i.imgur.com/wZgAVgc.png)

그래서 **Substrate**가 등장했다.
위의 설명을 간단하게 요약해보면 Substrate는 open source이며 모듈화되어있고 확장성이 있다고한다.
> 즉, Blockchain의 core components만 제공하고 needs에 따라 customized blockchain node를 만들 수 있게 해준다고 한다.

## Get Started
그래서 뭐부터 할거냐면
> Learn how to compile and launch a single local blockchain node.

Substrate에서 제공하는 templete을 활용하여 단일 node를 구성해보고 transaction까지 날려보는게 목표인것으로 보인다. 이를 통해 Substrate에 대한 기본적인 개념을 알고 최소한의 작업환경을 구성할 수 있게된다고 한다.

> You don't need any programming or blockchain experience to complete this tutorial. This is just the first step, but hopefully, it inspires you to continue your journey.

그냥 뜬금없긴한데 위 문구가 되게 인상깊다. tutorial을 완료하는데에는 programming과 blockchain관련 경험은 따로 필요없지만 영감을 받아 continue to your journey하길 바란다니.. 정말로 내가 그렇게 되길 바란다.



## Before you begin
아래와 같은 선 작업이 필요한 것으로 보인다. guide를 쭉 따라가면 되는것 같으니 하나하나 해보도록 하겠다.
![](https://i.imgur.com/OER39wO.png)

### 1. Install required packages
먼저 packges들을 설치해야 한다. 본인은 맥북으로 진행하므로 아래와 같은 command를 terminal에 입력해 설치했다.
> % brew update && brew install openssl

입력했는데 command가 안먹혀서 확인해보니 먼저 homebrew를 설치해야 하는것 같다. 아래 command를 사용했다.
> % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

설치시 비밀번호를 입력하라고 나오는데 부팅하고 첫화면에서 입력하는 시스템 비밀번호를 입력하면 된다.
설치가 완료되면 '**brew install openssl**'만 입력하면 된다.

### 2. Install Rust and the Rust toolchain
다음으로는 Rust 관련 설치를 했다. guide에 나와있는 command를 순서대로 입력해 설치했다. 아! Rust관련 언급을 따로 안했는데 Rust는 Substrate에서 사용하는 programming language다.

![](https://i.imgur.com/hAYrVbD.png)

설치하다보면 위와 같은 point에서 멈추는데 나는 1을 입력해서 default로 설치했다.
이후 나머지 command들을 따라 입력하며 설치를 하면 되는데 여기까지가 필요한 packges들과 Rust compiler, toolchain을 설치하는 과정이라고 한다.

### 3. Set up a development environment
#### 3.1. Prepare a Substrate node using the node template
[Substrate templete](https://github.com/substrate-developer-hub/substrate-node-template)을 통해 개발환경을 바로 받아 시작할 수 있다고 하는데 역시 guide순서대로 따라하면 되는 것 같다.
Node templete을 받는 과정으로 보인다. (설치가 꽤 오래 걸린다)

#### 3.2 Install the front-end template
front-end templete으로는 **ReactJS**를 사용한다고 한다. Front-end가 무엇을 의미하는건지 잘 모르긴 하는데 이를통해 Substrate-based node가 web browser interface와 interact한다고 한다.
추가로 **yarn**과 **node.js**도 사용한다고 하는데 역시나 설치해야하는것으로 보인다. guide에 친절하게 설치 과정이 나와있다.

yarn 설치과정에서 npm install command입력시 아래와 같은 error가 발생했는데 permission관련 문제인것같아 command앞에 sudo를 붙이니 해결됐다. (비밀번호는 역시나 시스템 비밀번호를 입력했다.)

![](https://i.imgur.com/kNicIhH.png)

### 4. Start the blockchain node and explore
뭐 한 것도 없는것 같은데 벌써 local node를 start할 준비가 됐다고 한다. 보니까 지금까지의 과정이 substrate node templete을 copile한 과정이라고 한다. (확인해보니 3.1 과정에서 아래와 같은 command가 compile command였다.)
> cargo build --release

node를 시작하기 위해서는 node templete을 compile한 root directory로 이동해야한다고 하는데 아래 directory로 가면된다
> substrate-node-template

해당 directory에서 아래 command를 사용하여 node를 시작할 수 있는데 --dev option은 어떤 mode로 실행할건지 선택하는것이라고 한다. 예제의 경우 개발자 모드로 실행한 것이다.
> ./target/release/node-template --dev

개발자 모드의경우 매번 초기화된 상태로 node를 실행할 수 있는 command라고 한다. 이경우 key, database, networking information이 모두 초기화 된 상태로 node가 실행되는데 Ctrl-C로 종료하면 모든 정보가 날아간다. 매번 clean한 상태에서 개발할 수 있도록 하는것 같다.

![](https://i.imgur.com/c8EUxOP.png)

node가 돌아가면서 위와 같은 log를 확인할 수 있는데 정상적으로 실행이 됐다면 finalized # 뒤의 숫자가 증가한다. 이게 내가만든 blockchain이 합의를 통해 새로운 block을 생성해냈음을 의미한다고 한다.
이외에도 여러 log가 나오는데 이후 tutorial에서 추가로 배운다고 한다.

### 5. Start the front-end template
드디어 front-end templete이 뭔지 어렴풋이 이해했다. 4번 과정까지가 node를 시작하는 과정이었고 이번 과정이 이를 visualize해서 보여주는 과정인것 같다. 그러므로 front-end는 우리가 볼 수 있게 만들어주는 무언가 인 것 같다.
실행을 위해서는 command를 입력해야하는데 기존 node를 켜둔 terminal은 종료하면 안되고 새로운 terminal을 실행해야한다. 실행 후 아래 directory로 이동해 '**yarn start**' command를 입력해야 한다.
> substrate-node-template/substrate-front-end-template

수행하면 아래와 같이 browser에서 node상태를 확인할 수 있다. 별거 한것도 없는데.. 확실히 framework이라고 자랑할만 한 것 같다. 정말 간편하다.
![](https://i.imgur.com/cWZFyWp.png)

일반적인 현재 block높이 account별 address, balance등을 확인 할 수 있다. 앞으로 transaction들을 사용하며 자산이 이동될때 이를 통해 확인 할 수 있을 것 같다.

### 6. Transfer funds from one account to another
역시나 바로 자산을 전송하는 과정이 나온다.
![](https://i.imgur.com/uvQHWU9.png)
일단 위에 부분에서 계정을 선택해야 한다. 아마 지금은 자유롭게 계정을 선택하지만 나중에는 password를 입력하는 등의 보안 작업이 필요할 것으로 보인다. 나의경우 BOB계정을 선택했다.

선택이후 스크롤을 내리면 아래와 같은 부분이 나오는데 여기서 보낼 상대를 선택하면 자동적으로 주소가 입력되고 amount에 수량을 입력하면 된다.  1 unit == 100000000000 이기 때문에 2 unit만큼을 보내봤다. 

![](https://i.imgur.com/ovxxKai.png)

이후 submit을 누르고 전송이 완료되면 아래와같이 Event에 전송 작업들이 나타난다.

![](https://i.imgur.com/wR3hRPI.png)

전송이 완료되면 아래와 같이 BOB의 balance가 줄어들고 charlie의 balance가 늘어난 것을 볼수있다.(신기하다..!!)

![](https://i.imgur.com/DE0hUah.png)

그리고 전송이 완료되면 아래와같이 submit 버튼 밑에 finalized block hash값이 나온다

![](https://i.imgur.com/qCwCsVy.png)

## 정리
여기까지가 tutorial이다. (이후 추가과정 더있음 이번 session만 끝난것)
소감으로는 templete이 이미 만들어져 있어서인지 정말 간편하게 해볼 수 있었던것같다. command line만으로 보는게 아니고 visualize되는것을 눈으로 보니 생각보다 재밌고 신기했다. 정말 간편하게 환경을 만들 수 있었고 이 위에서 여러가지를 해 볼 수 있을것 같다. 따로 다른 blockchain framework를 체험해본 것은 아니지만 substrate가 정말 간편하긴 하다고 느꼈다. 이후 추가 과정들을 더 해보며 후기를 남겨야겠다. 추가로 Rust언어를 꼭 알아야 하는것은 아니지만 알면 substrate를 훨씬 잘 이해할 수 있고 configurable하게 사용할 수 있다고 한다. Rust도 공부해봐야겠다. 확실히 이런식으로 사용하면 blockchain을 전혀 몰라도 될 듯 하다. 하지만 나는 더 low level까지 알아보고 싶기때문에 이후 Rust를 공부해서 다른 tutorial들을 거쳐 여러가지를 시도해봐야겠다.