1. 程式人生 > >【比原鏈】比原鏈如何在單機solonet測試環境下挖到礦

【比原鏈】比原鏈如何在單機solonet測試環境下挖到礦

比原專案倉庫:https://github.com/Bytom/bytom

好多人學習和研究比原,但苦於在主網環境不敢實際操作怕帶來損失,在單機solo環境又挖不出代幣無法進行測試。本人在 學習過程中也遇到了類似的問題,簡單研究了一下寫了如下方法。

  1. 提前做好檔案和錢包的備份。提前做好檔案和錢包的備份。提前做好檔案和錢包的備份。

  2. 挖礦的最終工作量證明在bytom/consensus/difficulty/difficulty.go

// CheckProofOfWork checks whether the hash is valid for a given difficulty.

 func CheckProofOfWork(hash, seed *bc.Hash, bits uint64) bool {

compareHash := tensority.AIHash.Hash(hash, seed)

return HashToBig(compareHash).Cmp(CompactToBig(bits)) <= 0

}

這個函式中,最終比較的是使用AI友好演算法生成的隨機雜湊tensority.AIHash.Hash(hash, seed)使用HashToBig()轉化為一個大數, 與預先設定好的一個難度的大數比較大小,這個大數由難度係數bits通過CompactToBig(bits)函式得出。即,這個函式最終比較HashToBig(compareHash) 和**CompactToBig(bits)**的大小,小於預定難度即工作量證明通過.

使用難度係數bits控制生成難度的大數的演算法簡介如下:

CompactToBig converts a compact representation of a whole unsigned integer N to an big.Int. The representation is similar to IEEE754 floating point numbers. Sign is not really being used.

-------------------------------------------------
|   Exponent     |    Sign    |    Mantissa     |
-------------------------------------------------
| 8 bits [63-56] | 1 bit [55] | 55 bits [54-00] |
-------------------------------------------------

N = (-1^sign) * mantissa * 256^(exponent-3) Actually it will be nicer to use 7 instead of 3 for robustness reason.

這個演算法本人沒有詳細研究,根據我的理解就是使用類似於IEEE754浮點數科學計數法而使用的二進位制的大數科學計數法,即一個很大的數轉化為 一個小數乘以10的n次方的二進位制表示,最後又把表示轉化為十進位制儲存。

在使用單機solonet測試網路時很難通過該工作量證明挖到礦,於是考慮在不影響整個程式功能的情況下嘗試做小的修改可以在單機跑起來, 有幸在比原技術微信群得到了幾位大牛的指點,考慮修改難度係數bits,該係數在bytom/config/genesis.go檔案中,初始值Bits:2161727821137910632,

為了更改bits,對程式碼bytom/consensus/difficulty/difficulty.go做如下修改

func CheckProofOfWork(hash, seed *bc.Hash, bits uint64) bool {

compareHash := tensority.AIHash.Hash(hash, seed)
log.Info("HashToBig compareHash=", HashToBig(compareHash))
//log.Info("CompactToBig     bits=", CompactToBig(bits))

if HashToBig(compareHash).Cmp(CompactToBig(bits)) <= 0 {
	log.Info("proof of work true")
	return true

} else {
	bits = BigToCompact(HashToBig(compareHash))
	log.Info("proof of work false:bits=", bits)
	return false
	}
}

這麼做的目的是為了得到適合本機的難度係數。

3.改完程式碼儲存修改檔案,編譯bytom/cmd/bytomd/main.go 為bytomd.exe 清除系統原來在user/Administrator/AppData/Roaming中檔案。(如果需要,記得備份備份備份

4.執行bytomd init --chain_id solonet 和bytomd node --minging命令,在dashboard建立賬戶,幾秒之後在命令列視窗會看見系統的執行資訊,接著會得到類似下面的資訊

time="2018-05-18T11:57:11+08:00" level=info msg="false:bits=2305843009219929325"
time="2018-05-18T11:57:15+08:00" level=info msg="HashToBig compareHash=94470935200285873636399503116117805657110739921871232222716960430331350467616"
time="2018-05-18T11:57:15+08:00" level=info msg="false:bits=2305843009227381927"
time="2018-05-18T11:57:16+08:00" level=info msg="bk peer num:0 sw peer num:0 []"
time="2018-05-18T11:57:19+08:00" level=info msg="HashToBig compareHash=108924585367465724541234689522322789151382457823652479112133953258841671282258
time="2018-05-18T11:57:19+08:00" level=info msg="false:bits=2305843009229476129"
time="2018-05-18T11:57:23+08:00" level=info msg="HashToBig compareHash=14146428415876784558544863438470231118789865847836167107575618549870912614213"
time="2018-05-18T11:57:23+08:00" level=info msg="false:bits=2305843009215743640"
time="2018-05-18T11:57:26+08:00" level=info msg="bk peer num:0 sw peer num:0 []"
time="2018-05-18T11:57:28+08:00" level=info msg="HashToBig compareHash=78934284042892087673033389266663287288908738737936067679514124013738943934592"
time="2018-05-18T11:57:28+08:00" level=info msg="false:bits=2305843009225130808"
time="2018-05-18T11:57:32+08:00" level=info msg="HashToBig compareHash=55786918064653409850632601440227606224276562392668699194595776719016165547098"
time="2018-05-18T11:57:32+08:00" level=info msg="false:bits=2305843009221776966"
time="2018-05-18T11:57:36+08:00" level=info msg="HashToBig compareHash=83666295500599103004856267657480156049537933326077567233384721054295899257191"
time="2018-05-18T11:57:36+08:00" level=info msg="false:bits=2305843009225816433"
time="2018-05-18T11:57:36+08:00" level=info msg="bk peer num:0 sw peer num:0 []"
time="2018-05-18T11:57:40+08:00" level=info msg="HashToBig compareHash=22266069092978536339665292252171173599340934438903703233524897266085035107388"

資訊顯示雖然挖礦失敗了,但是通過運算我們可以得到很多適合本機難度的bits,每一個time="2018-05-18T11:57:36+08:00" level=info msg="false:bits=2305843009225816433" 中的bits都適合本機難度,這個bits上面對應的**level=info msg="HashToBig compareHash=**後面這個值越大,難度係數就越低。

5.挑選一個bits,拷貝下來bits的值,在原始碼中bytom/config/genesis.go檔案中,初始值Bits: 2161727821137910632,修改為你自己的難度係數。 比如修改為Bits:2305843009228571441,

6.再次執行步驟3和步驟4.現在你應該可以在單機solo模式下挖礦了。

7.另外,對bytom/consensus/general.go 檔案中

//config parameter for coinbase reward
CoinbasePendingBlockNumber = uint64(100)//需要交易確認數
subsidyReductionInterval   = uint64(840000)
baseSubsidy                = uint64(41250000000)//每個塊的比原數,單位:諾
InitialBlockSubsidy        = uint64(140700041250000000)

// config for pow mining
BlocksPerRetarget     = uint64(2016)//區塊難度每2016塊調整
TargetSecondsPerBlock = uint64(150)//150秒出塊,初期不準的
SeedPerRetarget       = uint64(256)

// MaxTimeOffsetSeconds is the maximum number of seconds a block time is allowed to be ahead of the current time
MaxTimeOffsetSeconds = uint64(60 * 60)
MedianTimeBlocks     = 11

PayToWitnessPubKeyHashDataSize = 20
PayToWitnessScriptHashDataSize = 32
CoinbaseArbitrarySizeLimit     = 128

BTMAlias = "BTM"

這些欄位修改也會影響挖礦的產量速度,比如**baseSubsidy = uint64(41250000000)**指的是每塊的產量412.5個btm,可以改大一點。 **CoinbasePendingBlockNumber = uint64(100)**交易需要的確認數可以改小一些。 具體請自行研究。這一步不是必須的。

8.如果感覺以上步驟比較麻煩,可以跳過步驟2,3和4,從步驟5開始直接修改bits的值,然後執行步驟6。即少修改一次程式碼和編譯過程,直接使用步驟5中我已經測試好的bits.

9.最後再次說明一定提前備份好btm裡自己的重要資料,主要是key,最好整個bytom資料夾做一下備份。這個方法適合於有一定go語言基礎的 程式設計師們,當然技術大牛們看了會見笑,覺得太簡單了。費勁寫這麼多的主要目的是因為本人喜歡比原鏈,希望更多的人能夠加入進來學習比原 研究比原,都為比原的發展貢獻自己的力量,儘自己的一小點力量。而且在單機模擬環境下練習轉賬等操作也不會有實際的損失和風險。 請不要嘗試用修改的檔案連線主網,會有未知的風險。最後感謝微信比原技術測試群還有群友FreewindFreewind是一個即聰明又勤奮的人, 沒有他就沒有這篇文章,大家感興趣可以去看看他寫的https://github.com/freewind/bytom.win關於比原的文章。

原文連結:https://github.com/Leekailklk/bytom/blob/master/%E6%AF%94%E5%8E%9F%E9%93%BE%E5%A6%82%E4%BD%95%E5%9C%A8%E5%8D%95%E6%9C%BAsolonet%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83%E4%B8%8B%E6%8C%96%E5%88%B0%E7%9F%BF.md