devops

Go로 PoW 작업증명 알고리즘 구현하기 본문

DevOps/Chain

Go로 PoW 작업증명 알고리즘 구현하기

vata500 2022. 12. 18. 23:08
반응형

블록체인 증명 알고리즘은 블록의 생성은 어려우나 검증은 쉽도록 구성하는 것이 중요하다.

블록의 파라미터 중 Nonce는 유일하게 채굴자들이 변경할 수 있는 값이다. 블록을 생성하기 위해서는 Nonce값을 수정해서 원하는 hash값을 찾아야한다. hash 함수는 결정론적이기 때문에 Nonce값을 반복적으로 대입할 수 밖에 없다. 물론, 블록 생성의 댓가는 코인이기 때문에, 보상을 받기위해 기어이 nonce에 대입하는 컴퓨팅 파워를 사용한다.

package main

import (
	"crypto/sha256"
	"fmt"
	"strings"
)

func main() {
	diff := 3
	nonce := 1
	target := strings.Repeat("1", diff)

	for {
		hash := fmt.Sprintf("%x", sha256.Sum256([]byte("test"+fmt.Sprint(nonce))))
		fmt.Printf("Hash:%s\nTarget:%s\nNonce:%d\n\n", hash, target, nonce)

		if strings.HasPrefix(hash, target) {
			return
		} else {
			nonce = nonce + 1
		}
	}

}

이 작업증명에서는 hash값에 1이 몇개 있어야하는지 확인하도록 한다. 위에서 블록 생성 조건은 생성된 Hash값의 앞의 3글자가 1이 오면 충족하게 된다.

	diff := 3
	nonce := 1
	target := strings.Repeat("1", diff)
  • diff : hash 값의 몇글자까지 지정할 것인지를 결정
  • nonce : 새로운 hash 결과값을 도출하기 위해 사용되는 변수
  • target : 1의 diff 수 만큼 생성된 값

 

	for {
		hash := fmt.Sprintf("%x", sha256.Sum256([]byte("test"+fmt.Sprint(nonce))))
		fmt.Printf("Hash:%s\nTarget:%s\nNonce:%d\n\n", hash, target, nonce)

		if strings.HasPrefix(hash, target) {
			return
		} else {
			nonce = nonce + 1
		}
	}

test 문자와 nonce값을 통해서 hash를 생성한다. 현재의 hash와 target, nonce값을 출력해서 비교하는데, 만약 hash값에서 문자열 앞 3글자가 target과 일치하면 블록 생성의 기준을 충족하여 return된다.

충족하지 못한다면 nonce에 1이 추가되어 새로운 hash값을 생성한다.

3645번 nonce가 블록 생성 기준을 충족한다.

비트코인은 실제로 target에 사용되는 숫자는 0이며, 난이도를 의미하는 difficulty는 2주마다 조정되는 걸로 알려져있다.

https://www.blockchain.com/explorer/blocks/btc/767939

실제 비트코인의 767,939 블록을 보면 블록 hash 값이 "00000000000000000007ec2569321d73249aa7be6d56c534d2c7f4ef722be1a9" 으로 블록 난이도가 아주 높다는 것을 추정할 수 있다. 

그래도 블록 생성할 경우 주어지는 보상은 약 6.34 BTC로 최소 2000만 원이라고 가정한다면 1억 2000만 원 가량이 보상된다... 물론 일반 소규모 채굴기로는 어림도없다. 

반응형
Comments