100
: public CChainParams
{
101
102
{
103
be unlikely to occur in normal data.
104
ASCII, not valid as UTF-8, and produce
105
alignment.
106
107
108
109
110
111
112
113
>> 32; //这个位置,是设置最小难度的限制,uint256是一个封装类,经常用来存储hash值之类的大数据.
256位,64字节. 将它右移32位, 实际上就是前面4字节是0的一个64位值.16进制是
0x00000000FFFFFFFFFFFFFF
114
210000;
115
116
output of the genesis coinbase cannot
117
in the database.
118
119
hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e,
nTime=1231006505, nBits=1d00ffff, nNonce=2083236893,
vtx=1)
120
vin.size=1, vout.size=1, nLockTime=0)
121
04ffff001d01044554686520
122
scriptPubKey=0x5F1DF16B2B704C8A578D0B
123
124
“The
Times 03/Jan/2009 Chancellor on brink of second bailout for
banks”;
125
txNew;
126
127
128
= CScript()
<< 486604799 << CScriptNum(4)
<< vector((const unsigned char*)pszTimestamp, (const unsigned
char*)pszTimestamp +
strlen(pszTimestamp));
129
= 50 * COIN;
130
= CScript()
<< ParseHex(“04678afdb0fe5548271967f1
<< OP_CHECKSIG;
//这段代码创建一个交易, pszTimestamp 是coinbase 的文字,
作者用2009年1月3日在报纸上的一个标题写在这里,为的是证明这个创世块的产生迟于2009年1月3日,以表明在这之前,作者没有预挖比特币.很聪明的做法.
131
132
133
genesis.BuildMerkleTree();
134
135
1231006505;//这个时间,就是unix时间,从1970年1月1日到2009年1月3日之间的秒数.unix系统常常用这种整数表达时间.
136
//这个是难度
137
2083236893;//这个不是随机数字,挖矿的过程,就是寻找这个数字,来使得区块的HASH值小于genesis.nBits
所指定的难度.
genesis.nNonce是参与hash运算的源数据的一部份.所以,修改这个值,整个hash值就会发生改变.
138
139
genesis.GetHash();//计算区块的hash值
140
141
uint256(“0x4a5e1e4baab89f3a32518a
142
143
“seed.bitcoin.sipa.be”));
144
145
146
“seed.bitcoinstats.com”));
147
148
149
150
list_of(0);
151
list_of(5);
152
list_of(128);
153
list_of(0x04)(0x88)(0xB2)(0x1E);
154
list_of(0x04)(0x88)(0xAD)(0xE4);
155
156
address objects.
157
< ARRAYLEN(pnSeed);
i++)
158
159
nodes because once it connects,
160
newer timestamps.
161
seen time’ of between one and two
162
163
7*24*60*60;
164
165
&pnSeed[i],
sizeof(ip));
166
addr(CService(ip,
GetDefaultPort()));
167
= GetTime() –
GetRand(nOneWeek)
– nOneWeek;
168
169
170
171
172
GenesisBlock()
const {
return genesis; }
173
NetworkID()
const {
return CChainParams::MAIN;
}
174
175
const
{
176
177
178
179
genesis;
180
181
因为我要创建新的货币,所以,尝试创建自己的创世区
代码如下:
const char*
pszTimestamp = “2014/5/11 Write by Andy,Email:yianding@gmail.com”;
//我的创世区块 CTransaction txNew; txNew.vin.resize(1);
txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() <<
486604799 << CBigNum(4) << vector((const unsigned
char*)pszTimestamp, (const unsigned char*)pszTimestamp +
strlen(pszTimestamp)); txNew.vout[0].nValue = 50 * COIN;
txNew.vout[0].scriptPubKey = CScript() <<
ParseHex(“04678afdb0fe5548271967f1
<< OP_CHECKSIG; genesis.vtx.push_back(txNew);
genesis.hashPrevBlock = 0; genesis.hashMerkleRoot =
genesis.BuildMerkleTree(); genesis.nVersion = 1; genesis.nTime =
1399744437; genesis.nBits = 0x1e00ffff; //我将难度设置的比较低.便于我快速的找出nNonce
,当然,最后发布的时候,我会重新生成难度比较高的区块。 genesis.nNonce = 130387;
//符合要求的nNonce值。这个值,我通过下面的代码来寻找。 //这段代码寻找我的nNonce值 unsigned int i;
CBigNum bnTarget; for(i=0;i<0x7fffffff;i++){ //基本上是穷举法 ,让i不断增加
genesis.nNonce = i; //将i赋值给nNonce hashGenesisBlock =
genesis.GetHash();//生成 hash值 bnTarget.SetCompact(genesis.nBits);
//将nBits参数转换成256位的最大hash值。挖矿就是要寻找比这个 hash值更小的值。 if
(hashGenesisBlock < bnTarget.getuint256()){
//判断hash值是否小于最大hash值,如果小于,那就说明我找到了合适的nNonce值。挖矿成功。我这里找到的值就是130387,当然,我不会每次都重新挖我的创世区块,实际运行的时候,我会把130387直接写入nNonce。
printf(“\nI=%i \n”,i);
cout<<“\nnNonce=”<<genesis.nNonce<<”
hash=”<<hashGenesisBlock.GetHex(); break;
//寻找到了这个值,自然就退出循环。实际上,符合条件的nNonce不会只有一个。但是,我们只要找到这个符合条件的值就可以了。 }
}
//——寻找nNonce值代码结束
//printf(“hashGenesisBlock: %x\n”,hashGenesisBlock); //
printf(“genesis.hashMerkleRoot: %x\n”,genesis.hashMerkleRoot);
//assert(hashGenesisBlock ==
uint256(“0x1a5299d469c5d424a999c8
// assert(genesis.hashMerkleRoot ==
uint256(“0xa3bdc0d6741b0d1c3bcbca