主页 > imtoken钱包苹果下载 > 比特币交易是如何确认的

比特币交易是如何确认的

imtoken钱包苹果下载 2023-01-16 20:40:15

区块链

什么是区块链?

区块链是一个分布式和去中心化的数据库。

比特币

什么是比特币? 比特币本质上是一个账本。 它是一个分散的网络,每个节点都称为矿工。 计费方式:当一笔比特币交易发生时,需要加入比特币网络。 交易双方是比特币网络的节点。 比如:A给B转账,这个转账申请就是加入区块链网络,因为这个网络是由很多节点组成的。 是的,加入网络需要半数以上节点的同意,也就是51%的节点同意。 嗯,同意之后,就可以在这个网络上录制了。 交易记录存放在哪里? 交易记录存储在一个称为区块的地方。 网络每10分钟会产生一个新的区块,存储这个区块的产生时间和前一个区块的产生时间。 所有批准的交易,即10分钟交易。问题:如何生成第一个区块

前面说过,这个网络是由很多节点组成的,那么这个新区块是哪个节点产生的呢? 这是一个值得思考的问题。 事实上,所有节点都想成为第一个,因为:第一个生成新区块的节点有特权在新生成的区块中插入一条特殊的交易记录:一个地址传送一定数量的比特币。 “out of thin air”是指不需要输入UTXO,这些比特币是凭空产生的,作为产生新区块的奖励。 这个特定的交易被称为“造币交易”,因为这个过程也是发行新比特币的过程,这就是为什么产生新的区块被称为“挖矿”的原因。 那么奖励有多大呢? 创建一个新区块的奖励金额是可变的:第一个区块奖励是 50 个比特币,此后每 210,000 个区块,这个数字减少 50%,直到达到零。 目前区块链长度接近50W,所以每次奖励12.5个比特币。 比特币上限为2100万,可以通过以下公式计算。 除了区块奖励外,创建区块的奖励还包括所有交易的交易手续费。 因为每个区块都记录了这10分钟内的交易,交易过程中需要收取交易手续费,这些交易不会交给创建第一个区块的节点。 所以,

如何创建新块? 通过解决一个问题:找到一个使新区块头的哈希值小于指定值的nonce值比特币在什么地方交易,即区块头结构中的“难度目标”。 区块头中的大部分信息在挖掘之前是固定的或可计算的。

图片

版本号跟随比特币客户端,一段时间内不会改变。 即使有变化,也会有比特币核心开发者协调升级策略,可以理解为静态常量。

前一个块的哈希摘要

一个哈希就足够了。 前一个块已经打包。

默克尔树的根

根据本次交易包含的交易清单,刚刚得出结果。

时间

包裹被拿走的时间。 不需要很精确,前后几秒,几十秒都可以。

难度目标

参考最近两周生成区块的平均生成时间。 如果两周内平均10分钟产生一个区块,那么两周将产生2016个区块。 软件会计算出最新的2016个区块的生成时间,然后进行比较,并相应调整难度,使得下一个区块的生成时间预计保持在10分钟左右。 因为最近的 2016 年区块已经确定,所以这个数字也是如此。

随机数 nonce

这就是挖矿的目标。 这是一个 32 位数字。

随机数是可以变化的,从0到最大值2^32都要试。 直到出现最后一个哈希结果,其编号低于难度目标值。 但是以现在的计算机算力,一台矿机可以在不到一秒的时间内计算出所有的变化,所以需要改变区块内部的造币交易中的附带消息,让merkle根也发生变化。 , 从而有更多的可能性找到符合要求的 nonce。

block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce
for i in range(0, 2**32):
     if sha256(sha256(block_header)) < target_bits:       
        break    
    else:        
       continue

比特币交易是如何确认的

先说一个概念:UTXO,指未花费的交易输出

比特币的记账模式和传统的中心化记账模式有一个不可理解的区别:比特币没有账户的概念。

具体来说,比特币的簿记系统记录并确认每笔交易本身。 是交易本身,交易本身,也就是把钱从A转移到B的过程,而不是记录A和B,而A和B的最终余额是通过扫描交易数据来计算的。

传统的簿记系统(银行)通过记录和保存每个账户的余额变化数据来验证交易。 余额相应调整并保存,完成一笔交易的记录。 A转100万给B,则先把A的余额减100万,同时把B的余额增加100万。 按照会计的说法,有贷必有贷,贷必相等。

为什么? 为什么比特币系统不通过实时更新账户余额来记账? 主要有两个原因:

1.节省计算能力和存储空间。 因为如果采用余额模式,为了避免重复支付,即使你的账户没有变化比特币在什么地方交易,比特币系统中任何一个客户端(钱包)有一笔交易和变化,所有客户端都有同步数据,否则,如果B有整个系统所有账户余额信息没有同步更新。 A向B转账时,B无法知道A的账户余额是否足够。 甚至有可能A同时将同一个比特币转给B和C。 由于B和C都没有更新过A的余额信息,所以他们不知道A的账户里没有那么多钱。

传统的支付系统是不同的。 对于每笔交易,只有付款方和收款方的余额发生变化,最多中心化服务器数据发生变化,所以只需要同步少量数据(这是相对于区块链而言的),实际上,由于所有记账由中央服务器完成,不需要额外同步,只需要在完成记录的同时存储数据。 因此,数据存储的集中式系统具有优势。 如果比特币也采用这种平衡思路,那肯定会失败(虽然现在还不能说一定会成功)。

2、如果采用记录账户余额的方式,那么当不同节点的更新存在时间差时,很容易出现重复支付。 简单来说,A将相同的1个比特币转给B和C。由于BC的地理位置不同,他们附近的节点不同,有可能双方都会确认这笔交易。 虽然随着时间的推移,比特币系统会达成竞争共识,只确认一笔交易。 但是BC双方都向A提供了货物,最终损失一定是一人承担。

那么比特币系统是怎么做到的:即只确认交易本身,直接记录交易的输入和输出:每笔比特币交易都有输入和输出,别人付给你的钱就是“交易输入”(对于你说的),如果你收到的钱是你支付出去的,就叫做“交易输出”,你收到但还没有支付出去的钱,叫做“未花费的交易输出”(UTXO),这是一种状态要支付 。

矿工将每笔交易的数据(输入和输出)打包成区块,通过竞争性计算,保证不可篡改。 事实上,如果6个区块被确认,那么全世界的总算力就变得一文不值了。 改变法律。

如果需要确认余额,可以使用客户端(钱包)扫描一个账户的输入输出数据,计算出这个账户的余额。 比起更新所有账​​户的余额数据,简直太容易了,不到1秒Clock就搞定了。

说完比特币系统的记账方式,双方在具体支付过程中如何确认交易已经完成? 先说一个关键的概念:

SPV:简单支付验证。 我们在使用比特币进行交易时,必须先确认交易成功,然后才能提供相应的服务或产品,即一只手付款,另一只手发货,确认收到钱后,我们才能提供相应的服务或产品。交付货物。 为什么叫“简单验证”? 因为这种验证方式,不需要下载所有的交易数据,只需要验证区块头数据即可。

那么什么是区块头呢?

简单回顾一下,区块链中的交易记录就是将一段时间内的交易数据打包成一个区块,然后随着时间的推移,区块不断积累叠加,环环相扣形成区块链,时间越长区块链,越难修改。 一般来说,6个区块之后,全世界所有的电脑都无法修改。

每个区块头信息代表一个区块,就像区块的身份证一样。 你看到我的身份证就知道我是谁,你的脑海里就能想到我的身高、长相,甚至职业。 、爱好等信息,在区块链世界中,系统可以通过区块头识别区块信息的方方面面。