머리말
블록 체인 채굴에 대한 호기심에서 비롯된 것인데, 최근에는 GO 언어를 배우는 것에 집착하여 단순히 포우 채굴의 원리를 구현하는 데 사용했습니다.
코드 구현 프로세스
블록 정보 구조를 정의합니다.
type Block struct {
//当前区块的Hash值.
HashCode string
//当前时间戳.
TimeStamp string
//当前长度.
Index int
//网络难度系数,若前导0个数符合难度系数,则挖矿成功,根据挖矿人数不断变化.
Diff int
//下一个区块的Hash值
PreHashCode string
//随机数
Nonce int
//交易信息.
Data string
}
제네시스 블록 만들기
func initFirstBlock() *Block{
var firstBlcok = new(Block)
firstBlcok.TimeStamp = string(time.Now().UnixNano())
firstBlcok.Diff = 3
firstBlcok.Nonce = 1
firstBlcok.PreHashCode = "0"
firstBlcok.Data = "创世块"
firstBlcok.Index = 1
for ; ; {
hashCode := generateHashCode(*firstBlcok)
fmt.Println(hashCode)
if strings.HasPrefix(hashCode, strings.Repeat("0", firstBlcok.Diff)) {
firstBlcok.HashCode = hashCode
break
}else {
firstBlcok.Nonce++
}
}
fmt.Println("创世模块初始化完毕")
return firstBlcok
}
해시 값 생성 도구
블록에서 HashCode 생성에 사용
//计算hash值.
func generateHashCode(block Block) string {
//生成规则.
record := strconv.Itoa(block.Index) + block.TimeStamp +
strconv.Itoa(block.Nonce) + strconv.Itoa(block.Diff) + block.PreHashCode
hash := sha256.New()
hash.Write([]byte(record))
sum := hash.Sum(nil)
hashCode := hex.EncodeToString(sum)
return hashCode
}
블록을 얻은 후 체인 만들기 시작
type Node struct {
block Block
nextBlock Block
index int
}
func initFirstChain(block *Block) *Node {
node := new(Node)
node.index = 1
return node
}
func createNextNode(block Block,node *Node) *Node {
nextNode := new(Node)
nextNode.index = node.index + 1
node.nextBlock = block
return nextNode
}
POW 채굴
func calNextBlock(diff int, block *Block) Block {
nextBlock := new(Block)
nextBlock.Index = block.Index + 1
nextBlock.TimeStamp = string(time.Now().UnixNano())
marshal, _ := json.Marshal(block)
nextBlock.Data = string(marshal)
nextBlock.Diff = diff
nextBlock.PreHashCode = block.HashCode
for ; ; {
hashCode := generateHashCode(*nextBlock)
fmt.Println(hashCode)
if strings.HasPrefix(hashCode, strings.Repeat("0", nextBlock.Diff)) {
nextBlock.HashCode = hashCode
break
}else {
nextBlock.Nonce++
}
}
fmt.Println("挖矿成功!!!")
return *nextBlock
}
주요 기능
func main() {
now := time.Now()
//初始化创世模块
firstBlock := initFirstBlock()
//初始化链表
chain := initFirstChain(firstBlock)
//开始挖坑
block := calNextBlock(6, firstBlock)
node := createNextNode(block, chain)
fmt.Println(node)
elapsed := time.Since(now)
fmt.Println("用时:", elapsed)
}
시험 결과
요약하자면
diff의 값은 채굴의 난이도 계수를 결정합니다. 시스템은 채굴이 성공했음을 나타 내기 위해 적격 해시 값이 충돌 할 때까지 diff의 값에 따라 해시 충돌을 계속 수행 한 다음이 블록이 업로드되고 업데이트됩니다. 체인.