主页 > imtoken钱包usdt > 比特币交易流程:交易生成、验证、打包、发布 - Vegitable_Bird

比特币交易流程:交易生成、验证、打包、发布 - Vegitable_Bird

imtoken钱包usdt 2023-03-24 06:06:53

A想转10个ETH给B,首先A需要有10ETH,其次A需要有B的公钥HASH

为什么 A 需要 B 的公钥散列? 稍后我们会回答这个问题,我们先来看看转会是怎么进行的。

在比特币系统中,没有账户的概念,账户中不存在余额,而是一种叫做UTXO的数据结构,

如果国内比特币交易网站销户了,那以后怎么交易_比特币交易生成器app_比特币 币币交易

UTXO的结构

一个地址可以有多个UTXO,每个UTXO都有一个value字段,可以理解为每个UTXO上的余额,这个余额就是这个UTXO里面有多少钱。

转账前需要验证A确实有10ETH(矿工验证),如何验证?

UTXO 集包含所有未花费的输出。 在集合中找到addr为A的地址的UTXO,然后将所有值相加得到A的总金额。

比特币交易生成器app_比特币 币币交易_如果国内比特币交易网站销户了,那以后怎么交易

比特币交易生成器app_比特币 币币交易_如果国内比特币交易网站销户了,那以后怎么交易

转账过程中UTXO的变化?

例如A有3张银行卡(3个UTXO),每张卡有50个ETH(每个UTXO中的值为50)。 A向B转账时,不是从一张银行卡向B的银行卡转账,而是销毁A的卡(UTXO中的spent字段设置为TRUE,表示已经花费),然后生成2张银行卡(一个是B的UTXO,接受A转入的10ETH;另一个是A的UTXO,接受40ETH找零)。

为什么还需要生成一个A的UTXO,A之前的UTXO不能直接减10吗?

UTXO 在比特币系统中花费时,必须一次性花费。 如果没有找零地址,找零将作为交易费支付给矿工。下面第二个A是找零地址

如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易_比特币交易生成器app

回到之前的问题,为什么A需要B的公钥哈希才能给B转账?

刚才说了,在转账的时候,产生了目标地址的UTXO,花费了转账方的UTXO。 那么当 A 花费它的 UTXO 时,是否需要一些验证? 如果没有验证,任何人都会来花 A 的 UTXO。

比特币交易生成器app_如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易

那么,如何验证A是否花费了自己的UTXO呢? (涉及P2PKH)

这涉及锁定脚本和解锁脚本。 每一个UTXO在产生的时候,都会用这个UTXO的拥有者A的公钥(实际上是公钥HASH)来锁定。 例如,当 A 花费其 UTXO 时,A 需要使用自己的公钥明文和签名来解锁。 解锁过程分为两步: 1. 解锁脚本中A的公钥明文经过HASH160加密后,是否等于加锁脚本中A的公钥HASH? 2、公钥验证通过后,公钥验证解锁脚本中A的签名。 如果能解锁成功,说明这个UTXO确实是A的,那么A就可以花这个UTXO了。

这里,为什么A给B转账的时候需要B的公钥HASH呢? 已经解决了,那么问题又来了:A如何得到B的公钥HASH呢?

我们都知道每笔交易在打包的时候都需要在链上进行广播,而广播的时候不知道B的公钥明文或者hash吗? 的确! 但是如果B是新生成的地址,没有发生过任何交易和广播,A怎么知道B的公钥HASH呢? B的地址是B的公钥哈希的编码,地址和公钥哈希可以相互转换。 我们可以看一下地址是如何生成的:

比特币交易生成器app_如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易

比特币交易生成器app_如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易

1.随机生成私钥

如果国内比特币交易网站销户了,那以后怎么交易_比特币交易生成器app_比特币 币币交易

2.用SHA256和RIPEMD160加密两次(不可逆)

3.截取前20BYTES得到公钥HASH

4.公钥用BASE58编码得到地址(类似BASE64,可逆)

让我们看一下事务中的代码表示:

比特币 币币交易_如果国内比特币交易网站销户了,那以后怎么交易_比特币交易生成器app

这里有两个输出:其实是生成了两个UTXO,看起来不是很明显。 下图是在比特币浏览器上截取的截图。

比特币 币币交易_比特币交易生成器app_如果国内比特币交易网站销户了,那以后怎么交易

如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易_比特币交易生成器app

不知道大家有没有注意到,在验证A能否花费这个UTXO的时候,验证了解锁脚本中的签名,签名的内容是什么?

签名的内容就是交易的内容,ScriptSig就是解锁脚本。 签名+公钥+指令应该放在这个ScriptSig里面,但是key本身就是交易的一部分,这样不是很矛盾吗?看了一个大佬的博客,突然发现签名的内容确实是交易,但是在签名的时候,将ScriptSig替换成B(接收方)的锁定脚本的内容,然后对整个交易进行签名,最后把签名+公钥+指令编码比特币交易生成器app,放到ScriptSig中

如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易_比特币交易生成器app

签名前交易

如果国内比特币交易网站销户了,那以后怎么交易_比特币交易生成器app_比特币 币币交易

Scriptsig 填写并签署已填写的交易

如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易_比特币交易生成器app

如果国内比特币交易网站销户了,那以后怎么交易_比特币 币币交易_比特币交易生成器app

签名后,替换为ScriptSig

交易部分基本结束。 现在我们知道了交易是如何验证的比特币交易生成器app,如何签名的,以及 UTXO 是如何变化的。

上面已经讲了交易生成,然后把交易打包成块。

请注意,这不是两个独立的概念。 交易与区块的关系大致如下图所示

比特币 币币交易_如果国内比特币交易网站销户了,那以后怎么交易_比特币交易生成器app

注:区块链是不可篡改的分布式账本。 它的目的是记账,也就是把交易打包进区块链。

包装过程:

A 想转 10 个 ETH 给 B。这笔交易被广播到比特币网络。 所有矿工节点收到后首先验证这笔交易的合法性,也就是上面的签名、脚本等。

如果验证通过,交易会被放到矿工本地的chainstate中(可以理解为暂存区),然后矿工会从chainstate中选择一些交易,优先选择交易手续费高的交易,但不能太多,块容量不能超过1M。

然后将这些交易构建成一颗默克尔树,计算出这棵树的根哈希,加上version、previous_hash(前一个区块头哈希)、target(目标阈值)、timestamp(时间戳)和nonce(随机数),以上6 values一起HASH,需要计算的HASH