QBFT 네트워크 기반 하이퍼레저 비수 구축
하이퍼레저 비수 설치
1
cd /usr/local/bin && wget https://hyperledger.jfrog.io/hyperledger/besu-binaries/besu/22.10.0/besu-22.10.0.tar.gz
하이퍼레저 압축 풀기
1
tar -zxvf besu-22.10.0.tar.gz
하이퍼레저 비수 환경설정
1
echo export PATH=${PATH}:/usr/local/bin/besu-22.10.0/bin >> ~/.bashrc && source ~/.bashrc
정상 설치 확인
디렉토리 구성
1
mkdir -p /QBFT-Network/{Node-1,Node-2,Node-3,Node-4}/data && cd /QBFT-Network
노드 키쌍 생성
1
2
3
4
5
6
7
8
9
echo '{
"blockchain": {
"nodes": {
"generate": true,
"count": 4
}
}
}
' | jq '.' >> config.json
1
besu operator generate-blockchain-config --config-file=config.json --to=keyPairs --private-key-file-name=key
에러는 무시해도 된다 현재 노드 키쌍만 생성하는 명령어가 존재하지않아 이러한 방법으로 키쌍 생성 진행하였음.
키쌍 각 노드에 배치
아래의 이미지와 같이 최종적으로 작업 진행하면 된다.
각 노드 계정(Address) 파일 생성
1
2
3
4
5
6
7
besu public-key export-address --node-private-key-file=Node-1/data/key --to=Node-1/data/account
besu public-key export-address --node-private-key-file=Node-2/data/key --to=Node-2/data/account
besu public-key export-address --node-private-key-file=Node-3/data/key --to=Node-3/data/account
besu public-key export-address --node-private-key-file=Node-4/data/key --to=Node-4/data/account
Extra Data 파일 생성
1
2
3
4
5
6
jq --null-input \
--arg node1 $(cat Node-1/data/account) \
--arg node2 $(cat Node-2/data/account) \
--arg node3 $(cat Node-3/data/account) \
--arg node4 $(cat Node-4/data/account) \
'[$node1, $node2, $node3, $node4]' >> extra_config.json
Extra Data RLP 인코딩 이더리움 네트워크에서 노드에 데이터 구조를 저장하거나, 혹은 노드끼리 데이터 구조를 주고 받으려면 통일된 형식이 필요하며, 이더리움에서는 RLP 인코딩 방식을 선택한것이다.1
출력된 RLP인코딩 값 가지고 있다 제네시스에 설정해야한다.
1
besu rlp encode --from=extra_config.json --type=QBFT_EXTRA_DATA
제네시스 파일 구성
1
vi /QBFT-Network/genesis.json
블록체인의 첫 번째 블록을 제네시스 블록이라고 하며, 제네시스 파일은 블록체인 자체에 대한 규칙뿐만 아니라 블록체인의 첫 번째 블록에 있는 데이터를 정의한다. 또 프라이빗이나 퍼블릭 상관없이 새로운 노드가 참가하게 되면 이 제네시스 블록이 새로 생성된다.2
alloc필드 내부에 있는 속성들 수정 진행 해야하며, 앞에서 생성한 계정 및 개인키에 보면 prefix로 0x가 붙어있는데 제거해서 수정 진행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
"config" : {
"chainId" : 20221126,
"muirglacierblock": 0,
"qbft" : {
"blockperiodseconds" : 4,
"epochlength" : 30000,
"requesttimeoutseconds" : 6
},
"contractSizeLimit" : 2147483647
},
"evmStackSize" : 5000000,
"messageQueueLimit" : 5000000,
"duplicateMessageLimit" :1000,
"futureMessagesLimit" : 5000000,
"nonce" : "0x0",
"timestamp" : "0x58ee40ba",
"gasLimit" : "0x1fffffffffffff",
"difficulty" : "0x1",
"mixHash" : "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
"coinbase" : "0x0000000000000000000000000000000000000000",
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"alloc" : {
"11549197c99e4b886ed7d6ed2843f534a4f367fc" : {
"privateKey" : "691193c87afa8c0fe94c5ef32a5b223879f4db1c956f6f070e31a4ae3519d996",
"balance" : "0xad78ebc5ac6200000"
},
"66283b796406855fcb763d60742e922c0143deef" : {
"privateKey" : "cd43e18391ab9eb9851538b8e5b1f5602ab81059cebcf282ad7cced859c94513",
"balance" : "0xad78ebc5ac6200000"
},
"b7bb70ad693cc227d45507d5579a7077caa5f426" : {
"privateKey" : "ca0196e07feeb2d7912bb96e6a73c79ee00928e53dc9e5b8cd886c6897ea3068",
"balance" : "0xad78ebc5ac6200000"
},
"edad1970f705d11f59130b29d76c37332772e24c" : {
"privateKey" : "2da52730a784fe5e1a0b4c127409e24b6e14f2c6ba9ef2ccb063907d8855db83",
"balance" : "0xad78ebc5ac6200000"
}
},
"extraData" : "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549411549197c99e4b886ed7d6ed2843f534a4f367fc9466283b796406855fcb763d60742e922c0143deef94b7bb70ad693cc227d45507d5579a7077caa5f42694edad1970f705d11f59130b29d76c37332772e24cc080c0"
}