Merge Mining (合併挖礦 auxpow)

最近在螞蟻金服實習搞區塊鏈,在公司不能在CSDN寫博客 =_=

概念

合併挖礦的概念其實就是借用比特幣網絡的算力,來保證寄生鏈的安全性(如 name coin)。
簡單來說,就是你是個挖比特幣的礦工,你是一直碰撞比特幣區塊頭哈希的,如果符合比特幣網絡難度要求,率先挖到並進行廣播,那麼就能得到coinbase獎勵。
而如果進行合併挖礦,讓namecoin寄生到比特幣上,那麼事情會變成怎麼樣呢,首先namecoin會承認比特幣礦工做的工作量證明,所以,有以下三種情況:
1. 比特幣區塊工作量大於比特幣網絡難度,礦工廣播,礦工可以得到比特幣的coinbase獎勵和namecoin的coinbase獎勵
2. 比特幣區塊工作量小於比特幣網絡難度,大於namecoin網絡的難度,礦工廣播,礦工不能得到比特幣的coinbase獎勵,但能夠得到namecoin的coinbase獎勵
3. 比特幣區塊工作量小於namecoin網絡的難度,礦工不會廣播

我們可以看到,比特幣礦工可以照常挖比特幣,namecoin可以說的是白送的,所以比特幣礦工有動力去進行比特幣和namecoin的merge mining。

如何實現

經過分析,我們可以明白難點在哪裏。首先,namecoin是寄生在比特幣上的,所以比特幣的協議不會因爲namecoin而改變。

然後,如果要合併挖礦,比特幣區塊要做兩個見證

  1. 見證比特幣網絡的交易數據
  2. 見證namecoin網絡的交易數據

關於第一點,我們不需要理會,因爲本來比特幣區塊就對比特幣網絡的建議進行見證。而關鍵在於第二點,怎麼讓比特幣區塊見證namecoin網絡的交易數據?

我們很容易就可以想到coinbase交易,比特幣存在的自由空間。我們可以在這裏添加對name coin網絡交易的見證。

具體流程

比特幣區塊的改動

對於比特幣的區塊,我們在coinbase交易上添加以下字段,後兩個在只有一條寄生鏈namecoin的情況下不需要考慮:

int32_t magic; // 0xfa, 0xbe, 0x6d, 0x6d

uint256 nmc_block_hash; // 當前namecoin的block hash

int32_t merkle_size; // aux work merkle tree的大小,只有一個寄生鏈時設置爲1。

int32_t merkle_nonce; // 只有一個寄生鏈時設置爲0

namecoin區塊的改動

當namecoin不支持merge mining時,namecoin的區塊結構爲(1) block header + (7) namecoin的交易數據。

然而,當支持merge mining時,namecoin的區塊結構會變成(1)+…+(7):

  1. namecoin的區塊頭
  2. 比特幣區塊的coinbase的交易數據
  3. 附加Hash256(btc_block_header)
  4. 包含有coinbase tx的比特幣的Merkle tree分支;(不需要全部的交易數據,只需構建merkle tree所需的必要位置的HASH值即可,最後需要附上一個標記來註明左右次序)
  5. 當有多個寄生鏈時的其他分支
  6. 比特幣的區塊頭
  7. namecoin的交易數據

下面我們說明2-6的用法:

  1. 當比特幣礦工做到pow的難度大於namecoin網絡難度時,它按照上述1-7組裝namecoin區塊。
  2. namecoin結點發現這個區塊是merge mining的,先檢查一下(2) coinbase的nmc_block_hash是否爲當前的最高高度。然後對(6)比特幣區塊頭的哈希是否符合name_coin網絡的要求。
  3. 如果符合,就用(4)的路徑驗證一下(2)的coinbase交易包含在(6)比特幣區塊頭代表的區塊中,就是SPV的那個路徑

更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章