【区块链】比特币架构

比特币架构

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编程更加简单、简洁,性能更高。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中,很常见的效果,就是容器中的内容缓慢地向下移动,直到底部停止,然后快速滚动回顶部,然后接着缓慢滚动到底部。并且在特定的情况下,还需要进行一些小交互,那就还得让…

RabbitMQ之生产批量发送

为什么要用生产批量发送? 批量发送消息,可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送: ba…

FreeRTOS低功耗模式(1-19)

低功耗模式简介(了解) 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发 stm32的低…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址:https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址:https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像,可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能,之前安装的是standard版本,无奈只能重新安装。网上查了一番,使用的方法都比较传统老旧:下载安装包手动安…

多线程局部存储技术

问题 多线程上下文中,每个线程需要使用一个专属的全局变量,该如何实现? 代码示例 一种可能的解决方案 test1.c #define _GNU_SOURCE /* To get pthread_getattr_np() declaration */ #define _XOPEN_SOURCE > 500 || _POSIX_C_SOURC…

谷歌上架,为什么会触发填表单,可以避免吗?怎么填表单可以提高通过率?

在谷歌上架过程中,相信大部分开发者都有收到过谷歌发来表单填写的邮件通知,要求开发者们在14天内根据表单要求回复关于应用部分情况。邮件如图: 根据触发填表单的开发者分享的经验来看,填完表之后出现的情况不尽相同,且…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP,使AR4和AR3成为eBGP,AR4和AR5成为iBGP对等体…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式,讲着讲着越讲越多。JVM这一块吧,知识比较散比较多,如果深研究下去如死扣《深入理解Java虚拟机》,这本书很深很细,全记住是不可能的,其实也没必要。趁这个机会直接把…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中,经常会遇到一些错误信息的返回,存在的可能性有,参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误,可以通过perror函数输出具体描述,或者通过str…

nacos-server-1.2.1启动

1、双击startup.cmd 2、启动日志 3、访问http://192.168.26.210:8848/nacos/index.html 4、登录 用户名:nacos 密码:nacos

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript(简称ES,是JavaScript的标准规范)支持面向对象编程,通过构造函数模拟类,原型链实现继承,以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建,使用原型链共享方法和属…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

小白如何搭建git

1、安装git 在Windows上安装git: 关注微信公众号“机器人学”回复 “搭建git” 利用百度云网盘下载安装包,建议下载如下版本的否则可能会出现错误。 安装完成后,在开始菜单里Git->git bash,弹出命令窗说明git安装成功。 鼠标右…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介:使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介:用户们可以在系统上面录入自己的个人信息,录入后还可以对信息进行修改,网站可以对用户上传的音频文件进行识别,然后进行垃圾分类。 背景&#xf…

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda (1)】 1、前言2、环境配置1、对于jetson orin nx 的cuda环境2、对于Ubuntu 20.04下cuda环境 3、自我总结-安装流程1、在ubuntu下,如果想使用cuda平台,应该注意什么 和 都安装什么…

BGE向量模型架构和训练细节

模型论文:https://arxiv.org/pdf/2309.07597 模型数据:https://data.baai.ac.cn/details/BAAI-MTP 训练数据 由无标签数据和有标签数据组成。 无标签数据使用了悟道等数据集,有标签数据使用了dureader等数据集。 都是文本对,对于…

rust使用Atomic创建全局变量和使用

Mutex用起来简单,但是无法并发读,RwLock可以并发读,但是使用场景较为受限且性能不够,那么有没有一种全能性选手呢? 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后,就正式支持原子类型。原子指的是一系列…

【redis】Redis数据类型(五)ZSet类型

目录 类型介绍特点补充 使用场景 Zset类型数据结构ziplist:压缩列表(参考之前的文章)skiplist:跳表解析 面试题:MySQL索引为什么用B树而不用跳表区别总结 常用命令ZADD示例 ZREM示例 ZCARD示例 ZCOUNT示例 ZSCORE示例 …

在线OJ——链表经典例题详解

引言:本篇博客详细讲解了关于链表的三个经典例题,分别是:环形链表(简单),环形链表Ⅱ(中等),随机链表的复制(中等)。当你能毫无压力地听懂和成功地…