ubuntu终端获取时间戳:date +%s
密钥生成:https://github.com/lhartikk/GenesisH0 要安装X11,选择DarkCoin方法
https://blog.youkuaiyun.com/wab719591157/article/details/80747043
修改创世区块中的 pszTimestamp 修改成任意你想输入的话
vAlertPubKey = ParseHex("04517d8xxxxx")
然后继续修改公钥也就是 ParseHex("[中间的值]")
--------------------------------------------------------------------------
建议先用1个月左右的时间熟悉一下比特币协议的原理之后再看源代码,理解复杂事物需要有个循序渐进的过程,欲速则不达。
先简要说明一些这几个参数的作用:
genesis.nTime = nTime;创始区块产生时的unix时间戳
genesis.nBits = nBits;////这个是难度
genesis.nNonce = nNonce;创始区块产生时的随机数 ////这个不是随机数字,挖矿的过程,就是寻找这个数字,来使得区块的HASH值小于genesis.nBits 所指定的难度. genesis.nNonce是参与hash运算的源数据的一部份.所以,修改这个值,整个hash值就会发生改变
----------------
consensus.nSubsidyHalvingInterval = 210000; // 每隔210000个块减半一次,按每10分钟出一个块计算,大约间隔为4年;
consensus.nMajorityEnforceBlockUpgrade = 750; // 软分叉"规则"激活的阈值,此时如果区块声明了使用某个规则,那么就需要根据该规则严格验证该区块;
consensus.nMajorityRejectBlockOutdated = 950; // 软分叉“分叉”生效的阈值,此时矿工将拒绝收录不符合新规则的区块;
consensus.nMajorityWindow = 1000; // 软分叉投票的观察窗口(每次统计最近的“1000”个块的投票情况)
consensus.BIP34Height = 227931; // BIP34规则生效时所在的高度(BIP34是一个比较重要的软分叉规则,该规则要求在每个块的coinbase中必须写入当前的区块高度,从而避免产生出重复的genesis交易)
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); // BIP34规则生效时的区块hash值,相当于是一个检查点(checkpoint)
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // 最低难度值(difficult = 1)时所对应的256位的二进制数值;
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks 每两周调整一次难度
consensus.nPowTargetSpacing = 10 * 60; // 平均每600秒出一个块(10分钟)
consensus.fPowAllowMinDifficultyBlocks = false; // 不允许在当前难度周期挖低难度的块(仅在testnet网上测试时才允许)
consensus.fPowNoRetargeting = false; // 每个难度周期内(2016个块)不允许调整难度值
----------------------------
原文出处:http://www.tiny-calf.com/2018/03/20/比特币核心主要参数分析/
创世块相关
Timestamp
这里的timestamp就是一句随机的话,表明创建创世块创建的时候发生的某个时间,这句话会被一并加入创世块的哈系算法中。其实只是一个象征意义,在代码里能找到创世块的原文,在Bitcore src/chainparams.cpp
的CreateGenesisBlock
函数中,原文如下:
| |
nTime nNonce nBit
nTime这个才是我们通常说的linux时间戳,是创世块开采时候的时间,比特核心代码中为1231006505
。我们知道比特币挖矿的原理是寻找某个随机数加上一个固定的算法所得出的值的哈系值,如果前n多位是0,那么就可以算是一个新的区块。挖矿就是寻找这个随机数的过程。n越多,难度久越大,这里的nBit其实就代表了创世块的难度,代码中为0x1d00ffff
,而真正生成创世块的随机数就是这个nNounce,代码中为2083236893
。这三个参数在代码中直接以函数的参数的形式出现,也在src/chainparams.cpp
中:
| |
这里的50 * COIN
其实没什么用,因为创世块的币是没法用的。每个块的奖励其实不在这里设置,后面再讲。
生成创世块
创世块需要两个参数,一个是创世块的hash值hashGenesisBlock
,一个是创世块的hashMerkleRoot
。区块链是树状的,需要merkleroot来建立块与块之间的联系。生成创世块我们就需要以上说的 Timestamp,nTime,nBit ,按照指定算法挖矿,得出nNounce,hashMerkleRoot,hashMerkleRoot。有一个python能完成生成创世块的工作,点击这个传送门。
得到nNounce,hashMerkleRoot,hashMerkleRoot以后,nNounce还是填入之前的函数参数中,hashMerkleRoot,hashMerkleRoot分别可以在以下代码中找到:
| |
共识机制相关
SubsidyHalvingInterval
这个是减半周期,我们了解比特币4年减半,但是这里的减半周期单位是块,也就是每过210000个块比特币的产出减半。后面我还会回来说为什么是4年。代码是这样的:
| |
PowTargetSpacing PowTargetSpacing
PowTargetSpacing是目标难度变更时间,源码为2周。PowTargetSpacing是目标出块时间代码中为10分钟。这两个参数相除,就是难度变化周期2016(单位:块)。总结来说,就是每隔2016个块,挖矿难度会重新定义,以此来动态平衡出块时间。举个实际的例子:在前难度周期中,由于矿工算力过大,没有像预期的一样每十分钟出一个块,那么在下一个难度周期中,会按照上一个周期的算力,增加合适的难度,来保证下一个周期中每个块的出块时间大约是十分钟。那么其实我们的初始难度设置低一点也没有太大影响,最终都会按PowTargetSpacing来决定难度。另外,结合上面的减半周期210000和每十分钟出一个块,我们就得出了4年减半的结论。
这两个参数的源码如下:
| |
Subsidy
这个就是挖矿的初始奖励。代码中为50,结合减半周期,每个周期内的的产出为 50 × 2100000,所以总产出为 50 × 2100000 ×(1 + 1/2 + 1/4 + 1/16 + …),积分一下,结果就是2100万。
| |
其他非重要参数
| |
这个是网络消息头,用来合其他比特币altcoin区分,随便改其他数字就行
| |
这个是比特币的初始固定节点,开启比特币时会自动连接,如果你的altcoin一开始没有的话全部注释就行
| |
这三个参数会影响地址生成的校验位,以区分不同的币种,如果你要做altcoin的最好还是要改。
| |
这个是校验区块链上的固定块是否正确,同样,需要altcoin的话这里注释掉
| |
这里直接把DATA_FILE_NAME和DATA_FILE_NAME_UNIX换成altcoin名字就行,是默认文件夹名称。
完成
所以按照整篇文章说的,改掉一些数据,就能很容易自己编译自己的altcoin了,具体编译流程可以参照我以前的比特币文章。
但是毕竟,这个技术没什么卵用,自己玩玩就好。
---------------------------------
一老外写的经典之作:
http://dillingers.com/blog/2015/04/18/how-to-make-an-altcoin/#respond
优快云:【比特币】自己动手制作山寨币
https://blog.youkuaiyun.com/hacode/article/details/40422535#commentBox
https://blog.youkuaiyun.com/wab719591157/article/details/80747043
通过修改创世区块简单制作山寨币
https://blog.youkuaiyun.com/mjfh095215/article/details/80250536