【区块链】比特币架构

比特币架构

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.mzph.cn/bicheng/6785.shtml

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

相关文章

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换,使用的是ucontext_t结构体,和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体,并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考:https://en.wikipedia.org/wiki/Ray_casting, ThreeJS中,提供了Raycaster类,用于进行鼠标拾取,即:当三维场景中鼠标移动时,利用光线投射,…

SpringCloudAlibaba:4.1云原生网关higress的搭建

概述 简介 Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio Envoy为核心构建的下一代云原生网关, 实现了流量网关 微服务网关 安全网关三合一的高集成能力,深度集成Dubbo、Nacos、Sentinel等微服务技术栈 定位 在虚拟化时期的微服务架构…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner,只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤: 首先初始化时候假设每个anchor的mask都是-1,表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试(Unit Testing)和 e2e 测试(End-to-End Testing,端到端测试,简称 e2e 测试),这是我第一次给后端项目写测试,发现和之前给前端项目写测试还…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使…

Linux线程安全,互斥量和条件变量

文章目录 一、 Linux线程互斥1. 进程线程间的互斥相关背景概念(1) 临界资源和临界区(2) 互斥和原子性 2. 互斥量mutex3. 互斥量的接口4. 互斥量实现原理探究 二、 可重入VS线程安全1. 概念2. 常见的线程不安全的情况3. 常见的线程…

【superset】基于MySQL的BI数据分析可视化实战案例(已更新)

1.熟悉、梳理、总结下superset可视化分析实战案例知识体系,一直想探索有效可用的可视化分析方案,大多收费或不好用,这里,借此机会总结、更新下。 2.复杂度高,遇到并解决的问题较多,尝试了很多次。 3.欢迎批评指正,跪谢一键三连! 基于MySQL的BI数据分析可视化实战案例文…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展,其核心目标是将 Kubernetes 转化为一个通用的控制平面,使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能,Crossplane 对 Kubernetes 集群…

rv1126的rknn1.7.5自有模型训练部署

几乎一年前, 弄过一次rv1126的平台的推理部署, 一年时间过去了, rknn从1.7.1, 进化到了1.7.5,原有的代码不太好用了, 因为最近有个客户要做1126平台的推理, 今天下午就花了几个小时, 从头再捋了一遍. 模型训练 这部分, 跟3588平台差不多, clone下yolov5的仓库, 并check out到…

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…

Day15-JavaWeb开发-Maven高级-分模块设计与开发继承与聚合私服

1. Maven高级-分模块设计与开发 2. Maven高级-继承与聚合 2.1 继承关系实现 2.2 版本锁定 2.3 聚合实现 3. Maven高级-私服 3.1 私服-介绍 3.2 私服-资源上传与下载 4. Web开发-完结

Nginx(参数设置总结)

文章目录 Nginx&#xff08;工作机制&参数设置&#xff09;1.Master&Worker工作机制1.示意图2.解释3.Nginx争抢机制4.accept_mutex解决惊群现象5.多进程结构不用多线程结构的好处6.IO多路复用&#xff0c;实现高并发7.优势 2.参数配置1.work_processes1.基本介绍2.work…

15_Scala面向对象编程_访问权限

文章目录 Scala访问权限1.同类中访问2.同包不同类访问3.不同包访问4.子类权限小结 Scala访问权限 知识点概念 private --同类访问private[包名] --包私有&#xff1b; 同类同包下访问protected --同类&#xff0c;或子类 //同包不能访问(default)(public)默认public --公…

【电子通识】为什么IC内部偏置会用到恒流源?

在查看芯片手册时&#xff0c;我们经常会发现芯片框图中出现恒流源。下图所示LM358运算放大器规格书中功能框图的恒流源&#xff1a; 电源芯片SS端内部的恒流源&#xff1a; 其实&#xff0c;IC内部电路的偏置&#xff0c;大多通过恒流源或者恒压源来提供。这与电源波动影响到…

【微服务】分布式事务(通过Seata解决分布式事务问题)

分布式事务 分布式事务Seata微服务集成SeataXA模式XA模式使用 AT模式AT模式实现 分布式事务 在分布式系统中&#xff0c;如果一个业务需要多个服务合作完成&#xff0c;而且每一个服务都有事务&#xff0c;多个事务必须同时成功或失败&#xff0c;这样的事务就是分布式事务&am…

力扣 647. 回文子串

题目来源&#xff1a;https://leetcode.cn/problems/palindromic-substrings/description/ C题解1&#xff1a;暴力解法。不断地移动窗口&#xff0c;判断是不是回文串。 class Solution { public:int countSubstrings(string s) {int len s.size();int res 0;for(int i 0;…

vscode如何配置python

Visual Studio Code配置Python环境 打开Visual Studio Code&#xff0c;点击主界面最左侧最下的选项&#xff08;extension&#xff09;,在搜索框中输入“python”,点击“Install”进行安装。 如下图所示&#xff1a; 重启或点击“Reload”(重载)后&#xff0c;即可使用&…