[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程

工欲善其事,必先利其器

Web3开发中,各种工具、教程、社区、语言框架.。。。
种类繁多,是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役?

参见另一篇博文👉 2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在这里插入图片描述

如何持有和使用比特币

作为比较,我们先回顾下现实的银行系统:

首先我们需要使用个人信息(如身份证)给银行,银行给我们开户,开户时确立了我们对该账户的所有权。

进行支付的时候,银行对交易双方账户余额进行增减。但比特币是一个去中心化的系统,没有这样的第三方,它是如何确定某个账户的比特币是属于谁的?这个问题等同于谁可以使用这个账户的比特币?

在比特币的公共共享总帐本中,记录了所有地址持有的余额,比特币的账户是用地址来表示。

当需要转账时,发送一笔类似的交易(为了理解做了简化):

    "from":"1ABzp1eP5QGefi2DMPTf...""to":"3FRdnTq18LyNveWa1gQJcgp...""amount":"1 btc"

当然比特币节点需要这笔交易是谁发起的,只有当由地址 1ABzp1eP5QGefi2DMPTf… 发起才是真正有效,因此要求发起人对交易信息进行签名,签名是用地址 1ABzp1eP5QGefi2DMPTf… 对应的私钥进行的。

当我们创建一个比特币地址(账户时),会首先生成一个随机数作为私钥,然后根据椭圆曲线算法(ECDSA)计算出公钥,然后在根据哈希运算及校验编码得到比特币地址。

比特币地址格式

目前比特币有三种地址类型:

  1. P2PKH 地址,也叫 “传统地址(Legacy address)”,以数字 “1” 开头,长度为 26 个到 36 个字符, 如:1ABzp1eP5QGefi2DMPTfTL5SLmv7DivfNa
  2. P2SH 地址,以数字 “3” 开头, 如:3FRdnTq18LyNveWa1gQJcgp8qEnzijv5vR .
  3. P2WPKH 地址,也叫 “Bech32 地址”,是一种高级的地址,以 “bc1” 开头.

公钥及地址是公开的,私钥这是保密的,私钥推导地址的过程也是单向的,无法通过地址反推到公钥及私钥。

在这里插入图片描述
因此当我们持有某地址的私钥,就是持有该地址下的比特币,因此私钥必须妥善保管。

UTXO 模型
实际上,在比特币账本中,并不是的记录某个账户的余额是多少(和以太坊的账户余额模型不一样),比特币引入了一个“未花费的交易输出”(UTXO: Unspent Transaction Output)概念,一个 UTXO 代表 “一整块” 的可以使用比特币。UTXO 作为交易的输入。

一个 UTXO 在交易时可以产生多个 UTXO ,比特币的交易时不断消费老 UTXO 产生新的 UTXO 的过程,当一个 UTXO 被作为交易的输入后,就不再是未花费的了(STXO),在某个时间点,所有 UTXO 的集合都被称为 UTXO 集。比特币节点会追踪 UTXO 集,从而确定哪些代币未被花费,以及哪些人可以花费它们。从而避免双花(Double Spend)问题。

思考:最初的 UTXO 从哪里来的呢?

最初的 UTXO都来自于区块挖掘奖励,这个称为 coinbase 交易,coinbase 交易可以没有 UTXO 输入,但是像所有正常输出一样,coinbase 交易的输出是新的 UTXO。

UTXO 其实是包含一定数量的比特币(以 “聪(satoshi)” 为单位)以及花费这些比特币时所需满足的条件(叫做 “锁定脚本(locking script)”),当我们要使用一个 UTXO 时,就是对用私钥 UTXO 进行解锁(签名),以便使用其中的比特币。

UTXO 是不可分割的最小的交易单元,如果我们想要花费的比特币数额低于 UTXO 的面值,那该怎么办呢? 我想给小李发送 0.5 BTC,我的 UTXO 面值为 1 BTC,由于必须通过交易花掉一整个UTXO的 BTC,因此我们需要创建另一个UTXO输出作为找零。 好比我们用一张 100 元纸币去买 10 块钱的东西,需要找零 90 块。这就是比特币交易的关键特性。

出于安全性和匿名性的考虑,应该总是使用新比特币地址,来进行找零。

交易

在这里插入图片描述

这个是我在区块链浏览器中截下的一个交易(链接),我们可以看到这个交易有一个 UXTO 输入,两个 UXTO 输出。

交易的 “Fee” 显示的数值,其实是 UTXO 总输入和 UTXO总输出之间的差值。

交易结构中没有指明交易费,交易费总是动态计算得出的,在创建交易时,我们要确保输出总是略低于输入,以便让矿工计算交易费是多少。 交易费由矿工收取,用来其补偿保护网络安全,也是其重要的收入来源之一,如果没有交易费,由些矿工会阻止其在网络中广播。

钱包

在日常使用过程中,通常是借助钱包软件来完成交易的,因此钱包本身不保存资产,资产是在记录比特币网络账本中的(通常称为保存在链上)。 钱包为了显示你的比特币 “余额”,钱包软件必须在比特币区块链上查询所有由你的私钥控制的 UTXO,然后将这些 UTXO 的值相加,并显示最终余额。

如果想花费 1 BTC,钱包会检查你所有的 UTXO 加起来是否有 1 BTC。如果有的话,钱包就会使用这些 UTXO 作为输入来创建另一笔交易。

钱包实际是一个管理私钥(生成、存储、签名)的工具。

支持比特币的钱包很多,例如:imToken、Trust Wallet、Math Wallet、Ledger(硬件钱包)、Trezor(硬件钱包)等。 我们应该尽量选择开源、知名度大、大额资产还可以使用硬件钱包。

交易过程

那么一笔交易最终是如何进入区块链的 ?

主要有这么几个阶段:

  1. 发起交易及交易签名
  2. 节点验证交易有效性
  3. 使用工作量证明挖掘新区块
    在这里插入图片描述
发起交易及交易签名

首先是创建一笔交易, 一笔比特币交易主要由以下元素组成:

  1. 交易输入: 他们指向之前的交易创建的 UTXO,通常钱包会收集当前可用的 UTXO 集合作为交易的输入;
  2. 交易输出:表明多少比特币会锁定到哪些地址,即生成新的 UTXO 。
  3. 签名: 用私钥来解锁交易输入的UTXO。

创建比特币交易是在钱包内完成的,而不是在节点上,因此可以在离线的情况下创建交易,交易创建后,通过比特币节点发送到比特币网络中。

节点验证交易有效性

无论交易来自哪里,交易就得先被节点的交易池(mempool)接受。交易池就是未确认交易的缓存,以便矿工从中挑选出手续费率最高的交易、打包到区块中。

当然矿工有首先检查交易是否有效,例如检查:

  • 交易输出是否 小于 0 或者大于 2100 万 BTC
  • 交易不是一笔 coinbase 交易 ,因为区块之外无法存在任何 coinbase 交易。
  • 交易的 “重量” 不超过 400000 单位。这么大体积的交易可能在共识上是有效的,但会占据太多的交易池空间。防止攻击者尝试使用体积非常大但永远不会被挖出的交易来塞爆我们的交易池。
  • 签名验证确定 UTXO 的有效性(UTXO 脚本检查)。

所有有效的交易会传播给网络中的所有节点。

使用工作量证明挖掘新区块

矿工得到前一个区块的哈希值之后,就可以开始挖下一个区块。创建一个新区块的过程差不多是这样的:

矿工从从交易池中找出最优的一组交易(在一个区块限制下,手续费收益最大),给这组交易创建merkle树, 然后不断的执行暴力哈希运算,以求解出满足一下 Hash 目标值的nonce值:

SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + nonce )) < HASH 目标值

version: block的版本 prev_hash: 上一个block的hash值 merkle_root: 需要写入的交易记录的hash树的值 ntime: 更新时间 nbits: 当前难度

这里有一个示例图:在这里插入图片描述
挖出的区块由于包含了上一个区块的 Hash,通过这个方式把所有的区块串联起来了,区块挖出之后,会迅速的广播的网络的其他节点,只有当一笔交易被包含进一个带有有效工作量证明的区块,并且该区块被整个网络接受之后,我们就说这笔交易 “被确认了”,此时才可以认为资金的转移已经完成了。

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

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

相关文章

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

uniapp的分包使用记录

UniApp的分包是一种将应用代码划分为多个包的技术。分包的核心思想是将不同部分的代码划分为不同的包&#xff0c;按需加载&#xff0c;从而提高应用性能。使用UniApp的条件编译功能&#xff0c;开发人员可以根据需要将代码划分为多个包。每个包都包含一组页面和组件&#xff0…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

RocketMQ源码解析-主从同步原理(HA)

1、关键组件 主从同步的实现逻辑主要在HAService中&#xff0c;在它的构造函数中实例化了几个对象同时在start()方法内执行启动&#xff1a; public class HAService {public HAService(final DefaultMessageStore defaultMessageStore) throws IOException {this.defaultMes…

李宏毅机器学习第二十三周周报 Flow-based model

文章目录 week 23 Flow-based model摘要Abstract一、李宏毅机器学习1.引言2.数学背景2.1Jacobian2.2Determinant2.3Change of Variable Theorem 3.Flow-based Model4.GLOW 二、文献阅读1. 题目2. abstract3. 网络架构3.1 change of variable formula3.2 Coupling layers3.3Prop…

阿里云域名外部入库流程

注册商是阿里云&#xff0c;且在阿里云管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是阿里云但在聚名管理&#xff0c;请参考教程&#xff1a;https://www.west.cn/faq/list.asp?unid2539 在外部入库操作之前&#xff0c;请先登录阿里云获取账号ID。详细的账…

软件测试方法分类-按照是否手工执行划分

接上一篇,下来我们再细讲,第二个维度的分类, 软件测试方法分类-按照是否手工执行划分 按是否手工执行划分 1,手工测试(manualTesting) 手工测试是由人一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一种。 2,自动化测试(automationTestin…

【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解

文章目录 &#x1f680;前言&#x1f680;除与取模&#x1f680;水仙花数&#x1f680;变种水仙花数 &#x1f680;前言 本专栏文章都直奔刷题主题&#xff0c;阿辉都不会在废话了&#xff0c;加油&#xff0c;少年&#xff01;&#xff01;&#xff01; &#x1f680;除与取…

STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…

Scrapy爬虫中合理使用time.sleep和Request

概述 在Scrapy爬虫中&#xff0c;我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间&#xff0c;而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响&#xff0c;以及在异步情况下可能…

TTS | NaturalSpeech语音合成论文详解及项目实现【正在更新中】

----------------------------------&#x1f50a; 语音合成 相关系列直达 &#x1f50a; ------------------------------------- ✨NaturalSpeech&#xff1a;正在更新中~ ✨NaturalSpeech2&#xff1a;TTS | NaturalSpeech2语音合成论文详解及项目实现 本文主要是 讲解了Nat…

基于孔雀优化算法的航线规划

MATLAB2020a下正常运行 上传明细-CSDN创作中心

Excel中部分sheet页隐藏并设置访问密码

1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时&#xff0c;按图示输入原密码即可 8、查看sheet2内容

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Scrum&#xff08;敏捷开发框架之一&#xff09; 详细介绍和解释&#xff1a; 优缺点&#xff1a; 优点&#xff1a; 缺点&…

【MySQL】数据库之高级SQL查询语句补充

目录 一、补充正则表达式的查询regexp 二、补充case的用法 三、补充空值和null值的区别 一、补充正则表达式的查询regexp 要知道 在MySQL中使用正则表达式&#xff0c;一定要在前面加上regexp 正则表达式 ^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串 …

开关电源输入输出电压测试方法:如何用开关电源智能测试系统测试输入输出电压?

一、用万用表测量输入输出电压 1. 连接万用表到电路中 2. 将万用表调到直流电压挡&#xff0c;连接红表笔到开关电源正极&#xff0c;连接黑表笔到开关电源负极。 3. 打开电源&#xff0c;读取万用表显示的电压值。 二、用示波器测量输入输出电压 1. 连接示波器到电路中 2. 将示…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证&#xff08;交换证书&#xff09;密钥管理 前提知识 散列函数 散列也可以叫哈希函数&#xff0c;MD5、SHA-1、SHA-2、、&#xff08;不管叫啥&#xff0c;都记得是同一个东西就行&…

图神经网络——图学习

图学习 0. 前言1. 图2. 图学习3. 图神经网络小结 0. 前言 近年来&#xff0c;从社交网络到分子生物学等各个领域&#xff0c;数据的图表示越来越普遍。图神经网络 (Graph Neural Network, GNN) 是专为处理图结构数据而设计的&#xff0c;要充分挖掘图表示的潜力&#xff0c;深…