devops
Go로 PoW 작업증명 알고리즘 구현하기 본문
블록체인 증명 알고리즘은 블록의 생성은 어려우나 검증은 쉽도록 구성하는 것이 중요하다.
블록의 파라미터 중 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값을 생성한다.
비트코인은 실제로 target에 사용되는 숫자는 0이며, 난이도를 의미하는 difficulty는 2주마다 조정되는 걸로 알려져있다.
실제 비트코인의 767,939 블록을 보면 블록 hash 값이 "00000000000000000007ec2569321d73249aa7be6d56c534d2c7f4ef722be1a9" 으로 블록 난이도가 아주 높다는 것을 추정할 수 있다.
그래도 블록 생성할 경우 주어지는 보상은 약 6.34 BTC로 최소 2000만 원이라고 가정한다면 1억 2000만 원 가량이 보상된다... 물론 일반 소규모 채굴기로는 어림도없다.
'DevOps > Chain' 카테고리의 다른 글
Application Specific blockchain with Cosmos SDK (0) | 2023.01.10 |
---|---|
Cosmos SDK란? (0) | 2023.01.10 |
Go로 간단한 블록체인 구현하기 - CLI (0) | 2022.12.12 |
Go로 간단한 블록체인 구현하기 - REST API (0) | 2022.12.12 |
Go로 간단한 블록체인 구현하기 -2 (1) | 2022.12.03 |