天天看點

區塊鍊實戰(二)PoW工作量證明的實作

Version 2

定義一個工作量證明的結構ProofOfWork

block

目标值

提供一個創造PoW的方法

NewProofOfWork(參數)

提供一個計算哈希值的方法

Run()

提供一個校驗函數

IsValid()

結構目錄

區塊鍊實戰(二)PoW工作量證明的實作
block.go

package main

import (
   "time"
)

/*
1.定義一個區塊的結構Block
a.區塊頭:6個字段
b.區塊體:字元串表示data
*/
//區塊
type Block struct {
   Version int64   //版本
   PerBlockHash []byte //前一個區塊的hash值
   Hash []byte //目前區塊的hash值,是為了簡化代碼
   MerKelRoot []byte  //梅克爾根
   TimeStamp int64  //時間抽
   Bits int64  //難度值
   Nonce int64 //随機值

//區塊體
   Data []byte  //交易資訊
}

/*
提供一個建立區塊的方法
NewBlock(參數)
*/
func NewBlock(data string ,prevBlockHash []byte) *Block {
   var block Block
   block = Block{
      Version:      2,
      PerBlockHash: prevBlockHash,
      //Hash:         []byte{},      //區塊不存儲hash值,節點接受區塊後獨立計算并存儲在本地。
      MerKelRoot:   []byte{},
      TimeStamp:    time.Now().Unix(),
      Bits:         targetBits,
      Nonce:        0,
      Data:         []byte(data),
   }
   // block.SetHash()  //填充Hash
   PoW:= NewProofOfWork(&block)
   nonce , hash :=PoW.Run()
   block.Nonce=nonce
   block.Hash=hash
   return &block
}

/*
func (block *Block) SetHash() {
   // 源碼裡面是要傳二維切片 func Join(s [][]byte, sep []byte) []byte
   tmp :=[][]byte{
      IntToByte(block.Version),
      block.PerBlockHash,
      block.MerKelRoot,
      IntToByte(block.TimeStamp),
      IntToByte(block.Bits),
      IntToByte(block.Nonce),
   }
   data:=bytes.Join(tmp,[]byte{})    //之後再計算hash
   hash := sha256.Sum256(data)
   block.Hash = hash[:]  //變切片
}
*/


//創始塊
func NewGensisBlock() *Block{
   return NewBlock("Genesis Block!",[]byte{})
}      

繼續閱讀