이 튜토리얼은 권한을 가진 private validator들이 있는 작고 독립적인 블록체인 네트워크를 시작하는 방법을 다룸
모든 블록체인은 성공적으로 블록을 만들고 다음 블록으로 넘어가기 위해 네트워크의 모든 노드들이 메시지와 그 메시지들의 순서에 합의해야 함
각 블록은 특정 시점의 데이터 상태를 나타내고 그 상태에 대한 노드들의 동의를 합의라고 함
합의에 도달하기 위해 여러 알고리즘들이 사용됨:
Substrate 노드 템플릿은 PoA를 사용하고 이를 authority round 또는 Aura합의라고 부름
Aura 합의 프로토콜은 round-robin 방식으로 블록을 생성하는 권한 있는 계정 리스트-authorities-에서 순환하도록 블록 생성을 제한함
*round robin : 프로세스들 사이에 우선순위를 두지 않고, 순서대로 할당
이 튜토리얼에서 실제로 이 합의 모델이 어떻게 작동하는지 알아볼 텐데, 먼저 노드 템플릿에 미리 정의된 계정들을 사용한 다음 인증된 집합에 새로운 권한을 추가해볼 것임
private Substrate 네트워크를 시작하기 위해 key를 생성하기 전,local
이라 불리는 미리 정의된 네트워크 명세를 사용해서 근본 원리를 배우고 미리 정의된 사용자 계정으로 실행해볼 수 있음
여기에서는 하나의 로컬 컴퓨터에서 alice
와 bob
이라는 미리 정의된 계정들을 사용해서 두 개의 Substrate 노드들을 실행시킴으로써 private network를 시뮬레이션 할 것임
터미널 열기
Substrate node template을 컴파일한 루트 디렉토리로 가기
다음 명령어를 실행해서 이전 체인 데이터 버리기
./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]:
y
입력새 네트워크 시작할 땐 이전 체인 데이터 항상 지워야 함
./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을 사용해 노드 동작을 보기 위해:
웹브라우저 열기
Polkadot-JS Explorer로 가기
Polkadot-JS Explorer 링크는 로컬 노드에 연결하기 위해 rpc
URL 인자를 사용
어떤 브라우저들은 로컬 노드에 연결하는 것을 막는 광고 차단 기능이 있음. 만약 로컬 노드에 연결하는 것에 문제가 있다면, 광고 차단이 활성화되어있는지 확인하고 비활성화 하거나 다른 브라우저에서 실행해보길!
이제 alice
계정 키를 사용해서 시작한 노드가 작동하니까, bob
계정을 사용해 네트워크에 또다른 노드를 추가할 수 있음
이미 돌아가는 네트워크에 참여하기 때문에, 새로운 노드가 참여할 때 이 네트워크를 식별하는 데 돌아가는 노드를 사용할 수 있음.
돌아가는 블록체인에 노드를 추가하기 위해서:
새 터미널 열기
Substrate node template을 컴파일한 루트 디렉토리로 가기
다음 커맨드로 이전 체인 데이터를 지우기
./target/release/node-template purge-chain --base-path /tmp/bob --chain local -y
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
계정으로 시작한 노드의 식별자임After you start the second node, the nodes should connect to each other as peers and start producing blocks.
블록들이 finalized 되고 있는지 검증하기 위해:
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
두 번째 노드를 시작한 터미널에서도 비슷한 출력값이 나오는지 확인
Polkadot-JS Explorer를 열고 네트워크가 블록 만들고 finalize 하는지 확인
Control-c 눌러서 두 노드 다 멈추기
node-template
서브커맨드인 Subkey 를 사용해서 키 쌍을 만들거나 다른 키 생성 유틸리티를 사용할 수도 있음
여기에선 Substrate node template과 key
서브 커맨드를 사용해서 로컬에 키를 생성하는 방법을 다룰 것
프로덕션 블록체인에서는 키를 만들 때 한 번도 인터넷에 연결된 적이 없는 분리된 컴퓨터를 사용해야 하고, 최소한 자신이 컨트롤할 수 없는 퍼블릭 또는 프라이빅 블록체인에서 사용할 키를 생성하기 전엔 인터넷에 연결하지 말아야 함
근데 여기선 노드 템플릿의 key
서브커맨드를 사용해서 로컬에 랜덤 키를 생성할 거라 인터넷에 연결되어 있어도 됨
노드 템플릿으로 키 생성하기 위해:
1. 터미널 열기
Substrate node template 컴파일한 루트 디렉토리로 가기
다음 커맨드 실행해서 랜덤 비밀 phrase와 키 생성
./target/release/node-template key generate --scheme Sr25519 --password-interactive
키를 생성하고 다음과 비슷한 출력값을 보여줘야 함
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
임
./target/release/node-template key inspect --password-interactive --scheme Ed25519 "pig giraffe ceiling enter weird liar orange decline behind total despair fly"
5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN
임
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
임
이 튜토리얼에서 사용된 두 번째 키 쌍은 다음과 같음:
aura
.grandpa
.블록체인에 사용할 키들을 생성했다면, 방금 만든 키들을 사용한 커스텀 체인 스펙을 만들고 이 커스텀 체인 스펙을 검증자라 불리는 신뢰받는 네트워크 참여자들에게 공유할 준비를 다 한 것임
다른 사람들을 네트워크의 참여자로 포함하고 싶으면, 그들이 자신만의 키를 가지고 있어야 하고, 그렇다면 로컬
체인 스펙을 대체할 커스텀 체인 스펙을 만들 수 있음
이전에는 노드들을 블록체인에 추가할 때 --chain local
옵션으로 로컬
체인 명세를 사용했었음
완전히 새로운 체인 명세를 사용하기보단, 기존에 사용했던 것을 수정할 것임
customSpec.json
이라는 이름으로 export하기./target/release/node-template build-spec --disable-default-bootnode --chain local > customSpec.json
텍스트 에디터로 customSpec.json
파일을 열면, cargo build --release
커맨드를 사용해 만들었던 런타임을 위한 Wasm 바이너리를 다음 큰 블롭들을 포함한 여러 필드들을 볼 수 있을 것임
전체 파일을 보기보단, 처음과 마지막의 몇 줄에서만 바꿔야 하는 몇몇 필드들을 보겠음
customSpec.json
파일의 첫 번째 몇 필드들을 미리보기head customSpec.json
출력값:
{
"name": "Local Testnet",
"id": "local_testnet",
"chainType": "Local",
"bootNodes": [],
"telemetryEndpoints": null,
"protocolId": null,
"properties": null,
"consensusEngine": null,
"codeSubstitutes": {},
customSpec.json
파일의 마지막 몇 필드들을 미리보기tail -n 80 customSpec.json
런타임에 사용되는 sudo
와 balances
팔레트같은 여러 팔레트들의 디테일을 포함한 wasm 바이너리 필드들이 보일 것임
텍스트 에디터로 customSpec.json
파일 열기
이 체인 스펙이 커스텀 체인 스펙이라는 걸 식별하기 위해 name
필드를 수정
"name": "My Custom Testnet",
aura
필드 수정"aura": {
"authorities": [
"5CfBuoHDvZ4fd8jkLQicNL8tgjnK8pVG9AiuJrsNrRAx6CNW",
"5EJPj83tJuJtTVE2v7B9ehfM7jNT44CBFaPWicvBwYyUKBS6"
]
},
grandpa
필드 수정"grandpa": {
"authorities": [
[
"5CuqCGfwqhjGzSqz5mnq36tMe651mU9Ji8xQ4JRuUTvPcjVN",
1
],
[
"5FeJQsfmbbJLTH1pvehBxrZrT5kHvJFj84ZaY5LK7NU87gZS",
1
]
]
},
grandpa
에는 authorities
필드에 두 개의 데이터 값이 있다는 것에 주목.
첫 번째 값은 주소 키. 두 번째 값은 weighted votes 를 지원하는 데 사용되는 값. 여기서 각 검증자는 1투표의 무게를 가짐
aura
와 grandpa
부분을 수정하면 체인 스펙에서 권한 주소들을 추가하거나 바꿀 수 있음
원하는 만큼 많은 검증자들을 추가하기 위해 이렇게 할 것임
aura
에 Sr25519 주소들을 포함하도록 수정
grandpa
에 Ed25519 주소들과 투표 무게를 포함하도록 수정
각 검증자에 고유한 키를 사용해야 함. 만약 같은 키를 사용하면, 충돌 나는 블록 생성할 것임
체인 스펙 준비한 다음, 사용하기 전에 raw 스펙으로 바꿔어야 함 raw 체인 스펙은 그냥 체인 스펙과 같은 정보뿐만 아니라 이 노드가 로컬 스토리지에 갖고 있는 데이터를 참조하기 위해 사용하는 스토리지 키를 인코딩한 것을 가지고 있음
raw 체인 스펙을 배포해야 각 노드가 적절한 스토리지 키를 사용해 데이터를 저장한다는 것을 확신할 수 있음
터미널 창 열기
Substrate node template을 컴파일한 곳으로 가기
다음 커맨드를 실행해 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 체인 스펙을 사용해야만 함
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:
aura
) and block finalization (grandpa
).If you have completed these steps, you are ready to start the first node in the private blockchain.
프라이빗 블록체인 네트워크의 첫 번째 참여자로서, bootnode라 불리는 첫 번째 노드를 시작할 책임이 있음
터미널을 열고
Substrate node template을 컴파일한 디렉토리로 가기
다음과 같은 커맨드를 실해앻서 커스텀 체인 스펙으로 첫 번째 노드 시작하기
./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
: 로컬 노드 신원을 명시127.0.0.1
임을 명시첫 번째 노드를 시작해도 어떤 블록들도 아직 생성되지 않고 있다.
다음으로 네트워크에 각 노드의 두 가지 탑입의 키들을 키스토어에 추가할 것이다.
각 노드에 대해:
블록 생성을 가능하게 하기 위해 aura
권한 키 추가
블록 finalize를 가능하게 하기 위해 grandpa
권한 키 추가
키를 키스토어에 추가하기 위해 로컬에서 생성한 비밀 키를 삽입하는 key
서브커맨드 사용할 수 있음
터미널 열고
Substrate node template 컴파일한 디렉토리로 가서
다음과 비슷한 커맨드로 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>
를 노드 템플릿을 사용해 생성한 첫 번째 키 페어의 비밀 구문이나 비밀 시드로 교체
키 만들 때 썼던 비밀번호 입력
다음 커맨드를 실행해서 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
키 만들 때 쓴 비밀번호 입력
다음 커맨드로 node01
의 키가 키스토어에 있는지 확인
ls /tmp/node01/chains/local_testnet/keystore
다음과 비슷한 출력 보여줄 것임
617572611441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
6772616e1441ddcb22724420b87ee295c6d47c5adff0ce598c87d3c749b776ba9a647f04
--bootnodes
와 --validator
옵션으로 다른 검증자들이 네트워크에 참여할 수 있게 해줄 수 있음
프라이빗 네트워크에서 두 번째 검증자를 추가하기 위해:
터미널 열고
Substrate node template 컴파일한 디렉토리로 가서
다음 커맨드로 두 번째 블록체인 노드 시작:
./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
옵션을 사용했다는 것 주목
그리고 모든 검증자들은 반드시 동일한 체인 스펙을 사용해야 함
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 키 타입은 블록 생성을 위해 필요함
이 키를 만들 때 쓴 비번 입력
다음과 같은 커맨드 실행해서 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은 두 번째 노드가 키를 추가한 다음에 시작됨
키를 만들 때 사용한 비번 입력
다음 커맨드로 node02
의 키가 키스토어에 있는지 확인:
ls /tmp/node02/chains/local_testnet/keystore
다음과 비슷한 출력값 확인:
617572611a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45
6772616e1a4cc824f6585859851f818e71ac63cf6fdc81018189809814677b2a4699cf45
grandpa
키를 추가한 다음에 Substrate 노드를 재시작해줘야 하므로 블록들이 finalized되는 것을 보기 전에 반드시 껐다가 재시작해줘야 함
Control-c 눌러서 끄고
다음 커맨드로 두 번째 노드 재시작:
./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되는 것을 확인할 수 있음
지금까지 신뢰하는 참여자들로 프라이빗 블록체인을 시작하는 법을 배웠음
더 알아보면 좋을 것들: