好多人学习和研究比原,但苦于在主网环境不敢实际操作怕带来损失,在单机solo环境又挖不出代币无法进行测试。本人在 学习过程中也遇到了类似的问题,简单研究了一下写了如下方法。
提前做好文件和钱包的备份。提前做好文件和钱包的备份。提前做好文件和钱包的备份。
挖矿的最终工作量证明在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)**的大小,小于预定难度即工作量证明通过.
其中使用AI友好算法生成随机哈希相关论文的下载地址: https://github.com/Bytom/bytom/wiki/download/tensority-v1.2.pdf, 大家感兴趣可以去看,这里不再累述。
使用难度系数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语言基础的 程序员们,当然技术大牛们看了会见笑,觉得太简单了。费劲写这么多的主要目的是因为本人喜欢比原链,希望更多的人能够加入进来学习比原 研究比原,都为比原的发展贡献自己的力量,尽自己的一小点力量。而且在单机模拟环境下练习转账等操作也不会有实际的损失和风险。 请不要尝试用修改的文件连接主网,会有未知的风险。最后感谢微信比原技术测试群还有群友Freewind,Freewind是一个即聪明又勤奋的人, 没有他就没有这篇文章,大家感兴趣可以去看看他写的https://github.com/freewind/bytom.win关于比原的文章。
感谢社区用户:Leekailklk
原文链接: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