比特币源码编译及学习记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37847176/article/details/81025480

一、bitcon源码编译ubuntu16.04

带步骤截图的文档上传到我的资源里了,稍微整理了一下。

1)准备阶段,没法放图 

  • sudo apt-get update //更新软件包列表
  • sudo apt-get upgrade //跟新所有已安装的软件包,需要很久,貌似不必要步骤
  • sudo apt-get install make 
  • sudo apt-get install gcc 
  • sudo apt-get install g++ 
  • sudo apt-get install libdb-dev 
  • sudo apt-get install libdb++-dev
  • sudo apt-get install libdb5.1++-dev  //E:package报错 这里要修改为libdb5.3++-dev,5.1版本没有,使用apt-cache search libdb查找可能软件包
  • sudo apt-get install libboost-dev 
  • sudo apt-get install libboost-all-dev  //要一会
  • sudo apt-get install zlib1g-dev 
  • sudo apt-get install libssl-dev 
  • sudo apt-get install build-essential 
  • sudo apt-get install libminiupnpc-dev 
  • sudo apt-get install autoconf

2)下载源码

3)编译

关于编译的步骤,源码里面的文档有带的,build-unix.md,build-osx.md,build-windows.md都有详细的介绍的

  • cd bitcoin
  • sudo git tag //查看版本,.rc是测试版本
  • sudo git check v0.13.2 //要编译的版本是0.13的,最新是0.16,改成0.13.2
  • more doc/build-unix.md //根据系统选择编译命令行的说明
  • sudo ./autogen.sh
  • sudo ./configure //出现error(error:found berkerley db other than 4.8,require for portable wallets(--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)按照提示修改 第一个还是报相同的错误,因为没有安装berkerley
  • 补充:7.26*******************************快照返回到这个时间点
  • sudo mkdir db4
  • cd db4
  • sudo wget 'http://download.oracle.com/berkeley-db/db-6.2.32.NC.tar.gz'
  • sudo tar -zxvf db-6.2.32.NC.tar.gz
  • cd db-6.2.32.NC/
  • cd build_unix/
  • sudo ../dist/configure --prefix=/home/parallels/bitcoin/bitcoin/db4/
  • //要使用图形话界面的话,要用下面这句
  • sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler

  • sudo ./configure --with-incompatible-bdb
  • sudo make
  • *******************************************
  • sudo ./configure --disable-wallet //报错libevent not found
  • sudo apt-get install libevent-dev
  • sudo make //第一次报错g++ internal compiler error:killed(program cc1plus) 第二次还是这个报错,clean再make还是这个问题,增加虚拟机运行内存到1.5g,编译通过,有几个warning暂时不理会,关于内存需求,这个在官网上的说明里也有明确提示

    C++ compilers are memory-hungry. It is recommended to have at least 1.5 GB of memory available when compiling Bitcoin Core. On systems with less, gcc can be tuned to conserve memory with additional CXXFLAGS:

    ./configure CXXFLAGS="--param ggc-min-expand=1 --param ggc-min-heapsize=32768"
  • sudo make install //安装可执行文件到目录下

8.31跟新,最后成功的话会有这些可执行文件

st_bitcoin-qt '/usr/local/bin'
libtool: install: /usr/bin/install -c bitcoind /usr/local/bin/bitcoind
libtool: install: /usr/bin/install -c bitcoin-cli /usr/local/bin/bitcoin-cli
libtool: install: /usr/bin/install -c bitcoin-tx /usr/local/bin/bitcoin-tx
libtool: install: /usr/bin/install -c test/test_bitcoin /usr/local/bin/test_bitcoin
libtool: install: /usr/bin/install -c bench/bench_bitcoin /usr/local/bin/bench_bitcoin
libtool: install: /usr/bin/install -c qt/bitcoin-qt /usr/local/bin/bitcoin-qt
libtool: install: /usr/bin/install -c qt/test/test_bitcoin-qt /usr/local/bin/test_bitcoin-qt
  • which bitcoind  //(显示/usr/local/bin/bitcoind)
  • which bitcoin-cli //(显示/usr/local/bin/bitcoin-cli)

上述两步可以确认bitcoin安装成功

4)在testnet启动bitcoin core

bitcoind -testnet  //输入后没显示,电脑发烫

另开一个终端 bitcoin-cli -testnet getinfo 可以看到是在加载区块的,刷新指令,blocks会增加

{   "version": 130200,   "protocolversion": 70015,   "blocks": 7456,   "timeoffset": -1,   "connections": 8,   "proxy": "",   "difficulty": 16,   "testnet": true,   "relayfee": 0.00001000,   "errors": "" }

bitcoin-cli -testnet getblockchaininfo 报错

error: Could not locate RPC credentials. No authentication cookie could be found, and no rpcpassword is set in the configuration file (/home/parallels/.bitcoin/bitcoin.conf)

需要设置密码控制对bitcoin core提供的应用程序编程接口,新建bitcoin.conf,配置信息如下

小型服务器资源不足配置示例

  • alertnotify=myemailscript.sh "Alert: %s" //运行指定的命令或脚本,通常通过电子邮件将紧急警报发送给该节点的所有者。
  • maxconnections=15//设置接受连接的最大节点数
  • prune=5000                        //通过删除旧的块,将磁盘空间要求降低到这个兆字节。可以看到~/.bitcoin/testnets内存保持在5.5g
  • minrelaytxfee=0.0001 //设置您将继续的最低费用交易。 低于此值,交易被视为零费用。 在内存受限的 节点上使用它来减少内存中交易池的大小。
  • maxmempool=200//将交易内存池限制在几兆字节
  • maxreceivebuffer=2500//将每连接内存缓冲区限制为 1000 字节的多个倍数。
  • maxsendbuffer=500//同上
  • rpcuser=bitcoinrpc
  • rpcpassword=CHANGE_THIS(自己改)

配置后重启 bitcoind -testnet -printtoconsole //测试网,输出显示在控制台上

alertnotify=myemailscript.sh "Alert: %s"

maxconnections=15

prune=5000

minrelaytxfee=0.0001

maxmempool=200

maxreceivebuffer=2500

maxsendbuffer=500

rpcuser=bitcoinrpc

rpcpassword=CHANGE_THIS

testnet=1

在bitcoin.conf里加上testnet=1,之后都不用每次打 -testnet了

bitcoin-cli -testnet getinfo//不要忘记testnet

bitcoin-cli -testnet getblockchaininfo //当前7.20记录时刻header 1354564

下载的块数据在~/.bitcoin/testnets目录下,以后要删除的话就是这里

du -a(s)h 可以查看文件所占内存大小,在~/.bitcoin下 du -ah testnets查看内存大小

要使用getawtransaction之类的命令访问交易须以配置bitcoin core构建完整的交易索引,这可以通过txindex实现,设置txindex=1,与prunes的设置是冲突的。(由于使用的是prunes配置,这里无法使用getblock,getblockhash,getrawtransaction等指令,这段错误)是由与没有加-testnet,可以使用getblockhash,bitcoin-cli -testnet getblockhash 1350000,bitcoin-cli -testnet getblock 0000000000000028198c4d52ecb33b594533a1a054e571ee30766a7997f5aa24 ,getrawtransaction,decoderawtransaction都可以运行。

附:在尝试centos上编译源码,比较不顺利,还没编译完

二、《精通比特币》

第一章 介绍

区块链,分布式账簿

第二章 比特币原理

总共发行21000000比特币,可以从千分之一(一毫比特币)到一亿分之一(一聪比特币)来交易

许多比特币都会包括新所有者的地址(买方地址)和当前所有者的地址(找零地址)

第三章 比特币核心

编译运行源码的介绍

第四章 密钥和地址

使用到bx做一些例子,bx的安装放在第四部分

每个密钥对包括一个私钥和一个公钥。 私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆曲线 乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可以使 用 一个单向加密哈希函数生成比特币地址(A)。这种非对称密码学的适用性 使得任何人都可以验证每笔交易的每个签名,同时确保只有私钥的所有者可以产 生有效的签名。

私钥,256位的二进制数,64位的16进制数

第五章 钱包

钱包里只含有钥匙,在某种意义上,比特币钱包是密钥链。

非确定性(随机)钱包,确定性(种子)钱包

第六章 交易

交易脚本和脚本语言

图灵非完备性

锁定脚本,脚本公钥(scriptpubkey),解锁脚本(scriptsig)

第七章 高级交易和脚本

7.2多重签名

7.3 p2sh

7.5时间锁7.5.4-7.5.6跳过,太枯燥了

第八章 比特币网络

完整的区块链节点是通过检查整个链中在它之下的数千个区块来保证这个UTXO 没有被支付,从而验证交易。而 SPV 节点是通过检查在其上面的区块将它 压在下面的深度来验证交易

第九章 区块链

9.9比特币的测试区块链

testnet--比特币的试验场:是用于测试的区块链,目前是testnet3,在2011年2月重启,在2017年超过20gb

segnet--隔离见证测试网络:已将segwit添加到testnets3

regtest--本地区块链:本地测试的封闭系统运行

第十章 挖矿与共识

10.5

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}

1722行,计算区块奖励函数

难度目标与目标调整 pow.cpp

第十一章 比特币安全

第十二章 比特币的应用

附录1.比特币白皮书

三、《区块链技术指南》

第二章 区块链基础

哈希函数,最常采用的是双SHA哈希函数

Merkle树是数据结构中的一种树

双重支付问题又称为“双花”问题

交易加密的非对称加密算法(椭圆曲线加密算法)ECC,一对数字相关的密钥,公钥可以通过算法从私钥中计算得出,而私钥不能从公钥中推出。

共识机制:pow(工作量证明),pos(权益证明),dpos(股份授权证明),分布一致性算法

第三章 区块链架构剖析

区块链管理的代码逻辑都在main.cpp程序中实现。

比特币使用berkeley db做钱包数据库。

3.3区块链2.0架构:以太坊区块链

比特币没有账户的概念,以太坊有两种类型账户:外部所有账户(eoa),合约账户(contract)

第四章 区块链中的密码学技术

4.1哈希算法 性质:抗碰撞性、原像不可逆、难题友好性

4.2 merkle数:merkle哈希树

4.3公钥密码算法 比特币使用的是secp256k1椭圆曲线

第五章 共识算法详解

5.1拜占庭容错算法 强一致性共识算法

故障节点被称为拜占庭节点,正常的节点为非拜占庭节点。

5.2 pow机制 最终一致共识算法,不适合于私有链和联盟链。工作量证明 proof of work

5.3 pos机制 权益证明 proof of stake

5.4 dpos机制 股份授权证明机制 delegate proof of stake

第七章 智能合约

7.4实例未测试

第八章 超级账本项目

超级账本实目前最大的区块链开源项目,目标实建立面向商业应用的分布式账本基础技术。

四、bitcoin explore 7.16的笔记全都没保存下来

参考http://www.8btc.com/bitcoin-explorer

1.docker的安装

参考官网,我是修改了镜像地址,两个镜像地址都修改为国内的阿里镜像

sudo docker run hello-world 作为测试

sudo docker image ls

sudo docker container ls -all/aq

2.根据参考的博文

sudo docker run -it fengyajie/bx-docker-alpine:1.0(-it 以交互模式运行容器,为容器重新分配一个伪输入终端)

五、《区块链开发指南》

第一章 区块链基础

短区块链(或有效区块链)中的区块没有作用,当比特币客户端转向另一个长区块链时,短区块链中所有有效的交易都将被重新加入到交易队列池中,并被包括在另一个区块中。短区块链中的区块收益不会在长链出现。

第二章 区块链进阶

2.2 counterparty

2.4 sidechains

第三章 密码学基础(看过图解密码技术,这部分跳过,这本书有点难看懂)

3.1 hash函数 

散列值(hash value)或消息摘要(message digest);典型的hash函数有两类:消息摘要算法(MD5)和安全散列算法(SHA)

第四章 比特币区块链开发

阅读更多 登录后自动展开

更多精彩内容