Go

[GO] 블록체인 PoS 하드포크 프로젝트 - (구축완료/시연)

viviviviviid 2023. 12. 5. 19:36

 

프로젝트 내용 리뷰를 작성하다 보니,
하나의 블로그로 작성하는건 너무 길겠다 싶어 두개로 쪼갭니다.

 

 

JSON REST API

 

이전 포스트에서 3000번 노드(스테이킹 풀 제공자 및 컨트랙트)가 PoS 함수를 비동기로 실행시켜, 블록 합의 과정을 거치게 했다.

 

실제로 프로젝트를 실행시키면, PoS의 for문이 돌아가는 시점에, 4000번 노드에게 REST API를 쏠 수 있도록 하는, http://localhost:4000 웹페이지가 열리게 된다.

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

  1. 랜덤한 트랜잭션을 구성하고 멤풀에 추가합니다.
  2. 그 뒤 /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