5. Start a private network

코와->코어·2022년 5월 24일
0

Substrate 공부하기

목록 보기
5/8
post-thumbnail

이 튜토리얼은 권한을 가진 private validator들이 있는 작고 독립적인 블록체인 네트워크를 시작하는 방법을 다룸

모든 블록체인은 성공적으로 블록을 만들고 다음 블록으로 넘어가기 위해 네트워크의 모든 노드들이 메시지와 그 메시지들의 순서에 합의해야 함
각 블록은 특정 시점의 데이터 상태를 나타내고 그 상태에 대한 노드들의 동의를 합의라고 함
합의에 도달하기 위해 여러 알고리즘들이 사용됨:

  • PoW : 검증자 노드들이 블록을 체인에 추가하기 위해 하는 연산 작업에 의해
  • PoS : 암호화폐를 네트워크에 스테이킹한 양에 기반해 블록을 추가할 수 있는 검증자들을 선정
  • PoA : 검증자로 활동하는 인증된 계정들이 합의. 인증된 계정과 연관된 노드들이 블록을 만들 권한 가짐

Substrate 노드 템플릿은 PoA를 사용하고 이를 authority round 또는 Aura합의라고 부름
Aura 합의 프로토콜은 round-robin 방식으로 블록을 생성하는 권한 있는 계정 리스트-authorities-에서 순환하도록 블록 생성을 제한함
*round robin : 프로세스들 사이에 우선순위를 두지 않고, 순서대로 할당

이 튜토리얼에서 실제로 이 합의 모델이 어떻게 작동하는지 알아볼 텐데, 먼저 노드 템플릿에 미리 정의된 계정들을 사용한 다음 인증된 집합에 새로운 권한을 추가해볼 것임


시작하기 전에

  • Rust와 Rust toolchain 설치
  • 튜토리얼 1번 완료하고 Substrate node template 다운
  • CLI로 개발하는 것에 익숙하다고 가정
  • 블록체인과 스마트 컨트랙트 플랫폼에 익숙하다고 가정

튜토리얼 목표

  • 미리 정의된 계정들을 사용해서 peer 블록체인 노드 시작하기
  • 네트워크 권한으로 사용하기 위해 key pair 생성하기
  • 커스텀 체인 명세 파일 만들기
  • private이면서 두 개의 노드를 갖는 블록체인 시작하기

미리 정의된 계정들로 블록체인 시작

private Substrate 네트워크를 시작하기 위해 key를 생성하기 전,local이라 불리는 미리 정의된 네트워크 명세를 사용해서 근본 원리를 배우고 미리 정의된 사용자 계정으로 실행해볼 수 있음

여기에서는 하나의 로컬 컴퓨터에서 alicebob이라는 미리 정의된 계정들을 사용해서 두 개의 Substrate 노드들을 실행시킴으로써 private network를 시뮬레이션 할 것임

첫 번째 블록체인 노드 시작

  1. 터미널 열기

  2. Substrate node template을 컴파일한 루트 디렉토리로 가기

  3. 다음 명령어를 실행해서 이전 체인 데이터 버리기

./target/release/node-template purge-chain --base-path /tmp/alice --chain local

다음 프롬프트가 뜨면

Are you sure to remove "/tmp/alice/chains/local_testnet/db"? [y/N]:
  1. y 입력

새 네트워크 시작할 땐 이전 체인 데이터 항상 지워야 함

  1. 다음 명령어를 실행해서 Alice 계정으로 로컬 블록체인 네트워크 시작
./target/release/node-template \
--base-path /tmp/alice \
--chain local \
--alice \
--port 30333 \
--ws-port 9945 \
--rpc-port 9933 \
--node-key 0000000000000000000000000000000000000000000000000000000000000001 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator

CLI 옵션 알아보기

  • --base-path : 이 체인과 관련된 모든 데이터를 저장하는 디렉토리
  • --chain local : 사용할 체인 명세. 유효한 미리 정의된 체인 명세는 local, development, staging을 포함
  • --alice : 노드의 keystore에 Alice 계정의 미리 정의된 키들을 추가. 이 설정으로 Alice 계정이 블록 생성과 finalization에 사용됨
  • --port 30333 : peer-to-peer (p2p) 트래픽을 수신할 포트 번호. 네으퉈크 시뮬레이션을 위해 같은 물리적 컴퓨터에서 두 개의 노드를 실행시키기 때문에, 적어도 하나의 계정에서는 다른 포트 번호를 명시해줘야 함
  • --ws-port 9945 : WebSocket 트래픽을 수신하기 위한 포트번호. 디폴트는 9944지만 이 튜토리얼에서는 9945 사용.
  • --rpc-port 9933 : RPC 트래픽 수신하기 위한 포트번호 명시. 디폴트는 9933.
  • --node-key <key> : libp2p 네트워킹에 사용할 Ed25519 비밀 키 명시. 개발과 테스트를 위해서만 이 옵션 사용해야 함
  • --telemetry-url : 원격 측정 데이터를 어디로 보낼지 명시. 이 튜토리얼에서는 Parity가 누구나 사용할 수 있도록 호스팅하는 서버에 보낼 것
  • --validator : 이 노드가 네트워크에서 블록 생성과 finalization에 참여한다는 것 명시
    ./target/release/node-template --help 명령어로 더 알아볼 수 있음

표시되는 노드 메시지 리뷰
노드가 성공적으로 시작했다면, 터미널에 네트워크 작동을 설명하는 메시지가 표시될 것

  • 🔨 Initializing Genesis block/state (state: 0xea47…9ba8, header-hash: 0x9d07…7cce) : 노드가 사용하는 genesis block을 식별. 다음 노드를 시작하면, 이 값이 동일한 것을 확인할 수 있음
  • 🏷 Local node identity is: 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp : 유일하게 이 노드를 식별하는 문자열. 이 문자열은 alice 계정을 사용해서 노드를 시작할 때 사용된 --node-key에 의해 결정됨. 두 번째 노드를 시작할 때 이 노드를 연결하기 위해 이 문자열을 사용할 것

  • 2021-03-10 17:34:37 💤 Idle (0 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 0 ⬆ 0 : 네트워크에 다른 노드가 없고 어떤 블록도 생성되고 있지 않음을 나타냄. 블록 생성을 시작하기 전에 반드시 다른 노드가 참여해야만 함

노드 정보 보기 위해 프론트엔드 추가

Polkadot-JS application을 사용해 노드 동작을 보기 위해:

  1. 웹브라우저 열기

  2. Polkadot-JS Explorer로 가기

Polkadot-JS Explorer 링크는 로컬 노드에 연결하기 위해 rpc URL 인자를 사용

어떤 브라우저들은 로컬 노드에 연결하는 것을 막는 광고 차단 기능이 있음. 만약 로컬 노드에 연결하는 것에 문제가 있다면, 광고 차단이 활성화되어있는지 확인하고 비활성화 하거나 다른 브라우저에서 실행해보길!

  1. 상단 왼쪽 코너에 있는 네트워크 아이콘 클릭
  2. 사용가능한 네트워크 리스트에서 DEVELOPMENT 클릭
  3. 커스텀 엔드포인트가 로컬호스트와 WebSocket 트래픽 수신을 위해 명시한 포트번호로 설정되어 있는지 확인. 다른 네트워크, 노드, 엔드포인트에 연결할 때도 하나의 Polkadot-JS application을 사용할 수 있음

블록체인 네트워크에 두 번째 노드 추가

이제 alice 계정 키를 사용해서 시작한 노드가 작동하니까, bob 계정을 사용해 네트워크에 또다른 노드를 추가할 수 있음
이미 돌아가는 네트워크에 참여하기 때문에, 새로운 노드가 참여할 때 이 네트워크를 식별하는 데 돌아가는 노드를 사용할 수 있음.

돌아가는 블록체인에 노드를 추가하기 위해서:

  1. 터미널 열기

  2. Substrate node template을 컴파일한 루트 디렉토리로 가기

  3. 다음 커맨드로 이전 체인 데이터를 지우기

./target/release/node-template purge-chain --base-path /tmp/bob --chain local -y
  1. 다음 커맨드를 실행해서 bob계정을 사용해서 두 번째 로컬 블록체인 노드를 시작
./target/release/node-template \
--base-path /tmp/bob \
--chain local \
--bob \
--port 30334 \
--ws-port 9946 \
--rpc-port 9934 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp

이 커맨드와 앨리스 시작할 때 썼던 커맨드 사이의 차이점에 주목

  • 두 개의 노드가 하나의 같은 컴퓨터에서 돌아가기 때문에,--base-path, --port, --ws-port, --rpc-port 옵션에 다른 값을 명시해줘야 함

---bootnodes 옵션을 사용해 alice에 의해 시작된 노드를 하나의 부트 노드로 명시

--bootnodes 옵션은

  • ip4 : 이 노드의 IP주소가 IPv4형식
  • 127.0.0.1 : 돌아갈 노드의 IP 주소 명시(지금은 localhost)
  • tcp : peer-to-peer 소통을 위한 프로토콜
  • 30333 : peer-to-peer 소통을 위한 포트번호
  • 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp : 이 네트워크와 소통하기 위해 돌아가고 있는 노드를 식별함. 이 경우 alice 계정으로 시작한 노드의 식별자임

블록들이 생성되고 finalized되는 것 검증

After you start the second node, the nodes should connect to each other as peers and start producing blocks.

블록들이 finalized 되고 있는지 검증하기 위해:

  1. 첫번째 노드 터미널에 다음같은 줄이 뜨는지 확인:
2021-03-10 17:47:32  🔍 Discovered new external address for our node: /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
2021-03-10 17:47:32  🔍 Discovered new external address for our node: /ip4/<your computer's LAN IP>/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp
2021-03-10 17:47:33  💤 Idle (1 peers), best: #0 (0x9d07…7cce), finalized #0 (0x9d07…7cce), ⬇ 1.0kiB/s ⬆ 1.0kiB/s
2021-03-10 17:47:36  🙌 Starting consensus session on top of parent 0x9d07d1757a9ca248e58141ce52a11fca37f71007dec16650b87a853f0d4c7cce
2021-03-10 17:47:36  🎁 Prepared block for proposing at 1 [hash: 0x727826a5e6fba9a13af11422d4677b5f0743cc733c382232328e69fd307d1d2f; parent_hash: 0x9d07…7cce; extrinsics (1): [0x768a…a9e2]]
2021-03-10 17:47:36  🔖 Pre-sealed block for proposal at 1. Hash now 0x4841d8b2e62483fa4702b3ddcd1b603803842374dcdc1e9533ad407708b33dd8, previously 0x727826a5e6fba9a13af11422d4677b5f0743cc733c382232328e69fd307d1d2f.
2021-03-10 17:47:36  ✨ Imported #1 (0x4841…3dd8)
2021-03-10 17:47:36  ✨ Imported #1 (0xb241…2ae8)
2021-03-10 17:47:38  💤 Idle (1 peers), best: #1 (0x4841…3dd8), finalized #0 (0x9d07…7cce), ⬇ 0.8kiB/s ⬆ 0.8kiB/s
2021-03-10 17:47:42  ♻️  Reorg on #1,0x4841…3dd8 to #2,0x8b6a…dce6, common ancestor #0,0x9d07…7cce
2021-03-10 17:47:42  ✨ Imported #2 (0x8b6a…dce6)
2021-03-10 17:47:43  💤 Idle (1 peers), best: #2 (0x8b6a…dce6), finalized #0 (0x9d07…7cce), ⬇ 0.8kiB/s ⬆ 0.7kiB/s
2021-03-10 17:47:48  🙌 Starting consensus session on top of parent 0x8b6a3ab2fe9891b1af008ea0d92dae9bc84cfa5578231e81066d47928822dce6
2021-03-10 17:47:48  🎁 Prepared block for proposing at 3 [hash: 0xb887aef2097eff5869e38ccec0302bce372ad05ac2cdf9cc4725c38ec071fb7a; parent_hash: 0x8b6a…dce6; extrinsics (1): [0x82ac…2f20]]
2021-03-10 17:47:48  🔖 Pre-sealed block for proposal at 3. Hash now 0x34d608dd8be6b82bef4a7aaae1ec80930a5c4b8cf9bdc99013410e91544f3a2a, previously 0xb887aef2097eff5869e38ccec0302bce372ad05ac2cdf9cc4725c38ec071fb7a.
2021-03-10 17:47:48  ✨ Imported #3 (0x34d6…3a2a)
2021-03-10 17:47:48  💤 Idle (1 peers), best: #3 (0x34d6…3a2a), finalized #0 (0x9d07…7cce), ⬇ 0.7kiB/s ⬆ 0.8kiB/s
2021-03-10 17:47:53  💤 Idle (1 peers), best: #3 (0x34d6…3a2a), finalized #1 (0xb241…2ae8), ⬇ 0.6kiB/s ⬆ 0.7kiB/s
2021-03-10 17:47:54  ✨ Imported #4 (0x2b8a…fdc4)
2021-03-10 17:47:58  💤 Idle (1 peers), best: #4 (0x2b8a…fdc4), finalized #2 (0x8b6a…dce6), ⬇ 0.7kiB/s ⬆ 0.6kiB/s
  1. 두 번째 노드를 시작한 터미널에서도 비슷한 출력값이 나오는지 확인

  2. Polkadot-JS Explorer를 열고 네트워크가 블록 만들고 finalize 하는지 확인

  3. Control-c 눌러서 두 노드 다 멈추기


나만의 key 만들기

Key 생성 옵션

node-template 서브커맨드인 Subkey 를 사용해서 키 쌍을 만들거나 다른 키 생성 유틸리티를 사용할 수도 있음
여기에선 Substrate node template과 key 서브 커맨드를 사용해서 로컬에 키를 생성하는 방법을 다룰 것

노드 템플릿 사용해서 로컬 키 생성

프로덕션 블록체인에서는 키를 만들 때 한 번도 인터넷에 연결된 적이 없는 분리된 컴퓨터를 사용해야 하고, 최소한 자신이 컨트롤할 수 없는 퍼블릭 또는 프라이빅 블록체인에서 사용할 키를 생성하기 전엔 인터넷에 연결하지 말아야 함

근데 여기선 노드 템플릿의 key 서브커맨드를 사용해서 로컬에 랜덤 키를 생성할 거라 인터넷에 연결되어 있어도 됨

노드 템플릿으로 키 생성하기 위해:
1. 터미널 열기

  1. Substrate node template 컴파일한 루트 디렉토리로 가기

  2. 다음 커맨드 실행해서 랜덤 비밀 phrase와 키 생성

./target/release/node-template key generate --scheme Sr25519 --password-interactive
  1. 만든 키에 대한 비밀번호 입력

키를 생성하고 다음과 비슷한 출력값을 보여줘야 함

Secret phrase:  pig giraffe ceiling enter weird liar orange decline behind total despair fly
Secret seed:       0x0087016ebbdcf03d1b7b2ad9a958e14a43f2351cd42f2f0a973771b90fb0112f
Public key (hex):  0x1a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45
Account ID:        0x1a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45
Public key (SS58): 5CfBuoHDvZ4fd8jkLQicNL8tgjnK8pVG9AiuJrsNrRAx6CNW
SS58 Address:      5CfBuoHDvZ4fd8jkLQicNL8tgjnK8pVG9AiuJrsNrRAx6CNW

aura를 사용해 블록들을 생성하는 한 노드에 대한 Sr25519 키를 만든 것임. 위에서 계정에 대한 Sr25519 공개 키는

5CfBuoHDvZ4fd8jkLQicNL8tgjnK8pVG9AiuJrsNrRAx6CNW

  1. Ed25519 서명 방법을 사용해서 키를 만들어내기 위해 방금 생성한 계정의 비밀 구문을 사용
    다음과 같은 명령어 실행
./target/release/node-template key inspect --password-interactive --scheme Ed25519 "pig giraffe ceiling enter weird liar orange decline behind total despair fly"

5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN

  1. 키 만드는 데 썼던 비밀번호 입력
    다음과 비슷한 출력값 보일 것임
Secret phrase `pig giraffe ceiling enter weird liar orange decline behind total despair fly` is account:
Secret seed:       0x0087016ebbdcf03d1b7b2ad9a958e14a43f2351cd42f2f0a973771b90fb0112f
Public key (hex):  0x2577ba03f47cdbea161851d737e41200e471cd7a31a5c88242a527837efc1e7b
Public key (SS58): 5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN
Account ID:        0x2577ba03f47cdbea161851d737e41200e471cd7a31a5c88242a527837efc1e7b
SS58 Address:      5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN

이제 grandpa를 사용해 하나의 노드에 블록을 finalize하는 Ed25519 키를 생성한 것임. 여기서 Ed25519 공개 키는

5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN

두 번째 키 집합 생성

  • 미리 생성된 계정을 쓰거나
  • 방금 했던 거 한 번 더 해서 로컬에 두 개의 키 쌍 만들거나
  • 자식 키 쌍을 만들거나
  • 다른 참여자들을 모집해서
    두 개의 계정을 사용할 수 있음

이 튜토리얼에서 사용된 두 번째 키 쌍은 다음과 같음:

  • Sr25519: 5EJPj83tJuJtTVE2v7B9ehfM7jNT44CBFaPWicvBwYyUKBS6 for aura.
  • Ed25519: 5FeJQsfmbbJLTH1pvehBxrZrT5kHvJFj84ZaY5LK7NU87gZS for grandpa.

커스텀 체인 명세 만들기

블록체인에 사용할 키들을 생성했다면, 방금 만든 키들을 사용한 커스텀 체인 스펙을 만들고 이 커스텀 체인 스펙을 검증자라 불리는 신뢰받는 네트워크 참여자들에게 공유할 준비를 다 한 것임

다른 사람들을 네트워크의 참여자로 포함하고 싶으면, 그들이 자신만의 키를 가지고 있어야 하고, 그렇다면 로컬 체인 스펙을 대체할 커스텀 체인 스펙을 만들 수 있음

존재하는 체인 명세 수정하기

이전에는 노드들을 블록체인에 추가할 때 --chain local 옵션으로 로컬 체인 명세를 사용했었음
완전히 새로운 체인 명세를 사용하기보단, 기존에 사용했던 것을 수정할 것임

  1. 터미널 창 열기
  2. Substrate node template 컴파일한 디렉토리로 가기
  3. 다음 커맨드 실행해서 로컬 체인 스펙을 customSpec.json 이라는 이름으로 export하기
./target/release/node-template build-spec --disable-default-bootnode --chain local > customSpec.json

텍스트 에디터로 customSpec.json 파일을 열면, cargo build --release 커맨드를 사용해 만들었던 런타임을 위한 Wasm 바이너리를 다음 큰 블롭들을 포함한 여러 필드들을 볼 수 있을 것임
전체 파일을 보기보단, 처음과 마지막의 몇 줄에서만 바꿔야 하는 몇몇 필드들을 보겠음

  1. 다음 커맨드로 customSpec.json 파일의 첫 번째 몇 필드들을 미리보기
head customSpec.json

출력값:

{
  "name": "Local Testnet",
  "id": "local_testnet",
  "chainType": "Local",
  "bootNodes": [],
  "telemetryEndpoints": null,
  "protocolId": null,
  "properties": null,
  "consensusEngine": null,
  "codeSubstitutes": {},
  1. 다음 커맨드로 customSpec.json 파일의 마지막 몇 필드들을 미리보기
tail -n 80 customSpec.json

런타임에 사용되는 sudobalances 팔레트같은 여러 팔레트들의 디테일을 포함한 wasm 바이너리 필드들이 보일 것임

  1. 텍스트 에디터로 customSpec.json 파일 열기

  2. 이 체인 스펙이 커스텀 체인 스펙이라는 걸 식별하기 위해 name 필드를 수정

"name": "My Custom Testnet",
  1. 각 네트워크 참여자의 Sr25519 SS58 주소 키들을 추가함으로써 노드들의 블록 생성 권한을 명시하기 위해 aura 필드 수정
"aura": {
    "authorities": [
      "5CfBuoHDvZ4fd8jkLQicNL8tgjnK8pVG9AiuJrsNrRAx6CNW",
      "5EJPj83tJuJtTVE2v7B9ehfM7jNT44CBFaPWicvBwYyUKBS6"
    ]
  },
  1. 각 네트워크 참여자의 Ed25519 SS58 주소 키들을 추가함으로써 노드들의 블록 finalize 권한을 명시하기 위해 grandpa 필드 수정
"grandpa": {
    "authorities": [
      [
        "5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN",
        1
      ],
      [
        "5FeJQsfmbbJLTH1pvehBxrZrT5kHvJFj84ZaY5LK7NU87gZS",
        1
      ]
    ]
  },

grandpa에는 authorities 필드에 두 개의 데이터 값이 있다는 것에 주목.
첫 번째 값은 주소 키. 두 번째 값은 weighted votes 를 지원하는 데 사용되는 값. 여기서 각 검증자는 1투표의 무게를 가짐

  1. 바꾼 거 저장파고 파일 닫기

검증자 추가

auragrandpa 부분을 수정하면 체인 스펙에서 권한 주소들을 추가하거나 바꿀 수 있음
원하는 만큼 많은 검증자들을 추가하기 위해 이렇게 할 것임

  • auraSr25519 주소들을 포함하도록 수정

  • grandpaEd25519 주소들과 투표 무게를 포함하도록 수정

각 검증자에 고유한 키를 사용해야 함. 만약 같은 키를 사용하면, 충돌 나는 블록 생성할 것임

raw 형식을 사용해서 체인 명세 바꾸기

체인 스펙 준비한 다음, 사용하기 전에 raw 스펙으로 바꿔어야 함 raw 체인 스펙은 그냥 체인 스펙과 같은 정보뿐만 아니라 이 노드가 로컬 스토리지에 갖고 있는 데이터를 참조하기 위해 사용하는 스토리지 키를 인코딩한 것을 가지고 있음
raw 체인 스펙을 배포해야 각 노드가 적절한 스토리지 키를 사용해 데이터를 저장한다는 것을 확신할 수 있음

  1. 터미널 창 열기

  2. Substrate node template을 컴파일한 곳으로 가기

  3. 다음 커맨드를 실행해 customSpec.json 체인 스펙을 customSpecRaw.json 라는 이름의 raw 형식으로 바꾸기

./target/release/node-template build-spec --chain=customSpec.json --raw --disable-default-bootnode > customSpecRaw.json

다른 사람들과 체인 명세 공유하기

다른 참여다즐에게 공유한 프라이빗 블록체인 네트워크를 만든다면 도직 한 사람만 체인 스펙을 만들고 그 스펙의 raw 버전을 공유하도록 확신해야 함 모두가 똑같은 raw 파일을 사용해야 한다는 뜻

러스트 컴파일러가 결정적으로 재생산가능하지 않은 최적화된 웹어셈블리 바이너리를 만들기 때문에, wasm 런타임을 만드는 각 사람들ㅇ르 약간 다른 wasm 블롭을 갖고 있음. 결정적임을 확신하기 위해, 모든 블록체인 네트워크 참여자들을 반드시 같은 raw 체인 스펙을 사용해야만 함


private network 시작하기

After you distribute the custom chain specification to all network participants, you're ready to launch your own private blockchain. The steps are similar to the steps you followed in Start the blockchain using predefined accounts. If you follow the steps in this tutorial, however, you can add multiple computers to your network.

To continue, verify the following:

  • You have generated or collected the account keys for at least two authority accounts.
  • You have updated your custom chain specification to include the keys for block production (aura) and block finalization (grandpa).
  • You have converted your custom chain specification to raw format and distributed the raw chain specification to the nodes participating in the private network.

If you have completed these steps, you are ready to start the first node in the private blockchain.

첫 번째 노드 시작

프라이빗 블록체인 네트워크의 첫 번째 참여자로서, bootnode라 불리는 첫 번째 노드를 시작할 책임이 있음

  1. 터미널을 열고

  2. Substrate node template을 컴파일한 디렉토리로 가기

  3. 다음과 같은 커맨드를 실해앻서 커스텀 체인 스펙으로 첫 번째 노드 시작하기

./target/release/node-template \
--base-path /tmp/node01 \
--chain ./customSpecRaw.json \
--port 30333 \
--ws-port 9945 \
--rpc-port 9933 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--rpc-methods Unsafe \
--name MyNode01
  • --base-path : 첫 번째 노드와 연관된 커스텀 위치 명시
  • --chain : 커스텀 체인 스펙 명시
  • --rpc-methods Unsafe : 이 블록체인이 프로덕션 세팅을 사용하지 않고 있기 때문에 안전하지 않은 커뮤니케이션 모드를 사용할 수 있도록 해줌
  • --name : telemetry UI에 사람이 읽을 수 있는 이름을 붙이기 위한 옵션

미리 정의된 계정을 사용하지 않고 있기 때문에 별도로 지금 사용하고 있는 키를 키스토어에 추가해야 함

노드 작동에 대한 정보 보기

로컬 노드 시작하면 수행 중인 동작에 대해 터미널에 로그가 뜰 것임

  • (state: 0x2bde…8f66, header-hash: 0x6c78…37de) : 제네시스 블록이 초기화되고 있음
  • 12D3KooWLmrYDLoNTyTYtRdDyZLWDe1paxzxTw5RgjmHLfzW96SX : 로컬 노드 신원을 명시
  • 이 노드에 사용된 IP address 가 로컬 호스트 127.0.0.1임을 명시

keystore에 key 추가

첫 번째 노드를 시작해도 어떤 블록들도 아직 생성되지 않고 있다.
다음으로 네트워크에 각 노드의 두 가지 탑입의 키들을 키스토어에 추가할 것이다.

각 노드에 대해:

블록 생성을 가능하게 하기 위해 aura 권한 키 추가
블록 finalize를 가능하게 하기 위해 grandpa 권한 키 추가

키를 키스토어에 추가하기 위해 로컬에서 생성한 비밀 키를 삽입하는 key 서브커맨드 사용할 수 있음

  1. 터미널 열고

  2. Substrate node template 컴파일한 디렉토리로 가서

  3. 다음과 비슷한 커맨드로 kye 서브커맨드로 생성된 비밀 키를 aura에 추가

./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Sr25519 \
--suri <your-secret-seed> \
--password-interactive \
--key-type aura

<your-secret-seed> 를 노드 템플릿을 사용해 생성한 첫 번째 키 페어의 비밀 구문이나 비밀 시드로 교체

  1. 키 만들 때 썼던 비밀번호 입력

  2. 다음 커맨드를 실행해서 key 서브커맨드로 만든 grandpa 비밀 키 추가

./target/release/node-template key insert --base-path /tmp/node01 \
--chain customSpecRaw.json \
--scheme Ed25519 \
--suri <your-secret-key> \
--password-interactive \
--key-type gran
  1. 키 만들 때 쓴 비밀번호 입력

  2. 다음 커맨드로 node01의 키가 키스토어에 있는지 확인

ls /tmp/node01/chains/local_testnet/keystore

다음과 비슷한 출력 보여줄 것임

617572611441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
6772616e1441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04

다른 참여자들을 참가하게 해주기

--bootnodes--validator 옵션으로 다른 검증자들이 네트워크에 참여할 수 있게 해줄 수 있음

프라이빗 네트워크에서 두 번째 검증자를 추가하기 위해:

  1. 터미널 열고

  2. Substrate node template 컴파일한 디렉토리로 가서

  3. 다음 커맨드로 두 번째 블록체인 노드 시작:

./target/release/node-template \
--base-path /tmp/node02 \
--chain ./customSpecRaw.json \
--port 30334 \
--ws-port 9946 \
--rpc-port 9934 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--rpc-methods Unsafe \
--name MyNode02 \
--bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWLmrYDLoNTyTYtRdDyZLWDe1paxzxTw5RgjmHLfzW96SX \
--password-interactive

커맨드에 올바른bootnode 식별자를 썼는지 확인

이 노드가 그 프라이빗 네트워크의 검증자란 것을 명시하기 위해 base-path, name ,validator 옵션을 사용했다는 것 주목
그리고 모든 검증자들은 반드시 동일한 체인 스펙을 사용해야 함

  1. 다음과 같은 커맨드 실행해서 key 로 만들어낸 비밀 키 aura에 추가:
./target/release/node-template key insert --base-path /tmp/node02 \
--chain customSpecRaw.json \
--scheme Sr25519 \
--suri <second-participant-secret-seed> \
--password-interactive \
--key-type aura

<second-participant-secret-seed>를 두 번째 키 쌍을 만들 때 얻은 비밀 구문이나 비밀 시드로 교체
aura 키 타입은 블록 생성을 위해 필요함

  1. 이 키를 만들 때 쓴 비번 입력

  2. 다음과 같은 커맨드 실행해서 key 로 만들어낸 비밀 키를 로컬 키스토어에 저장하도록 grandpa에 추가:

./target/release/node-template key insert --base-path /tmp/node02 \
--chain customSpecRaw.json \
--scheme Ed25519 \
--suri <second-participant-secret-seed> \
--password-interactive \
--key-type gran

<second-participant-secret-seed>를 두 번째 키 페어를 생성할 때 얻은 비밀 구문이나 비밀 시드로 교체. gran 키 타입은 블록 finalize에 필요함

블록 finalizatiion은 각 노드의 키스토어에 그들의 키를 추가하기 위해 최소한 2/3 만큼의 검증자가 필요함
체인 스펙에서 두 명의 검증자로 설정되었기 때문에, 블록 finalization은 두 번째 노드가 키를 추가한 다음에 시작됨

  1. 키를 만들 때 사용한 비번 입력

  2. 다음 커맨드로 node02의 키가 키스토어에 있는지 확인:

ls /tmp/node02/chains/local_testnet/keystore

다음과 비슷한 출력값 확인:

617572611a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45
6772616e1a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45

grandpa 키를 추가한 다음에 Substrate 노드를 재시작해줘야 하므로 블록들이 finalized되는 것을 보기 전에 반드시 껐다가 재시작해줘야 함

  1. Control-c 눌러서 끄고

  2. 다음 커맨드로 두 번째 노드 재시작:

./target/release/node-template \
--base-path /tmp/node02 \
--chain ./customSpecRaw.json \
--port 30334 \
--ws-port 9946 \
--rpc-port 9934 \
--telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \
--validator \
--rpc-methods Unsafe \
--name MyNode02 \
--bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWLmrYDLoNTyTYtRdDyZLWDe1paxzxTw5RgjmHLfzW96SX \
--password-interactive

/tmp/node01/tmp/node02에 있는 각각의 키스토어에 두 노드의 키를 모두 추가한 후에 재시작하면, 같은 제네시스 블록과 상태 루트 해시를 볼 수 있을 것임

그리고 각 노드는 하나의 피어를 가지고 (1 peers), 블록 제안을 하고(best: #2 (0xe111…c084)), 몇 초 뒤에 새 블록이 두 개의 노드에서 모두 finalized되는 것을 확인할 수 있음


다음 단계

지금까지 신뢰하는 참여자들로 프라이빗 블록체인을 시작하는 법을 배웠음

  • 어떻게 동료 블록체인 노드를 시작하고 멈추는지
  • 나만의 비밀 키 쌍을 어떻게 만드는지
  • 내가 생성한 키들을 사용하는 커스텀 체인 스펙을 어떻게 만드는지
  • 나의 커스텀 체인 스펙을 사용하는 프라이빗 네트워크에 어떻게 검증자를 추가하는지

더 알아보면 좋을 것들:

  • Executor - 체인 스펙에 대한 중요한 컴포넌트인 웹 어셈블리 런타임에 대한 정보
  • Accounts, Key management - 키 생성과 스토리지 옵션에 대한 정보
  • Cryptography : 다른 키를 사용해서 서명하는 방법에 대한 정보
profile
풀스택 웹개발자👩‍💻✨️

0개의 댓글