主页 > imtoken钱包苹果版怎么用 > Blockchain 100 Talk:以比特币为例,5分讲解数字货币交易全流程

Blockchain 100 Talk:以比特币为例,5分讲解数字货币交易全流程

imtoken钱包苹果版怎么用 2023-01-17 12:42:03

在之前的“区块链100讲”中,我们介绍了哈希、挖矿、算力、加密算法等,本期我们将重点介绍“交易和交易链”。

交易是在区块链网络上广播并收集到块中的签名数据结构。它是指之前的一笔交易,其中特定数量的比特币被发送到一个或多个公钥(即比特币地址),并且该交易没有加密(比特币系统中没有数据被加密)。多个交易可以形成一个区块,这些区块也在区块链网络中传播。一个块是指前一个块。简而言之,区块链是由区块组成的。) 以某种方式组织起来的链(chain)。区块链包含数千个区块,一个区块包含一笔或多笔交易。相关的交易形成一个交易链,一个交易链可能包含多个交易。以下章节将对这些知识点进行详细讲解。

1 个比特币地址

比特币地址是一串数字和字母,可以与任何想给你比特币的人共享。从公钥(也由数字和字母组成的字符串)生成的比特币地址以数字“1”开头。这是一个比特币地址的例子:

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

在一笔交易中,比特币地址通常是收款人的形式。如果将比特币交易比作一张支票,那么比特币地址就是收款人,也就是我们在“收款人”栏中所写的内容。支票的收款人可以是银行账户、公司、机构,甚至是现金支票。可以将支票支付给一个通用名称,而不是指定一个特定的帐户,这使其成为一种相当灵活的支付工具。同样,比特币地址的使用使比特币交易变得灵活。比特币地址可以代表一对公钥和私钥的所有者,或者其他东西。

比特币地址是通过单向哈希函数从公钥生成的。用户通常看到的比特币地址是用“Base58Check”编码的,它使用 58 个字符(一种 Base58 编号系统)和一个校验和来提高可读性,避免歧义,并有效地防止地址转录和输入中的错误。Base58Check 编码也用于比特币的其他地方,例如私钥、加密密钥和脚本哈希,以提高可读性和正确输入。图 1-1 描述了如何从公钥生成比特币地址。

描述比特币计算过程

2 交易的本质

一笔交易本质上是一个包含一组输入列表和输出列表的数据结构,也可以称为转账记录,包括交易金额、来源、收款人等信息。表 1-1 是一个比特币交易。数据格式。

下面是一个具体的例子来说明区块链上的交易组成。假设有一笔交易A,一笔交易,一笔输出,其中输入列表和输出列表如下:

Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501
 
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

上图显示交易A的输入0从交易f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6的输出0导入50个比特币,然后输出发送50个比特币到一个比特币地址的公钥哈希值(404371705fa9bd789a2fcd5表示)。

如果接收方要花钱,他首先要创建自己的交易 B,然后参考交易 A 的输出 0 作为交易 B 的输入。

3 输入和输出

输入是对其他交易输出的引用,并且通常在交易中列出多个输入。所有引用的输出值相加,得到的总和用于本次交易A的输出。previous tx为上一笔交易的hash值,Index为引用交易的具体输出编号,ScriptSig为脚本的前半部分(脚本将在后面详细讨论)。

描述比特币计算过程

该脚本包含两部分,签名和公钥。公钥属于交易输出的收款人,表示交易创建者允许收款人获得的输出金额;另一部分是ECDSA签名,通过哈希交易获得。该值是通过 ECDSA 签名获得的。签名和公钥一起证明了原始地址的真正所有者创建了支付交易。

输出包含发送比特币的指令,值 (Value) 是以 Satoshi 为单位的值 (Satoshi, 1BTC = 100?000?000 Satoshi)。ScriptPubKey 是脚本的另一半(稍后详细讨论),可以有多个共享输入量的输出。事务中的每个输出只能被后续事务引用一次作为输入。如果不想丢币,则需要将所有输入值的总和发送到一个输出地址。如果输入是 50BTC,但您只想发送 25BTC,那么比特币将创建 2 个 25BTC 的输出:一个到目标地址,一个返回到您的地址(称为“更改”,参见 1.1.@ >第 5 节)。在交易过程中,会产生交易费用,任何作为交易费用支付的比特币都不能兑换,

为了验证交易的输入是否已被授权,可以收集引用输出中的所有金额。比特币系统使用类似于 Forth 的脚本系统,其目的是验证从一个地址发出的比特币是否真的属于该地址的所有者描述比特币计算过程,输入的 scriptSig 和引用的输出 scriptPubKey 将依次运行。如果 scriptPubKey 返回 true,则输入被授权,证明地址所有者发行了比特币。通过脚本系统,发送者可以创建非常复杂的发送条件,人们首先必须满足这些条件才能接收金额。例如,可以创建一个任何人都可以在未经授权的情况下赎回的输出,一个需要 10 个不同签名的输入,或者一个只使用密码而没有公钥的输出。

4 种交易类型

根据目的地址,交易可以分为以下几种。

(1)支付公钥哈希

scriptPubKey:OP_DUP OP_HASH160

OP_EQUALVERIFY OP_CHECKSIG

脚本签名:

描述比特币计算过程

比特币地址只是一个哈希值,因此发送者无法在 scriptPubKey 中提供完整的公钥。兑换比特币时,接收方需要同时提供签名scriptSig和公钥scriptPubKey,脚本系统会验证公钥的hash。该值与 scriptPubKey 中的哈希值匹配,并检查公钥和签名是否匹配。检查过程参见4.2.5 部分。

(2)支付脚本哈希

这种类型的事务非常有意义,应该在以后的某些场合经常使用。这类交易的接受地址不是通常意义上的地址,而是以3开头的多重签名地址。例如,三对公钥可以生成一个多重签名地址。您需要在生成过程中指定 n in n of 3。n 的范围是 [1, 3]。如果 n = 1,则只需一个私钥签名即可花费该地址的硬币。如果n = 3,则需要三个私钥可以依次签名。

地址以3开头,可实现资产多方管理,安全性大大提高,轻松实现基于比特币的三方交易担保支付。一个 m-of-n 模式如下:

m {pubkey}...{pubkey} n OP_CHECKMULTISIG

其中,m和n需要满足:1≤n≤20,m≤n。

m 和 n 可以是 1、1 of 2、2 of 3 中的 1 的组合,等等。通常选择 n = 3。

多签地址的交易结构、签名、发送过程与普通交易类似。

(3)挖矿交易

描述比特币计算过程

挖矿(coinbase)交易用于凭空生成比特币。挖矿交易只有一个输入,有一个“coinbase”参数,没有scriptSig,“coinbase”中的数据可以是任何东西,不会被使用。比特币在这里存储了压缩后的当前目标哈希值和任意精度的“extraNonce”,每次块头中的Nonce溢出,它们都会增长。extraNonce 有助于扩展工作量证明功能的范围,矿工可以轻松修改 Nonce(4 字节)、时间戳和 extraNonce(2 ~ 100 字节)。

挖矿交易的产出量是一段时间内的固定值。初始值为50比特币,每210,000个区块减半。目前已经经历了两次减半,所以是12.5比特币。输出地址可以是任意地址,通常是矿工或矿池的比特币地址。

Nonce溢出是指对一个区块进行hash时,Nonce从0开始,每次计算Hash都会增加,因此有可能超出取值范围。此时,extraNonce 会相应增加以存储 Nonce。

5更改地址

在实际的区块链交易中,假设 A 有一个比特币地址,其中包含 10 个尚未使用的比特币。B 也有一个没有一分钱的比特币地址。当 A 想向 B 支付 10 BTC 时,A 的地址中未使用的输出变为零描述比特币计算过程,B 的地址变为 10 BTC。如果 A 想支付与他拥有的相同的金额,自然不存在需要找零的问题。但是,当手头的金额大于要支付的金额时,自然要找零。

假设 A 的地址有 35 个比特币(如图 1-2 所示),当 A 想向 B 支付 8 个比特币时,如图 1-2 所示,它只需要用这 20 个比特币进行那笔未消费的支出,就可以设置要支持的数量,剩下的12个比特币会返还给A,以便A以后可以继续使用。

这样,就有了变化机制。事实上,比特币会在交易​​过程中将用于消费的地址(消费地址)的余额设置为零。当要支付的金额少于可用余额时,比特币网络必须在交易消息中被告知更改将被发送到哪个地址,即“更改地址”。更改地址可能是也可能不是原始发送地址。除此之外,发送地址留下的剩余部分将通过网络作为交易费用支付给矿工。在上面的例子中,A可以选择将恢复的找零发送到一个新创建的找零地址,或者将原来的发送地址设置为找零地址并返回找零。虽然方便 A 将发送地址作为找零地址进行管理,但也可能会降低 A 的隐私,

根据设计,每笔比特币交易都将在名为“区块链”的全球公共分类账上永久可见,这意味着任何人都可以随时跟踪它。通过将比特币地址与其用户相关联,好人可以映射该人与其他人之间的资金转移。但是将恢复的更改发送到新创建的地址会使跟踪变得更加困难。

描述比特币计算过程

要理解这一点,请参阅图 1-3。假设从地址 A 向地址 B 发送比特币后,找零返回地址 A,那么区块链将显示地址 A 向地址 B 支付了一笔钱。同理,如果涉及两个或多个地址,任何涉及此接收找零的找零地址都将揭示 A 为付款人的交易。如果知道控制任何收款或付款地址的人的身份,则还可以推断进行交易的其他方的身份。

现在假设地址 A 向地址 B 发起付款,但随后将零钱地址更改为新生成的地址 C,如图 1-4 所示。没有更多信息,其他人都可以知道,有一笔交易将地址 A 的余额拆分为地址 B 和地址 C。地址 B 或 C 的所有者可能是也可能不是 A。由于添加了新地址 C,整个交易的真相变得更加扑朔迷离:哪个地址代表付款方,哪个地址代表恢复的零钱?

当各方向新创建的地址发送更改时,必须收集更多信息和更多资源以将个人身份与地址相关联。

延伸阅读:区块链100话:默克尔树保证区块链数据不可篡改,想要换根就需要砍树!

区块链 100 演讲:公钥算法必须不知道的 4 个概念

Blockchain 100 Talk:据说80%的人不懂hash算法

区块链 100:以太坊(ETH)挖矿教程

Blockchain 100 Talk:区块链的灵魂——共识算法