区块链系统探索之路:比特币核心的编译和探索

前几节我们研究了椭圆曲线,有限域等比特币和区块链所依赖的底层算法。问题在于这些算法不是独立存在,而是作为模块嵌入到整个区块链的体系之中。因此不了解区块链的体系组成或应用场景,那么我们就很难理解这些算法衍生出来的概念或者基于他们的作用,所以本节我们把区块链最原始的模态,也就是比特币核心编译和运行起来,先获得初步感性体验,然后在后面的章节中,我们能更好的明白椭圆曲线,有限域,如何组成钱包地址,为何数据在区块链系统中传输还需要各种奇奇怪怪的数据压缩等问题。

首先我们使用ubuntu系统,然后通过git clone https://github.com/bitcoin/bitcoin.git 获取比特币内核代码,注意我们需要使用v0.21.0版本,因为更早以前的版本会因为莫名其妙的原因难以编译通过,使用下面代码进行分支切换:
git checkout v0.21.0

首先我们需要安装一些编译依赖库,使用如下命令进行安装:
sudo apt install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev

sudo apt install libdb-dev libdb+±dev

sudo apt install libminiupnpc-dev

sudo apt install libzmq3-dev

sudo apt install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools

sudo apt install libqrencode-dev

代码下载后我们进入目录bitcoin,由于比特币内核需要依赖伯克利db4因此我们需要预先安装,我们所下载的代码就包含了对应的安装脚步,进入下载代码的根目录bitcoin,然后执行如下命令:
$ ./contrib/install_db4.sh `pwd`
改命令把db4的依赖库就安装在当前目录。上面代码运行完成后,它会输出如下提示:

 export BDB_PREFIX='/home/ubuntu/bitcoin/db4'
 ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include"

这是在设置环境变量,使得比特币内核在编译时知道怎么获取db4代码库所在位置,因此我们也分别执行上面两行代码对应的命令:
export BDB_PREFIX=‘/home/ubuntu/bitcoin/db4’
./configure BDB_LIBS=“-L B D B P R E F I X / l i b − l d b c x x − 4.8 " B D B C F L A G S = " − I {BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I BDBPREFIX/libldbcxx4.8"BDBCFLAGS="I{BDB_PREFIX}/include”

然后执行本地脚步:
./autogen.sh
然后我们需要通过config.sh脚步设置编译选项,在编译中我们需要忽略掉伯克利db版本,因此执行如下命令:
./configure --with-incompatible-bdb
然后执行如下命令进行源码编译:
make -j “ ( ( (( (((nproc)+1))”
上面命令意思是调用当前所有cpu内核通过并行编译的方式加快速度。成功编译后再执行如下命令将比特币内核的可执行文件进行安装,这样我们就能在系统中直接运行bitcoind命令启动比特币内核:
sudo make install

编译和安装完成后,我们可以直接通过命令行来调用比特币内核,在第一次运行时我们需要设置一个配置文件,在bitcoin的安装目录创建一个bitcoin.conf文件:
vim /home/ubuntu/.bitcoin/bitcoin.conf(注意这是我自己的路径,读者需要确定自己的安装路径)
然后设置用户名和密码,其内容类似如下:
rpcuser=you_name
rpcpassword=your_password
在配置文件中,我们可以设置比特币内核把当前服务器作为“完全节点”,也就是它会把比特币所有链上数据都下载到本地,如果你的服务器有足够的内存和带宽就可以这么做,我估计当前比特币网络的线上数据应该T以上了,由于我的服务器硬盘也就是几十个G,因此我这里必须限制比特币内核跟整个网络的数据交互上限,因此我在配置文件里面增加如下约束:
maxconnections=15
prune=5000
minrelaytxfee=0.0001
maxmempool=200
maxreceivebuffer=2500
maxsendbuffer=500

大家可以查一下这些配置的意义,这里我们不多费唇舌,完成上面配置后,我们就可以运行比特币内核了,使用如下命令启动比特币内核:
bitcoind -daemon

启动后我们就可以使用比特币客户端跟内核交互:
bitcoin-cli -getinfo
执行上面命令后,如果你看到类似如下输出,那表明比特币内核启动正常:
{
“version”: 210000,
“blocks”: 0,
“headers”: 120000,
“verificationprogress”: 1.142581983030402e-09,
“timeoffset”: 1,
“connections”: {
“in”: 0,
“out”: 3,
“total”: 3
},
“proxy”: “”,
“difficulty”: 1,
“chain”: “main”,
“relayfee”: 0.00010000,
“warnings”: “”
}

通过bitcoin-cli 执行的命令本质上是向比特币内核发送rpc请求,然后对方返回相应数据,这些命令其实也是内核对外提供的API接口,我们可以用如下命令去查询某个接口的具体用法,例如执行如下命令:
bitcoin-cli help getblockhash
那么返回的数据为:

请添加图片描述


根据提示,我们可以通过getblockhash接口或命令获得给定标号区块对应的哈希值,例如我们执行如下命令:
bitcoin-cli getblockhash 1000
在我本机上得到的结果就是:

请添加图片描述


在后面我们会看到,区块链使用了多种压缩算法对数据进行压缩编码以便于传输,这里我们可以通过比特币客户端解压一段数据感受一下,执行命令如下:

bitcoin-cli decoderawtransaction
 0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000

上面命令执行后所得结果如下:

{
  "txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
  "hash": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
  "version": 1,
  "size": 258,
  "vsize": 258,
  "weight": 1032,
  "locktime": 0,
  "vin": [
    {
      "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig": {
        "asm": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
        "hex": "483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf"
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.01500000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA"
        ]
      }
    },
    {
      "value": 0.08450000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
        "addresses": [
          "1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK"
        ]
      }
    }
  ]
}

后面我们也会详细的探讨区块链在数据传输过程中,数据的压缩算法和压缩格式。我们也能通过代码的方式跟比特币内核交互,很多编程语言都提供了相应的接口包,例如python就python-bitcoinlib能用来与比特币内核交互,我们看看相关例子,首先安装该库:

pip install python-bitcoinlib

然后创建文件python_bitcoin.py,添加内容如下:

from bitcoin.rpc import RawProxy

#连接比特币内核
p = RawProxy()

info = p.getblockchaininfo()

print(info['blocks'])

上面代码向比特币内核查询当前区块数量,在我本机运行上面代码后返回结果如下:
434100
也就是在我当前机器上,内核下载了 434100 个区块。需要注意的是,如果我们运行的比特币内核没有以“完全节点”的形式启动,那么有些接口就无法返回有效数据,例如执行如下命令获取区块编号为 277316 的哈希:
bitcoin-cli getblockhash 277316
命令执行后返回的结果为:
0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
如果我们使用getblock 命令并通过上面哈希获取区块数据的话就有可能返回错误,例如执行:
bitcoin-cli getblock 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4
在我本机上运行上面代码后返回:
error code: -1
error message:
Block not available (pruned data)

由于我本节硬盘空间有限,因此我没有使用“完全节点”模式来运行内核,于是内核在同步区块链数据时,它只把部分区块的头部信息下载到本地,这样就导致本地无法读取区块的数据内容。

下一节我们看看如何使用我们前几节提到的算法实现钱包地址,同时也通过比特币内核提供的接口来验证我们算法的正确性。更多内容请在b站搜索coding迪斯尼

原文地址:https://blog.csdn.net/tyler_download/article/details/131353202

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币安智能链测试网网上的编译测试部署流程,以Pancake上的USDC-BUSD最新Curve版流动池的农场质押为例,详细介绍了完整的操作流程。_怎么在bsc网络上部署应用
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去信任的分布式记账系统。交易签名只能保证交易不是他人伪造的,却不能阻止交易的发起者自己进行多重交易,即交易的发起者将一个比特币同时转账给两个人,也就是所谓的双花。比特币应用的区块链场景也叫做公链,因为这个区块链对所有人都是公开的。除此之外,还有一种区块链应用场景,被称作联盟链。区块链的出现,使得低成本,去信任的跨组织合作成为可能,将重构组织间的关系,这个关系既包括企业间的关系,也包括政府和企业间的关系,还有政府部门间的关系。
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“出生高峰期”,元宇宙可以说是功不可没。此前,量子位发布了《虚拟数字人深度产业报告》,报告显示,到2030年我国虚拟数字人整体市场规模将达到2700亿元。其中,“身份型虚拟人”市场规模预计达到1750亿元,占主导地位,而“服务型虚拟人”总规模也将超过950亿元。得益于AI、VR/AR 等技术的发展,虚拟人的应用场景正在从传统的虚拟偶像等娱乐行业迈向更多元化的领域。_最喜欢的虚拟角色
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用户需求、兴趣和行为,你可以更好地定位你的目标受众,并在市场中找到你的定位。在设计你的Web3.0项目时,注重用户界面的友好性、交互流畅性和功能的创新性,以提供独特的用户体验。通过与有影响力的人或组织进行合作,推广你的Web3.0项目。通过与他们分享你的项目并抓住他们的推荐,可以迅速获得更多的关注度。通过优化你的网站和内容,将有助于提高你的排名,并增加有机流量。通过提供奖励激励计划,如空投、奖励机制等,激励用户参与你的Web3.0项目。的人或组织合作,可以增加你的项目的曝光度。
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的列表,列出了在 Solidity 智能合约中容易反复出现的问题和漏洞。Solidity 中的安全问题可以归结为智能合约的行为方式不符合它们的意图。我们不可能对所有可能出错的事情做一个全面的列表。然而,正如传统的软件工程有常见的漏洞主题,如 SQL 注入、缓冲区超限和跨网站脚本,智能合约中也有反复出现的。_solidity安全漏洞
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法_编译比特币
文章浏览阅读884次。四水归堂,是中国建筑艺术中的一种独特形式。这种形式下,由四面房屋围出一个天井,房屋内侧坡向天井内倾斜,下雨时雨水会从东西南北四方流入天井,从而起到收集水源,防涝护屋的作用,寓意水聚天心,天人合一。在科技产业当中,很多时候我们需要学习古人的智慧与意蕴,尝试打通各个生态,聚四方之力为我所用,这样才能为最终用户带来最大化价值。随着数字化、智能化的发展,算力成为生产力的根基。在这一大背景下,算力需要贯通软..._超聚变csdn
文章浏览阅读1k次,点赞24次,收藏19次。云计算和区块链是当代科技领域两个备受关注的核心技术。本文将深入探讨云计算和区块链的发展历程,详细剖析其起初阶段的奠基、面临的问题、业务内容、当前研究方向、用到的技术、实际应用场景、未来发展趋势,并提供相关链接供读者深入了解。
文章浏览阅读1.5k次。融入对等网络的奥妙,了解集中式、全分布式和混合式对等网络的差异,以及区块链网络的结构与协议,让你跃入区块链的连结网络。揭开密码学的神秘面纱,探寻对称密码学、非对称密码学、哈希函数、数字签名等关键技术,让你了解信息安全的核心。解码共识算法的精髓,从理论到实践,从PoW、PoS到PBFT,让你深入了解区块链如何达成共识。探索智能合约的世界,从定义到生命周期,从执行引擎到开发与部署,带你进入无限可能的合约领域。了解令人惊叹的区块链世界,从概念到价值,从发展历程到政策法规,一篇章串联出区块链的精髓。
文章浏览阅读777次。8 月份,加密货币市场经历了明显的波动,比特币价格波动幅度较大。与此同时,NFT 市场出现大幅下跌,引发了人们对这一新兴行业未来发展趋势的担忧
文章浏览阅读8.8k次,点赞53次,收藏37次。近二十年来,我国信息科技发展日益成熟,出现的网络完全问题也是“百花齐放”。而元宇宙作为5G技术、AR/VR技术、云计算以及区块链等技术的组合体,其安全性指定会被人们所广泛关注。根据前面所讲,元宇宙融合了虚拟世界和现实世界,通过数据将现实世界的各种元素映射到数字化的虚拟世界中。所以没有数据,就等于没有元宇宙的一切;没有信息安全,元宇宙的社会生产、生活就不能正常有序地进行。所以足以可见数据安全、信息安全对元宇宙发展起到的重要作用!!_元宇宙 安全计算
文章浏览阅读1.4k次。最早使用历史 1991年采用 时间戳 追溯 数字文档,之后 2009年后创始人**中本聪** (satoshi nakamoto )日裔美国人,在设计比特币数字货币中将此理念写入应用程序中_web3.0学习
文章浏览阅读1.7k次。DeFi收益来源全面概述_drfi收益
文章浏览阅读941次,点赞17次,收藏21次。号外:教链内参1.28《从BTC现货ETF的近期数据看到的》隔夜BTC经历现货ETF通过后的情绪冷静,一度破位40k后又逐渐修复至42k上方。请珍惜42k的BTC吧。也许到下个周期,我们将不再有机会见到这个高度的BTC了。下面,让我们重温,42k的BTC,在过去四年穿越牛熊的过程中,带给我们的启迪吧。需要提醒的是,历史文字,自有历史局限性,回顾,也须带着批判性的目光阅读和审视。2021年2月8日,...
文章浏览阅读1.2k次,点赞23次,收藏21次。其实一开始我也是这么想的,但根据PoW算法机制,如果你的计算量不够大,是无法控制区块链的走向的,也就是说,即使你投入了大量的成本用于完成任务,也不能保证自己成功。例如,你持有100个币,总共持有了30天,那么,此时你的币龄就为3000,这个时候,如果你发现了一个PoS区块,那么你的币龄就会被减去一定的值,每减少365个币龄,将会从区块中获得0.05个币的利息(可理解为年利率5%),那么在这个案例中,利息=3000×5%/365=0.41个币。前面说过,谁的算力强,谁最先解决问题的概率就越大。
文章浏览阅读1.9k次。这里主要实现的部分继续下去,对 Blockchain 这个对象有一些修改,如果使用 TS 的话可能要修改对应的 interface,但是如果是 JS 的话就无所谓了。需要安装的依赖有:express现在的 express 已经不内置 body-parser,需要作为单独的依赖下载request不下载会报错,是使用 request-promise 所需要的依赖和已经 deprecated 了,具体 reference 可以参考。_js区块链
文章浏览阅读1k次,点赞19次,收藏19次。作者:Zach Pandl Grayscale编译:象牙山首席村民 碳链价值以太坊在2023年取得了丰厚的回报。但表现不如比特币以及其他一些智能合约公链代币。我们认为,这反映了今年比特币特有的积极因素以及以太坊链上活动的缓慢复苏。尽管以太坊的涨幅低于比特币,但从绝对值和风险调整值来看,今年以太坊的表现优于传统资产类别。以太坊不断增长的L2生态系统的发展可能会吸引新用户,并在2024年支撑以太币的...
文章浏览阅读908次,点赞20次,收藏20次。通证是以数字形式存在,代表的是一种权利、一种固有和内在的价值。徐教授告诉我:多年的职业经历,多年的为易货贸易的思考,认识到在处理贸易和经济领域的关系时,应以提高人民生活水平、保证社会成员充分就业、保证就业成员实际收入和有效需求的大幅稳定增长、实现世界资源的充分利用以及扩大货物的生产和交换为目的,期望通过达成互惠互利安排,实行公开、公平、公正的“三公原则”,开展国家与国家、企业与企业之间的易货贸易,规避因信用问题引起的各类风险,消除国际贸易中的歧视待遇,促进全球国家的经济发展,从而为实现上述目标做出贡献。
文章浏览阅读2.5k次。由于webase文档原因,查找起来比较局限,有时候想找一个api却又忘了在哪个模块的目录下,需要一步一步单独点,而利用文档自带的检索功能又因为查找文档全部信息,显得十分缓慢,所以整理了有关WeBASE的api列表但不可否认,现在只有列表,没有对应的页面跳转,文章目的也只是为了多了解webase的接口_webase私钥管理里获取
文章浏览阅读1.4k次,点赞28次,收藏21次。基于​openzeppelin来构建我们的NFT,并用一个例子来手把手的说明如何在opensea快速发布自己的NFT智能合约(ERC721)。