[GO] 블록체인 PoS 하드포크 프로젝트 - (구축완료/시연)
프로젝트 내용 리뷰를 작성하다 보니,
하나의 블로그로 작성하는건 너무 길겠다 싶어 두개로 쪼갭니다.
JSON REST API
이전 포스트에서 3000번 노드(스테이킹 풀 제공자 및 컨트랙트)가 PoS 함수를 비동기로 실행시켜, 블록 합의 과정을 거치게 했다.
실제로 프로젝트를 실행시키면, PoS의 for문이 돌아가는 시점에, 4000번 노드에게 REST API를 쏠 수 있도록 하는, http://localhost:4000 웹페이지가 열리게 된다.
url의 API EndPoint를 누르면 API GET 또는 POST 요청이 되며, 해당 API에 맞는 응답이 오게되는 웹 페이지다.
No | EndPoint | HTTP | Description |
1 | / | GET | API 메뉴 확인 |
2 | /blocks | GET | 모든 블록 조회 |
3 | /status | GET | 블록체인 상태 조회 |
4 | /balance | GET | 지갑 잔액 조회 |
5 | /wallet | GET | 지갑 정보 조회 |
6 | /peer | GET | 연결된 peer 조회 |
7 | /staking | GET | 스테이킹 중인 노드 조회 |
8 | /mempool | GET | 멤풀내의 트랜잭션 조회 |
9 | /randomTransaction | POST | 랜덤한 트랜잭션을 멤풀에 추가 |
JSON API 실행 화면은 맨 아래에 첨부가 되어있다.
PoS 블록 합의
이전 포스트에서는 블록합의에 순서에 대해 설명만 했지만, 실제 어떤 메시지가 오고가는지를 설명하려 한다.
1. 스테이킹 풀 제공자가 제공자와 검증자를 선출
Seleted Roles for the next block:
{
"proposerAddress": "4ed3...a1a6", // 선출된 블록 제안자의 주소
"proposerPort": "4007", // 선출된 블록 제안자의 노드
"proposerSelectedHeight": 879, // 블록 제안자가 선출된 시점의 블록 높이
"validatorAddress": [ // 선출된 검증자들의 주소
"d618...f500",
"174c...0d1c",
"023c...e309"
],
"validatorPort": [ // 선출된 검증자들의 노드
"4001", "4005", "4008"
],
"validatorSelectedHeight": 877 // 검증자가 선출된 시점의 블록높이
}
2. 선출된 인원들에게 선출되었다고 메세지를 전달
// 이번 블록동안의 블록 제안자로 선정되었다는 메세지
At 663 height, this 4001 node has been pointed as a Proposer
// 3개의 블록동안의 검증자로 선정되었다는 메세지
At 895 height, this 4004 node has been pointed as a Validator for 3 blocks
3. 블록제안자가 블록을 구성
Just created new block : {
"hash": "0234...f33a", // 블록의 해쉬 값
"prevHash": "faeb...4037", // 이전 블록의 해쉬 값
"height": 663, // 블록 높이
"timestamp": 1701508034, // 블록이 추가된 타임스탬프
"transaction": [ // 블록에 포함된 트랜잭션
{
"id": "96c8...06fa", // 트랜잭션의 해쉬 값
"timestamp": 1701508034, // 트랜잭션이 추가된 타임스탬프
"txIns": [ // UTXO 기반의 트랜잭션 Input
{
"txId": "",
"index": -1,
"signature": "COINBASE" // 블록 생성에 대한 보상금을 지급하는 주체
}
],
"txOuts": [ // UTXO 기반의 트랜잭션 Output
{
"address": "d618...f500",
"amount": 50 // 블록 제안자 보상
},
{
"address": "5f76...9049",
"amount": 10 // 블록 검증자 보상
},
{
"address": "5810...3425",
"amount": 10
},
{
"address": "419d...60d7",
"amount": 10
}
],
"inputData": "Proof of Stake"
}
],
"roleinfo": {
// 이전 내용과 동일
},
"signature": null
}
4. 검증자는 본인이 구성한 임의의 블록과 비교해 유효성을 확인. 그 뒤, 검증 결과가 검증됨을 증명하는 서명값을 전달
validate result: true
{
"port": "4001", // 검증자 본인의 노드
"address": "d618...f500", // 검증자 본인의 주소
"signature": "fe46...2742" // 검증한 블록을 본인의 지갑으로 서명한 값
}
5. 스테이킹 풀 제공자는 검증 결과를 종합하고, 결과를 제안자에게 전달합니다.
All Validator's message is arrived
PASS: 3
FAIL: 0
6. 블록 제안 결과가 OK라면 제안자는 블록을 체인에 추가합니다.
validate result: true
Added and broadcasted the block done.
7. 스테이킹 풀 제공자는 다시 역할을 선출합니다. (1~8번 반복)
Seleted Roles for the next block:
JSON API 요청과 응답 화면
1. blocks
: 체인내의 모든 블록들을 조회합니다. 블록이 추가된 뒤 새로고침을 하면, 추가된 블록을 포함하여 조회할 수 있습니다. 제안자와 검증자의 정보와 검증 내역 또한 포함되어 있습니다.
2. status
: 블록체인의 현 상태를 조회합니다. 최근 추가된 블록의 해쉬값과 블록 높이가 포함되어 있습니다.
3. balance
: 지갑 주소의 코인 잔액을 조회합니다.
4. wallet
: 지갑 정보를 조회합니다.
5. peer
: 현재 연결된 노드들을 조회합니다. 문제가 생겨 종료된 peer 노드들은 확인 즉시 목록에서 제거합니다.
6. staking
: 현재 스테이킹 중인 노드들을 조회합니다. 스테이킹 내용이 들어간 트랜잭션의 Hash값, 스테이커의 지갑주소, 스테이커의 노드와 타임스탬프를 확인할 수 있습니다.
7. randomTransaction & mempool
- 랜덤한 트랜잭션을 구성하고 멤풀에 추가합니다.
- 그 뒤 /mempool GET을 하여 멤풀에 추가된 트랜잭션들을 확인합니다.
Notion Page
PoS 페이지
📌 프로젝트 메인 페이지
noble-walker-465.notion.site
Github Repository
GitHub - viviviviviid/go-pos-hardfork: Hardfork Project (PoW -> PoS)
Hardfork Project (PoW -> PoS). Contribute to viviviviviid/go-pos-hardfork development by creating an account on GitHub.
github.com