iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
Blockchain

Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈系列 第 12

Go to Blockchain: Day 12 開始自幹區塊鏈-工作量證明(1)

  • 分享至 

  • xImage
  •  

今天我們要開始我們的工作量證明啦~

工作量證明

  • 首先工作量證明代表了我們要解題目,所以呢,我們需要先給他一個難度,至於這個難度我們會用一個數字來比較,因此要宣告一個數字
  • 接著因為我們會需要對區塊進行工作量證明,因此我們需要加上區塊進去
type ProofOfWork struct {
	target *big.Int
	block *Block
}

創建 POW

  • 首先先說明一下我們判斷的方法,由於我們要找前綴 0 為 target 個數量

  • 因此我們要拿我們算出來的 Hash 值和 1 後面接上 (256 - target) bit 個0 比大小

  • 如果 < ,代表說題目就被解開惹~,反之則沒有OAO

  • 所以我們要先創出一個給我們比較的值 0x000000000100...0 之類的

  • 例如:

    • target 難度是 24 bit

    • 因此如下圖

    • target = 0x0000010000000000000000000000000000000000000000000000000000000000
      Hash1 = 0x7c2ecd07f155648431e0f94b89247d713c5786e1e73e953f2fe7eca39534cd6d
      Hash2 = 
      0x000000a7f155648431e0f94b89247d713c5786e1e73e953f2fe7eca39534cd6d
      
    • Hash1 > target ----> False

    • Hash2 < target ----> True

func NewProofOfWork(b *Block) *ProofOfWork {
	target := big.NewInt(1)
	target.Lsh(target, uint(256-targetBits))

    pow := &ProofOfWork{b, target}

    return pow
}

準備資料

  • 由於再做 Hash 計算時,我們會需要把 Block 的資料放進去做 Hash ,因此我們會先需要準備這些資料(把他並在一起
  • 由於加上了 POW ,因此我們必須修改一下先前的 Block
func (pow *ProofOfWork) prepareData(nonce int) []byte {
	data := bytes.Join(
		[][]byte{
			pow.block.PrevBlockHash,
			pow.block.Data,
			IntToHex(pow.block.Timestamp),
			IntToHex(int64(targetBits)),
			IntToHex(int64(nonce)),
		},
		[]byte{},
	)
	return data
}

  • 新的 Block 裡面的資料
type Block struct {
	Timestamp int64
	Data []byte
	PrevBlockHash []byte
	Hash []byte
	Nonce int
}
  • 明天我們會繼續把共作量證明完全接上去 xD

上一篇
Go to Blockchain: Day11 開始自幹區塊鏈-完成基本區塊鏈
下一篇
Go to Blockchain: Day13 開始自幹區塊鏈-工作量證明(2)
系列文
Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言