【区块链】比特币架构

比特币架构

2009年1月,在比特币系统论文发表两个月之后,比特币系统正式运行并开放了源码,标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统,比特币开展了一场规模空前的加密数字货币体验。在区块链1.0阶段,区块链技术的应用主要聚集在加密数字货币领域,典型代表即比特币以及从比特币系统代码衍生出来的多种加密数字货币。

image-20240505113346356

加密数字货币的“疯狂”发展吸引了人们对区块链技术的关注,对于传播区块链技术起到了很大的促进作用,人们开始尝试在比特币系统上开发加密数字货币之外的应用,比如存证、股权众筹等。但是比特币系统作为一个加密数字货币设计的专用系统,存在如下几个问题:

  1. 比特币系统内置的脚本系统主要针对加密数字货币交易而专门设计,不是图灵完备的脚本,表达能力有限,因此在开发诸如存证、股权众筹等应用时,有些逻辑无法表达,而且比特币系统内部需要做大量开发,对开发人员要求高、开发难度大,因此无法进行大规模的非加密数字货币类应用开发
  2. 比特币系统在全球范围内只能支持每秒7笔交易,交易记账后追加6个区块才能比较安全地确认交易,追加一个区块大约需要10分钟,意味着大约需要1个小时才能确认交易,不能满足实时性要求较高的应用需求

比特币是基于P2P架构的数字货币系统:它的结构总体上分为两部分,一部分是前端,包括钱包(Wallet)或图形化界面;另一部分是运行在每个节点的后台程序,包括挖矿、区块链管理、脚本引擎以及网络管理等功能。下面是比特币的架构示意图:

image-20240505113701594

比特币架构分为前端和后端,下面分别介绍。

比特币前端

  1. 比特币前端-钱包:钱包保存用户的私钥数据库,管理用户的余额,提供比特币交易(支付、转账)功能,一般可分为冷钱包(ColdWallet)和热钱包(HotWallet)。

    • 冷钱包:互联网不能访问私钥的钱包:往往依靠“冷”设备确保比特币私钥的安全。如不联网的电脑、手机等。避免被黑客盗取私钥的风险,但可能面临物理安全风险,如电脑丢失损坏等。

    • 热钱包:互联网能够访问私钥的钱包:热钱包往往是在线钱包的形式。使用热钱包时,最好在不同平台设置不同密码,且开启二次认证,以确保自己的资产安全。

      image-20240505114428553

  2. 比特币前端-HTTP/JSONRPCAPI

    • 比特币提供HTTP/JSONRPCAPI接口,供外部通过比特币接口控制比特币节点
    • JSON-RPC是一种无状态,轻量级的远程过程调用协议(RemoteProcedureCall,RPC)
  3. 比特币前端-命令行工具bitcoin-cli:bitcoin-cli提供一个命令行工具来控制比特币节点,该命令行工具通过JSONRPCAPI接口访问比特币后台bitcoind。用户可以通过发命令来完成比特币的各项功能,例如查询余额、支付、转账等。

  4. 比特币前端-比特币浏览器bx:比特币提供一个跨平台的C++libbitcoin库,该库支持比特币全节点服务端和浏览器(BitCoinExplorer(bx))作为客户端命令行工具。比特币浏览器命令提供与bitcoin-cli一样的基本功能。但同时bx提供bitcoin-cli没有的一些密钥管理功能和处理工具

  5. 比特币前端-图形开发工具Qt:比特币核心是比特币使用最广泛的客户端,它使用C++开源用户界面开发工具Qt所开发的桌面客户端。Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用开发GUI程序,也可用于开发非GUI程序。Qt是完全面向对象的,很容易扩展,并且允许真正的组件编程。

比特币后端

比特币节点后端负责参与比特币网络的通信互联,维护区块链,验证区块、交易,广播、转播传递区块交易信息。比特币的后台程序主要是由bitcoind,以及挖矿节点程序构成。比特币核心bitcoin-qt实际上是包含前后端(除挖矿功能以外)的一体化节点。

  1. 比特币节点后端-区块链管理:区块链管理涉及区块链下载、连接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。区块链管理的代码逻辑都在main.cpp程序中实现。
  2. 比特币节点后端-区块验证:交易验证模块会基于以下条件检查收到的比特币交易是否合规。
  3. 比特币节点后端-邻节点管理:当一个新比特币节点做初始启动(bootstrap)的时候,它需要发现网络中的其他节点,并与至少一个节点连接。一般是与一个已知的节点在8333端口建立TCP连接。连接的“握手”流程发送一个版本信息,包括:P2P协议版本,本节点支持的服务,当前时间,对方节点IP地址,本节点IP地址,比特币软件版本,以及本节点当前区块链的长度,对方节点收到握手信息后会回复一个收到确认的信息。
  4. 比特币节点后端-共识管理:比特币里广义的共识管理(Consensus)包括挖矿、区块验证和交易验证规则。

image-20240505114955372

  1. 比特币节点后端-规则管理:比特币的共识规则是所有节点都必须遵守的规则(policy),而每个节点可以采用一些共识规则以外的个性化规则(比如一个节点可以拒绝保存、中转大于200KB的交易)。这部分的规则由规则管理模块实现,目前放在policy子目录中。

image-20240505115228369

  1. 比特币节点后端-密码模块:密码模块(Crypto)主要是处理比特币地址,采用RIPEMD160和SHA-256算法以及Base-58编码来生成比特币地址。

  2. 比特币节点后端-签名模块:比特币采用椭圆曲线数字签名算法ECDSA (EllipticCurveDigitalSignatureAlgorithm)来实现数字签名以及生成公钥。2015年之后,比特币开源社区发布了由Certicom公司推荐的具有更好性能的secp256k1椭圆曲线,放在secp256k1子目录中。

  3. 比特币节点后端-脚本引擎:比特币脚本语言是一种专门设计的基于堆栈的编程脚本语言。基于堆栈的语言指令只按顺序执行一次。也就是说没有循环或跳转指令,因此脚本的指令数可以决定一个程序运行时间的上限和所需的内存上限,这种基于堆栈的运算平台不是图灵完备的运算平台。比特币的脚本语言非常小,只能有256个指令,每个指令是一个字节长。这256个指令中,75个是保留指令,15个已废弃。下图展示部分比特币常用指令:

    image-20240505115707997

  4. 比特币节点后端-挖矿:比特币最早的挖矿程序是cpuminer,是通过CPU来挖矿的。挖矿设备经过CPU、GPU、FPGA,到现在基本都使用ASIC挖矿设备。

  5. 比特币节点后端-HTTP/JSONRPC服务端:比特币在启动的时候,初始化程序init.cpp会启动HTTP/JSONRPC服务端的线程组。

  6. 比特币节点后端-BerkeleyDBLevelDB数据库:

    • BerkeleyDB是一个开源的文件数据库(SleepycatSoftware公司开发),介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,主要用来备份用户的密钥。
    • LevelDB用来存储区块的索引和UTXO记录,Google公司实现的非常高效的键值(KeyValue)数据库,目前的版本能够支持几十亿级别的数据量。LevelDB的数据是冗余数据,可以用原始区块链数据来重建。如果没有LevelDB的数据,比特币的校验和其他操作都会变得非常缓慢。

    image-20240505120233578

  7. 比特币节点后端-P2P网络管理:P2P网络管理的代码主要是在P2P网络上实现和其他邻节点的通信功能。这些通信功能包括:发现邻节点;连接并管理与邻节点的Socket连接;与邻节点交换不同的P2P消息(包含区块和交易);有时在特殊情况下,会禁止异常行为的邻节点的连接。

  8. 比特币节点后端-队列管理:比特币采用PieterHintjens开发的ZeroMQ作为消息队列管理和消息分发工具。ZeroMQ号称“史上最快消息队列”,由C语言开发。ZMQ是一个简单好用的传输层,提供像框架一样的一个socketlibrary,它使得Socket编程更加简单、简洁,性能更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/319855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢? 理解TIME_WAIT状态 流量控制(可靠性效率) 滑动窗口 拥塞…

深度学习中的注意力机制二(Pytorch 16)

一 Bahdanau 注意力 通过设计一个 基于两个循环神经网络的编码器‐解码器架构,用于序列到序列学习。具体来说,循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量,然后循环神经网络 解码器根据生成的词元和上下文变量按词元生成…

【iOS】KVO

文章目录 前言一、KVO使用1.基本使用2.context使用3.移除KVO通知的必要性4.KVO观察可变数组 二、代码调试探索1.KVO对属性观察2.中间类3.中间类的方法3.dealloc中移除观察者后,isa指向是谁,以及中间类是否会销毁?总结 三、KVO本质GNUStep窥探…

IDEA基于Maven构建项目

IDEA基于Maven构建项目 一、Maven简介 Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念(POM),Maven 可以从中心信息中管理项目的构建、报告和文档。 Apache Maven 可以用于构建和管理任何基于 Java 的项目。 下载地址…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色:保存最近使用的多个颜色&…

OpenCV如何使用 GDAL 读取地理空间栅格文件(72)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录(持续更新中......) 目录 目标 代码: 解释: 如何使用 GDAL 读取栅格数据 注意 …

ElasticSearch自动补全

一、拼音分词器: 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 GET /_analyze {"text":"我爱螺蛳粉…

.Net MAUI 搭建Android 开发环境

一、 安装最新版本 VS 2022 安装时候选择上 .Net MAUI 跨平台开发 二、安装成功后,创建 .Net MAUI 应用 三、使用 VS 自带的 Android SDK 下载 ,Android镜像、编译工具、加速工具 四、使用Vs 自带的 Android Avd 创建虚拟机 五、使用 Android 手机真机调试

【小菜鸟之---Ansible基础详解】

文章目录 1 【Ansible简介】1.1简介1.2 Ansible 特点1.3 Ansible的工作机制1.4Ansible任务工作模式 2【安装部署】2.1安装命令2.2 Ansible配置文件2.3主机清单配置2.4 基于ssh免密登录2.5常用命令 3【Ansible常用模块】3.1 ping模块3.2 shell模块3.3 command模块3.4 copy模块3.…

百度下拉框负面信息如何删除?

百度头条360等搜索引擎,作为人们获取信息的主要途径之一。然而,一些知名的企业或个人可能会面临在搜索的下拉框中出现负面信息的问题,这可能对其声誉和形象造成不良影响。小马识途营销顾问根据自身从业经验,针对这类情况提出以下建…

一、写给Android开发者之harmony入门

一、创建新项目 对比 android-studio:ability类似安卓activity ability分为两种类型(Stage模型) UIAbility和Extensionability(提供系统服务和后台任务) 启动模式 1、 singleton启动模式:单例 2、 multiton启动模式&#xff1…

【软件测试理论002】认识软件缺陷、缺陷生命周期、缺陷分类

目录 1 认识软件缺陷 1.1 什么是软件缺陷 1.2 缺陷存在哪些方面 1.3 软件缺陷示例 1.4 软件缺陷的表现形式 1.5 软件缺陷产生的原因 1.6 软件缺陷的根源 1.7 软件缺陷修复的费用 2 软件缺陷的信息分类 2.1 软件缺陷的生命周期 2.2 软件缺陷的信息 2.3 软件缺陷分类…

Node.js -- mongoose

文章目录 1. 介绍2. mongoose 连接数据库3. 插入文件4. 字段类型5. 字段值验证6. 文档处理6.1 删除文档6.2 更新文档6.3 读取文档 7. 条件控制8. 个性化读取9. 代码模块化 1. 介绍 Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/ 方便使用代码操作mo…

CNN实现卫星图像分类(tensorflow)

使用的数据集卫星图像有两类,airplane和lake,每个类别样本量各700张,大小为256*256,RGB三通道彩色卫星影像。搭建深度卷积神经网络,实现卫星影像二分类。 数据链接百度网盘地址,提取码: cq47 1、查看tenso…

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架,它结合了 Rust 的安全性和性能优势,以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点: 安全性:Rust 是一种注重安全性的编程语言,…

Redis-分片机制

概述 业务需要:由于单台redis内存容量是有限的,无法实现海量的数据实现缓存存储 概念:由多个redis节点协助工作的机制就是redis的分片机制 作用:为了实现redis扩容 特点:分片机制把该机制中包含的多台redis缓存服务…

PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写 PostgreSQL 查询计划openGauss 查询计划拓展对比 看腻了文章就来听听视频讲解吧:https://www.bilibili.com/video/BV1oH4y137P7/ 数据库类型数据库版本PostgreSQL16.2openGauss6.0 创建测试表…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里,大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上,常用重点应用。所以车厂对应用性能的要求比较高。 主要包括: 应用冷启动达到***ms。应用热(温)启动达到***ms应…

C语言 | Leetcode C语言题解之第70题爬楼梯

题目: 题解: int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int) round(fibn / sqrt5); }

Vue通过下拉框选择字典值,并将对应的label以及value值提交到后端

产品品种从字典中获取 产品性质也是从字典中获取 字典当中的保存 dict_type表 dict_data表 在表单提交的方法中 1.因为做的产品性质是多选,它会以数组的方式提交,所以需要先将Json格式转变为String JSON.stringify(this.form.nature) 2.提交表单&…