最近在螞蟻金服實習搞區塊鏈,在公司不能在CSDN寫博客 =_=
概念
合併挖礦的概念其實就是借用比特幣網絡的算力,來保證寄生鏈的安全性(如 name coin)。
簡單來說,就是你是個挖比特幣的礦工,你是一直碰撞比特幣區塊頭哈希的,如果符合比特幣網絡難度要求,率先挖到並進行廣播,那麼就能得到coinbase獎勵。
而如果進行合併挖礦,讓namecoin寄生到比特幣上,那麼事情會變成怎麼樣呢,首先namecoin會承認比特幣礦工做的工作量證明,所以,有以下三種情況:
1. 比特幣區塊工作量大於比特幣網絡難度,礦工廣播,礦工可以得到比特幣的coinbase獎勵和namecoin的coinbase獎勵
2. 比特幣區塊工作量小於比特幣網絡難度,大於namecoin網絡的難度,礦工廣播,礦工不能得到比特幣的coinbase獎勵,但能夠得到namecoin的coinbase獎勵
3. 比特幣區塊工作量小於namecoin網絡的難度,礦工不會廣播
我們可以看到,比特幣礦工可以照常挖比特幣,namecoin可以說的是白送的,所以比特幣礦工有動力去進行比特幣和namecoin的merge mining。
如何實現
經過分析,我們可以明白難點在哪裏。首先,namecoin是寄生在比特幣上的,所以比特幣的協議不會因爲namecoin而改變。
然後,如果要合併挖礦,比特幣區塊要做兩個見證
- 見證比特幣網絡的交易數據
- 見證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):
- namecoin的區塊頭
- 比特幣區塊的coinbase的交易數據
- 附加Hash256(btc_block_header)
- 包含有coinbase tx的比特幣的Merkle tree分支;(不需要全部的交易數據,只需構建merkle tree所需的必要位置的HASH值即可,最後需要附上一個標記來註明左右次序)
- 當有多個寄生鏈時的其他分支
- 比特幣的區塊頭
- namecoin的交易數據
下面我們說明2-6的用法:
- 當比特幣礦工做到pow的難度大於namecoin網絡難度時,它按照上述1-7組裝namecoin區塊。
- namecoin結點發現這個區塊是merge mining的,先檢查一下(2) coinbase的nmc_block_hash是否爲當前的最高高度。然後對(6)比特幣區塊頭的哈希是否符合name_coin網絡的要求。
- 如果符合,就用(4)的路徑驗證一下(2)的coinbase交易包含在(6)比特幣區塊頭代表的區塊中,就是SPV的那個路徑