分享

更多

   

山寨币开发之比特币源码分析(一)

2018-04-17  quasiceo

在上一篇我们了解了ubuntu系统环境,我们开始要进行自己的比特币开发了,先从github上https://github.com/bitcoin/bitcoin)fork一下源代码,如下

然后可以通过clone下载到本地zip格式进行解压,可以通过ubuntu命令创建我们的工作目录

1
2
mkdir src
cd src

我们需要对其进行解压。我们这里得到的是最新的版本,比特币的编译需要一定的环境要求,我们在之前的ubuntu环境搭建中已经配置过了,我们先进行比特币的编译

1 cd bitcoin
2 aclocal
3 automake --add-missing
4 ./configure --with-incompatible-bdb
5 make

编译速度看电脑配置,一般十分钟左右,编译成功后,我们可以用以下代码查询是否成功编译出了主要文件,如果其中出现了问题,一般都是由于库没有安装完全或版本不一致的情况,我们可以参考环境配置的文章进行排除。我们看看下面的文件在不在。


1
2
3
ls src/bitcoind
ls src/bitcoin-cli
ls src/qt/bitcoin-qt

如果都在那么说明已经成功了,下面我们可以开始打开源码进行修改了。

首先我们需要进入chainparams.cpp,在src文件里面找到这个文件,用你们喜欢的编辑器打开,我们在140多行的地方找到如下显示的代码

山寨币开发之比特币源码分析(一)

我们需要把这几行代码改成

1
( 0, uint256("0x001"));

这是为了去掉区块的信息,这些代码都是比特币运行过程中产生的,前面的数字是区块号,后面一串是hash值,接下来的几行代码通过英文注释我们可以看到,第一行代表上个检查点的时间,第二行是创始块直到上次检查时的交易数量。第三行表示平均每天的交易量。我们在终端运行:

date +%s

这个命令会产生当时的unix时间戳,我们把显示的时间戳换到第一行中。

第二行和第三行随便填吧,没什么区别。

然后我们再找到如下代码

山寨币开发之比特币源码分析(一)

这几行代码会在CMainParams和CTestParams 。CTestNetParams中出现,我们需要修改后面的十六进制数,在函数中有四行指针代码,pchMessageStart。一般作为用来对比特币的交易进行验证的协议(protocol)。

其中每个数组的值都是0-255中的数值,以16进制的形式表示。他们一旦改变,任何人都无法将我们的客户端连进比特币的了。我们可以在http://numbermonk.com/?all=1 的表中从0-255找到我们喜欢的数字填进去。如果可以的话,再找8个填进CTestNetParams和CRegTestParams。

    然后,nDefaultport是默认的端口号,我们可以在这个数字上加个1000改变它,在CTestParams和CTestNetParams也要修改。

    下面的代码是vAlertPubKey。所以我们需要更改alert和genesis coinbase的key值。我们用命令行生成一些


1
2
3
4
5
6
openssl ecparam -genkey -name secp256k1 -out alertkey.pem
openssl ec -in alertkey.pem -text > alertkey.hex
openssl ecparam -genkey -name secp256k1 -out testnetalert.pem
openssl ec -in testnetalert.pem -text > testnetalert.hex
openssl ecparam -genkey -name secp256k1 -out genesiscoinbase.pem
openssl ec -in testnetalert.pem -text > genesiscoinbase.hex

    这样我们就得到了一系列alertkey和genesiscoinbase key。我们首先打开alertkey cat alertkey.hex。我们把‘pub’和‘ASN1 OID: secp256k1′中间的5行数值去掉冒号和空格填到vAlertPubKey = ParseHex(“…”);里去。然后我们再用cat testnetalert.hex把其中的数据填入到CTestNetParams函数中去。


    下面我们更改时间标签pszTimestamp。在这一行

const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";

是一行是一个约定,中本聪在创造比特币的时候加入了当天报纸的头条,这是要一个很聪明的办法,我们也可以修改成自己当前的时间。

    接下来我们将创始块的pubkey填进去。打开cat genesiscoinbase.hex,在

txNew.vout[0].scriptPubKey = CScript() << ParseHex("...") << OP_CHECKSIG;
中插入我们的key值。同样的去掉冒号和空格。
然后我们找到下面的代码,把它注释掉,这是创世块的hash值和mekle值,
1
2
assert(hashGenesisBlock == uint256("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
我们再看到如下代码:


这些vSeeds是比特币的节点,我们现在还没有自己的服务器,可以先注释掉,以后再添加。

接下来是很重要的一部,我们要挖第一个创世块的值,下面我们来产生,Genesis block,用下面代码来产生,把下述产生创始区块的代码,粘贴在 nNonce 下面,刚好在 hashGenesisBlock

这段代码可以得到创世块的hash值和mekle值,我们只需要在源码中修改就行了,在下面我们要修改名字和logo。

我们以sqcoin(深丘币)做例子,大家可以改成自己喜欢的名字,

1
2
3
4
5
6
7
8
9
10
cd ~/src/newcoin
find . -type f -print0 | xargs -0 sed -i 's/bitcoin/newcoin/g'
find . -type f -print0 | xargs -0 sed -i 's/Bitcoin/Newcoin/g'
find . -type f -print0 | xargs -0 sed -i 's/BitCoin/Newcoin/g'
find . -type f -print0 | xargs -0 sed -i 's/BITCOIN/NEWCOIN/g'
find . -type f -print0 | xargs -0 sed -i 's/BTC/NCN/g'
find . -type f -print0 | xargs -0 sed -i 's/btc/NCN/g'
find . -type f -print0 | xargs -0 sed -i 's/Btc/NCN/g'
find . -exec rename 's/bitcoin/newcoin/' {} ";"
find . -exec rename 's/btc/NCN/' {} ";"

前8行代码将文件中的bitcoin进行替换,后两行将文件名替换为我们的新名字。

LOGO在qt客户端的图片文件主要存放在src/qt/res中。将其中的图片文件按照原来的像素大小一一替换掉即可。

现在我们编译我们自己的newcoin


1
2
3
4
aclocal
automake --add-missing
./configure --with-incompatible-bdb
make

当然,这本质上还是比特币,算法并没有改变,也还是pow证明,如果想做一个pos币的话就需要更多的修改了,或者可以修改点点币和黑币,它们都是基于pos的币,也都是fork了比特币,在比特币的基础上修改而来的,我们除了要修改上面提到的,还有很多不一样的地方。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    类似文章 更多
    喜欢该文的人也喜欢 更多