What is substrate

이동창·2022년 4월 11일
1

Substrate의 3가지 구조

  1. Substrate Node
    블록체인 네트워크를 직접 만들어볼 수 있는 SDK

  2. Substrate FRAME
    Framework for Runtime Aggregation of Modularized Entities
    모듈화된 엔티티의 런타임 집계를 위한 프레임워크

    아직은 확실하지는 않지만, Ethereum의 Smart Contract와 같은 역할이 아닌가 싶다
    사실 Smart Contract의 역할을 하는건 Pallet이고,
    Substrate에서 기본으로 제공하는 Pallet들을 묶어서 Frame이라고 하는 듯

    Q : 그럼 런타임은 뭐지?
    A : 상태 변환 함수 (이더리움의 EVM과 비슷한듯)
    참고 - https://docs.substrate.io/v3/concepts/runtime/

  3. Substrate Core
    WebAssembly로 컴파일 가능한 언어로 아예 1,2를 처음부터 다시 짤 수 있다.
    근데 현재 Substrate Client가 Rust 기반이다보니,
    Rust를 이용하면 조금 더 쉽게 이를 구현 가능하도록 해놓은 듯 하다.

강조하고 있는 부분은, 1번으로 갈 수록 개발은 쉽고, 3번으로 갈수록 자유도는 늘어난다는 것

일단 1번까지 해봤는데, 확실히 잘해놓긴 했다.
https://polkadot.js.org/
https://docs.substrate.io/v3/integration/polkadot-js/
이런 문서도 너무 좋고,
개인 블록체인 네트워크를 재미로 만들어보고 싶다면, 사용해봐도 재밌을 듯




합의 알고리즘

일단 합의 알고리즘부터 봐보자

설명을 그대로 따오자면 블록체인의 노드들은 다음에 합의해야 한다.

  • 제네시스(맨 처음) 블록
  • 각각의 블록
  • 현재의 상태

괜히 따왔다.
영어로는 뭔가 있어보였는데 풀어놓으니 그냥 그러네

이중지불

먼저 이중지불은 어떻게 해결하나?
이더리움이랑 비슷하다.
일단 당연히 가장 긴 체인을 선택하나, 조카 블록들의 숫자도 같이 세서 체인의 길이를 잰다. (GHOST rule)

다만 finalized가 되면 변경되지 않는 것 같다.
밑에서 추가 설명 있음

블록생성

일단 블록 생성은 PoW로 진행되나, 아무나 참여할 수 있는건 아니고
각 Slot당 생성 권한이 있는 노드들이 정해지게 되는 것 같다.
아마도 CPU 파워가 강한 노드가 나오더라도, 조금은 공평하게 하려고 했던 것 같기도 하고?

Finalized

위에서 잠깐 언급했듯이, 자식 뿐만 아니라 조카 노드들까지 같이 카운팅하면
아무래도 finalized 되기가 상당히 어려워질 수 밖에 없다. (언제 바뀔지 모르니)

그래서 투표 시스템이 존재하는데, 이게 Grandpa 였던 걸로 언뜻 들었던 것 같은데
노드의 2/3이 투표를 하게 되면, 하드 포크가 아니라면 돌릴 수 없는 확정 상태로 만들 수 있게 된다.

맞네 GRANDPA




Pallet

처음엔 Polkadot + Wallet 인줄 알고 지갑인가 싶었는데, 그건 아니고
오히려 Pallet이 Smart Contract과 비슷한 역할이었다.

substrate-node-template에 기본으로 제공되는 Pallet들을 확인할 수 있고,
이를 기본적으로 FRAME이라고 부르는듯하다.
이를 바탕으로 상태 변환 함수를 실행시키는 과정을 Runtime이라고 하는 듯

일단 이정도면 어느정도 감은 잡힌 것 같고 실습이나 해보자




실습

진행한 목록들

  1. https://docs.substrate.io/tutorials/v3/create-your-first-substrate-chain/
  2. https://docs.substrate.io/tutorials/v3/add-a-pallet/

1. Create you first Substrate blockchain

그냥 개발환경 세팅하는 부분인데 cargo는 솔라나 개발환경 세팅할 때 다 했던거라 할 게 없었고,
node랑 front template 2개 가져와서 빌드해줬는데
front template이 생각보다 꽤 괜찮아서 살짝 놀랬다.

m1이랑 호환성도 뭐 문제 없는 것 같긴한데,
사실 그건 내가 intel x86 rust 깔아서 그런 걸 수도.. 다른 m1 맥북 유저들은 어떤지 모르겠다.

2. Add the Nicks Pallet

사실상 여기서부터가 진짜 실습이라고 보는게 맞을듯
직접 스마트 컨트랙트를 node에 탑재해보는건데,
근데 궁금한 점이 이걸 왜 굳이 node를 시작하기 전에 탑재해야 하는지 이해가 잘 안갔다.

보통은 node가 돌아가고 있는 상황에서 deploy를 진행하는게 조금 더 자연스러운 것 같은데,
-> 9강가면 배울듯
그냥 Solana vote program이나 stake program처럼 그냥 기본으로 제공해주는
프로그램들을 미리 탑재시키는 예제인건가? 그런듯

일단 Pallet을 추가할 때 신경 쓸 부분들은

  1. Config
  2. parameter_types!
  3. construct_runtime!
  4. runtime/Cargo.toml

등이 있다.

4번은 등록한 패키지 넣을 때 신경쓰면 될 것 같고
사실 1~3번도 내가 직접 구현해본 것이 아니기 때문에, 그냥 복붙한 것과 다르지 않아서
정확한 설명은 하기가 좀 어려운 것 같긴하다.

node-template을 보니까 pallets 폴더에 template이 있던데
이걸보면 좀 나을 것 같다.

https://github.com/paritytech/substrate/blob/master/frame/nicks/src/lib.rs
Github 가서 찾아보니까 lib.rs에 config, event, call 등등 상세한 구현이 들어가는 것 같다.

뭔가 anchor로 구현한 솔라나 컨트랙트 구조와 비슷하다.

자세한 구조는 3강에서 보는 듯

0개의 댓글