区块链技术与数字货币

news2024/11/26 11:39:47

 1.起源

➢中本聪(Satoshi Nakamoto), 2008

➢比特币:一种点对点的电子现金系统

2.分布式账本技术原理

1.两个核心技术:

➢以链式区块组织账本数据实现账本数据的不可篡改

➢分布式的可信记账机制

2.共识机制:由谁记账

目的:

⚫ 解决记账权

场景:

开放系统,动态增减,海量节点

解决方案

⚫ 工作量证明(proof of work):高强度哈希计算 (SHA256)进行算力竞争解决记账权,达成共识。

3.共识协议模型:

• 节点海量、动态增减

• 存在恶意节点

• PBFT算法要求节点集相对稳定,数量有限,不适用

• 工作量证明PoW共识

▫ 划定固定时间段(10分钟)

▫ 相同或相似输入数据(组装的区块)

▫ 算力竞争选出获胜节点,其它节点验证结果后不再发送消息

▫ 最长链原则,从短期共识扩展到长期共识

3.区块链宏观结构

区块链

⚫ 基于哈希值进行链接

                                                        

特点

⚫ 区块链中数据无法篡改或删除

⚫ 区块链越长可信度越高

4.区块链微观结构

1.区块组成

➢每个区块包括区块头和交易数据两个部分

⚫ 区块头由当前区块的元数据和前一区块的Hash值构成

⚫ Merkle树用于对交易数据列表进行快速寻址

2.区块的结构

区块头的结构

3.区块头代码

class CBlockHeader {} //这是一个“类”,或数据机构,内含下面这些字段:
] int32_t nVersion //所采用Bitcoin协议的版本号
] uint256 hashPrevBlock //上一个块的(块头)Hash值。
] uint256 hashMerkleRoot //所记载交易记录的TxID,
                         //即其Hash值所构成Merkle树的根
] uint32_t nTime //本块的发布时间
] uint32_t nBits //为挖矿过程设置的难度,Hash值中须有的前导零的位数。
] uint32_t nNonce //在挖矿过程中使Hash值达到nBits字段所
                  //要求前导零位数的试凑值。

4.区块标识符:区块头哈希值和区块高度

• 区块主标识符是它的加密哈希值,一个通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。例如 :000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f是第一个比特币区块的区块哈希值。

• 区块哈希值实际上并不包含在区块的数据结构

• 第二种识别区块的方式是通过该区块在区块链中的位置,即“区块高度(block height)”。例如:高度为0的区块就是创世区块。

• 和区块哈希值不同的是,区块高度并不是唯一的标识符,因为有可能出现区块链分叉。

5.Merkle树

• Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值。

▫ 叶节点是数据块的哈希值。

▫ 非叶节点的哈希值是根据它下面子节点的值哈希计算得到。

• 在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。

• Merkle树中使用两次SHA256算法计算结点的哈希值。

▫ H~A~ = SHA256(SHA256(交易A)) //两次SHA256是为了提高安全强度

• 当N个数据元素经过加密后插入Merkle树时,你至多计算log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。

6.Merkle树的价值:简单支付验

有了Merkle树,一个节点能够仅下载区块头(80字节/区块),然后通过从一个满节点回溯一条Merkle路径就能认证一笔交易的存在,而不需要存储或者传输区块链中大多数内容。

这种不需要维护一条完整区块链的节点,又被称作简单支付验证(SPV)节点,它不需要下载整个区块而通过Merkle路径去验证交易的存在。

7.比特币区块链中的节点

• 全节点 full client:存储着整个区块链,承但对交易请求进行验证和执行,可以通过挖矿争取发布区块,还承担着应别的节点之请向其发送区块和相关交易信息的义务,同时也承担转发交易请求和区块的义务。

▫ 矿工节点  ▫ 非矿工节点

• 轻节点 light client :

 简单支付验证(SPV)节点 :只存储区块头,不存储区块块体,仍可以对到来的交易请求进行

验证。

②钱包 :一个连接区块链的应用软件(app),记录与所有者有关的信息:

区块链地址、私钥、账户余额、UTXO等,不存储账本。

8.SPV(钱包)验证过程

• 针对某个支付到自己比特币地址的交易建立布隆过滤器,限制只接收含有目标比特币地址的交易。

• 其他全节点探测到某个交易符合SPV节点设置的布隆过滤器条件时,以 Merkleblock消息的形式发送该区块,Merkleblock消息包含区块头和一条连接目标交易与Merkle根的Merkle路径。

• 交易的存在性验证:SPV节点通过该Merkle路径找到跟该交易相关的区

块,并验证对应区块中是否存在目标交易(Merkle Path Proof)。

• 交易是否双化验证:SPV节点检查这笔交易所在区块之后的区块个数,区块个数越多说明该区块被全网更多节点共识,一般来说,一笔交易所属区块之后的区块个数达到6个时,说明这笔交易是可信的。

5.区块链整体结构

区块头代码

class CBlockHeader {} //这是一个“类”,或数据机构,内含下面这些字段:
] int32_t nVersion //所采用Bitcoin协议的版本号
] uint256 hashPrevBlock //上一个块的(块头)Hash值。
] uint256 hashMerkleRoot //所记载交易记录的TxID,
//即其Hash值所构成Merkle树的根
] uint32_t nTime //本块的发布时间
] uint32_t nBits //为挖矿过程设置的难度,Hash值中须有的前导零的位数。
] uint32_t nNonce //在挖矿过程中使Hash值达到nBits字段所
                  //要求前导零位数的试凑值。

交易的数据结构

class CTransaction {} //一个交易请求或交易记录
] const std::vector<CTxIn> vin //本Tx的输入UTXO序列,即资金来源。
] const std::vector<CTxOut> vout //本Tx的输出UTXO序列,即资金去向。
] const int32_t nVersion // CURRENT_VERSION=2
] const uint32_t nLockTime //锁定时间,时间未到点之前本交易不入块
。
] const uint256 hash //本Tx的Hash值,只存储在内存中,
                     //不作永久存储也不发送。

6.挖矿:比特币的产生

        挖矿通常指的是通过使用计算硬件(如ASIC矿机、GPU等)来解决数学难题,以验证加密货币网络上的交易并创建新的加密货币的过程。这是区块链技术中的一个关键环节,特别是对于工作量证明(Proof of Work, PoW)的加密货币,如比特币。

        在挖矿过程中,矿工们竞争解决复杂的算法问题。当一个矿工成功找到一个区块的解决方案时,他们将这个区块添加到区块链上,并因此获得新生成的加密货币作为奖励。这个奖励机制是加密货币发行的一部分,也是维持网络安全和去中心化的一种方式。

• 挖矿节点必须有钱包功能

▫ 有自己的160位密码地址、私钥

• 打包生成区块时,区块中额外加一个交易coinbase

▫ 生成一个UTXO,包含当前奖励数量的比特币(现在是6.25)

▫ 这个UTXO的招领地址是自己的地址

▫ 如果记账成功,这个coinbase交易就生效,否则不在链上。

                   

然而,挖矿需要大量的电力和计算资源,因此它也是一个能源密集型的过程。在中国,由于对能源消耗和金融稳定的考虑,已经对加密货币挖矿进行了严格的限制。

算力竞争:

电力消耗:

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

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

相关文章

数据可视化期末总结

期末考试重点&#xff08;世界上最没意义的事情&#xff09; 选择 p8 数据可视化的标准&#xff1a; 实用、完整、真实、艺术、交互&#xff08;性&#xff09; p21 色彩三属性 色相、饱和度、亮度 p23 视觉通道的类型&#xff1a; 记得色调是定性 p39 散点图&#xff08;二维…

检查显卡驱动和cuda版本的对应关系并下载

1. CUDA 12.5 Release Notes — Release Notes 12.5 documentation Official Drivers | NVIDIA&#xff08;驱动下载&#xff09;搜索结果 | GeForce RTX 3090 | Linux 64-bit | NVIDIA nvidia-smi &#xff08;查看cuda&#xff09; pipx run nvitop nvcc -V https://deve…

飞书API 2-3:如何使用 API 创建数据表,解放人工?

一、引入 作为飞书多维表的深度使用者&#xff0c;经常需要将一些数据库的数据同步到多维表上&#xff0c;在数据写入之前&#xff0c;一般需要新建数据表和字段。当通过网页端界面新建字段时&#xff0c;如果字段少&#xff0c;还能接受手动一个个创建&#xff0c;不过一旦字…

win11 内存占用过大优化尝试

关闭开机加速 wins打开搜索 控制面板&#xff0c;打开控制面板 找到硬件和声音-电源选项-选择电源按钮的功能-去掉勾选启用快速启动 关闭windows 更新 winr 输入services.msc打开服务-搜索windows 更新-双击打开设置-选择禁用 貌似没什么用。

【C++ | 委托构造函数】委托构造函数 详解 及 例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

【C++开发必备工具】Dependency Walker与Dependencies

Dependency Walker 与 Dependencies 1. Dependency Walker1.1 功能特点1.2 使用方法1.3 注意事项 2. Dependencies2.1 功能特点2.2 使用方法2.3 注意事项 3. 总结 1. Dependency Walker Dependency Walker 是一个免费软件工具&#xff0c;用于查看 Windows 应用程序的模块&…

el-tree结构清空选中节点

<el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defaultProps"> </el-tree>this.$refs.tree.setCheckedKeys(this.$refs.tree.getCheckedNodes(),false);

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

编码大模型系列:Meta创新的“代码编译优化”的LLM

鲁班号导读正式上线。移步“鲁班秘笈”&#xff0c;查阅更多内容。 大型语言模型 (LLM) 已在各种软件工程和编码任务中展现出卓越的能力。然而&#xff0c;它们在代码和编译器优化领域的应用仍未得到充分探索。训练LLM需要大量资源&#xff0c;需要大量的 GPU时间和大量的数据…

【CodinGame】CLASH OF CODE - 20240630

前言 本文是CodinGame&#xff08;图片来自此&#xff09;随手做的几个&#xff0c;供记录用 要求&#xff1a; 代码 import math import syss input()for n in range(len(s)):print(s[n:])要求 代码 import sys import math# Auto-generated code below aims at helpi…

【01-02】Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

ManicTime(屏幕时间统计工具) 专业版值得购买吗

ManicTime 是 Windows 平台上&#xff0c;一款支持跟踪、标记用户在每个软件上所花时间的工具&#xff0c;它能自动归类生成时间使用报表&#xff0c;帮助用户分析及改善工作效率。 ManicTime 不仅会在后台记录、统计所有窗口的使用时间&#xff0c;还能自动截图存档到本地&a…

数据结构-分析期末选择题考点(图)

我是梦中传彩笔 欲书花叶寄朝云 目录 图的常见考点&#xff08;一&#xff09;图的概念题 图的常见考点&#xff08;二&#xff09;图的邻接矩阵、邻接表 图的常见考点&#xff08;三&#xff09;拓扑排序 图的常见考点&#xff08;四&#xff09;关键路径 图的常见考点&#x…

企业数据备份整体规划方案

企业数据备份整体规划设计参考 备份系统前期规划至关重要&#xff0c;需综合考虑多维度因素以达最优解。本文全面探讨企业数据中心备份规划&#xff0c;助您构建高效、稳健的数据保护体系。 随着信息化深入&#xff0c;企业业务系统日益增多&#xff0c;数据规模与类型均显著扩…

等保测评练习16

等级保护初级测评师试题16 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.虚拟机被非法利用后&#xff0c;可能被当作跳板机。&#xff08;T&#xff09; P312 2.云服务商&#xff0c;为云计算服务…

《Windows API每日一练》7.2 计时器的三种使用方法

如果程序在整个运行过程中需要一个计时器&#xff0c;在WinMain函数中或窗口过程处理WM_CREATE 消息时&#xff0c;调用SetTimer函数创建一个计时器。在离开WinMain函数时或是处理WM_DESTROY消息时&#xff0c;调用KillTimer函数销毁计时器。基于调用SetTimer参数的不同&#x…

C#异常提示.mp3的文件不是一个有效的波形文件

解决方法: 使用格式工厂将mp3格式的文件转为wav格式

从笔灵到AI去痕:全方位提升内容创作与学术诚信

内容为王&#xff0c;在内容创作的世界中尤为重要。然而&#xff0c;面对写作时常常感到无从下手&#xff1a;有时缺乏灵感&#xff0c;有时难以表达清楚自己的想法。AI写作助手的出现&#xff0c;为这些问题提供了创新的解决方案&#xff0c;极大地改变了内容创作的过程。 今…

android轮播图入门1——简单无限自动轮播图

目标 目标是实现一个简单的轮播图&#xff0c;特征如下&#xff1a; 只展示本地图片可以无限轮播&#xff0c;在第一帧时也可以向前轮播可以自动轮播 code 先上代码&#xff0c;需要事先准备几张本地图片当素材 MainActivity: package com.example.loopapplication;import…