# 서비스체인의 SCN (Servicechain Consensus Node)을 추가하는 방법

**URL:** <https://devforum.kaia.io/t/scn-servicechain-consensus-node/98>\
**Category:** Kaia\
**Created:** [2월 28, 2020, 2:35오전 UTC](https://devforum.kaia.io/t/scn-servicechain-consensus-node/98 "2020-02-28T02:35:42Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ethan](https://yyz1.discourse-cdn.com/flex035/user_avatar/devforum.kaia.io/ethan/32/18_2.png) [@Ethan](https://devforum.kaia.io/u/Ethan)\
**Post date:** [2월 28, 2020, 2:35오전 UTC](https://devforum.kaia.io/t/scn-servicechain-consensus-node/98/1 "2020-02-28T02:35:42Z")

</div>

서비스체인을 운영하시다 보면 SCN (Servicechiain Consensus Node)를 추가/삭제를 하고 싶은 경우가 있습니다. 서비스체인은 BFT 합의 알고리즘을 사용합니다만 처음 추가하였던 노드가 노드의 추가/삭제 권한이 있습니다. 그렇기 때문에 아래와 같은 과정을 통해서 노드 추가가 가능합니다.

만약 여러개의 노드를 추가 하고 싶다면 아래의 방법을 원하는 노드의 갯수만큼 반복을 하면 됩니다.

## 신규 Consensus 추가 방법

### 1. 새롭게 node를 추가하기위해서는 신규 node의 nodekey 생성해야합니다.

- kgen을 이용한 nodekey 생성하여 node의 address와 nodekey file을 확인 할 수 있습니다.

```auto
> kgen --file
Created : keys/nodekey
Created : keys/node_info.json

> cat keys/nodekey
99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2%                                                                                                                                   

> cat keys/node_info.json
{
	"Address": "0xb2221f2acd44fef464040434249fd732c4766691",
	"Nodekey": "99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2",
	"NodeInfo": "kni://f4d08c8a8d4b9f55310648619429a293664dba405321b08ab91d2551c48133295a103b1b547778b39bf03cd0bb1b77826741707c518a6e7f6c3155478cbf1f85@0.0.0.0:32323?discport=0"
}% 

```

### 2. validator 추가

- Servicechain의 경우 single governancemode로서 첫번째 노드가 governance기능을 담당하게 됩니다.
- RPC/IPC등으로 attach 하여 아래 명령을 통해 신규 node를 validator에 추가 할 수 있습니다.  
이때 주소값은 조금전 kgen으로 생성한 nodekey의 Address값 입니다.  
그리고 아래 명령어를 통해 확인 가능합니다.

```auto
> governance.vote("governance.addvalidator","0xb2221f2acd44fef464040434249fd732c4766691")
"Your vote was successfully placed."

> istanbul.getValidators()
["0x8dbf4f0b1785e93c103a9735dc3e1cbf3b5fcb04", "0xb2221f2acd44fef464040434249fd732c4766691"]

```

- validator를 추가하고 SCN0의 log를 확인하면 추가된 노드가 Block 생성을 하지 않고 있기 때문에 round change가 발생하며 신규 block을 생성하지 못합니다.

### 3. 신규 Node의 실행

- 신규 Node를 위한 /data directory를 생성하여 SCN0의 /data를 복사하여 chain data를 가져옵니다.
- 이후 /data/klay/nodekey 파일을 1에서 생성한 nodekey로 변경합니다.
- 그리고 신규 노드를 실행합니다.

### 4. 신규 Node의 연결

#### 새롭게 node를 추가하기위해서는 신규 node의 nodekey 생성해야합니다.

- kgen을 이용한 nodekey 생성하여 node의 address와 nodekey file을 확인 할 수 있습니다.

```auto
> kgen --file
Created : keys/nodekey
Created : keys/node_info.json

> cat keys/nodekey
99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2%                                                                                                                                   

> cat keys/node_info.json
{
	"Address": "0xb2221f2acd44fef464040434249fd732c4766691",
	"Nodekey": "99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2",
	"NodeInfo": "kni://f4d08c8a8d4b9f55310648619429a293664dba405321b08ab91d2551c48133295a103b1b547778b39bf03cd0bb1b77826741707c518a6e7f6c3155478cbf1f85@0.0.0.0:32323?discport=0"
}%

```

#### validator 추가

- Servicechain의 경우 single governancemode로서 첫번째 노드가 governance기능을 담당하게 됩니다.
- RPC/IPC등으로 attach 하여 아래 명령을 통해 신규 node를 validator에 추가 할 수 있습니다.  
이때 주소값은 조금전 kgen으로 생성한 nodekey의 Address값 입니다.

```auto
> governance.vote("governance.addvalidator","0xb2221f2acd44fef464040434249fd732c4766691")
"Your vote was successfully placed."

```

- 그리고 아래 명령어를 통해 확인 가능합니다.

```auto
> istanbul.getValidators()
["0x8dbf4f0b1785e93c103a9735dc3e1cbf3b5fcb04", "0xb2221f2acd44fef464040434249fd732c4766691"]

```

- validator를 추가하고 SCN0의 log를 확인하면 추가된 노드가 Block 생성을 하지 않고 있기 때문에 round change가 발생하며 신규 block을 생성하지 못합니다.

- 신규 Node의 실행

- 신규 Node의 연결 : 이제 기존 노드와 신규 노드를 연결 합니다.

```auto
> admin.nodeInfo
{
  id: "cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6",
  ip: "0.0.0.0",
  kni: "kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@0.0.0.0:0",
  listenAddr: ":12323",
  ...
}

```

- 신규 노드에서 기존 노드로 연결 요청

```auto
> admin.addPeer("kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@localhost:12323")

```

### 6. 자동연결

static-nodes.json파일을 작성하여 모든 노드의 /data 디렉토리에 추가하여 자동연결이 가능하도록 합니다. 이 파일을 최초 노드 start시 load하기 때문에 변경한 이후에는 노드를 재시작해야합니다.

```auto
> cat > static-nodes.json
[
	"kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@localhost:12323",
	"kni://6f9f01b5498ad86ea79f3268df6d4530e912837ca186d11c8510b46ce0e43ddd0ca5b69eeaf7b1b8857ab08dbd3b1d676229f2a9262f91df87940e0ebe92df94@localhost:22323",
	"kni://f2e968783b786328a5cf2612191a446984b06f164644385a3dc119a87786070cdfb5d8d5ad797e64e97bf02aabfb7d2f400093bbb9180fcdac4b2eba5cefc589@localhost:32323",
	"kni://af752bb67191a8ece929d515e5cffd3440254e3496a28a57cfa46ca5e2b7af559c14cd81baa050f945963b5f79749828723123529298dd92dda02cb8b923a1e3@localhost:42323"
]
^Z
[1] + 19704 suspended cat > static-nodes.json

```

### 7. 블록 생성 확인

신규 노드를 기존 노드와 연결을 시킨다면 새롭게 블럭을 생성하는 것을 확인 가능합니다.

## FAQ

- 신규 노드가 연결이 되지 않습니다.
  - node가 validatorSet에 추가 되지 않았다면 해당 노드는 연결이 거부됩니다.

- validator의 갯수에 따라서 HA가 되는 기준이 무엇인지요?
  - 1 ~ 3개의 validator의 경우에는 1개 라도 연결이 안된경우에는 추가 블록 생성이 안됩니다.
  - 4 (N)개 이상의 validator가 등록된 경우 F개의 장애 노드가 있더라도 블록생성은 유지합니다. F = (N - 1)/2
    - 다만 N개가 순차적으로 proposer가 되는데 장애노드가 proposer가 된 시점에는 3초후 round change가 발생되며 proposer가 변경되어 진행되게 됩니다.
