比特币、区块链、交易脚本、智能合约、价值转移

资讯 6个月前 manoon
0

关键词:比特币区块链交易脚本智能合约,UTXO账户模型,价值转移

比特币、区块链、交易脚本、智能合约、价值转移

1.比特币UTXO模型

首先,在谈比特币交易流程之前,有一点需要说明。比特币系统没有平衡的概念。它使用 UTXO 模型(Unspent Transaction Outputs)。我们在交易过程中常说的钱包余额,其实就是钱包地址的UTXO集合。因此,在比特币网络中,存储比特币余额的是交易输出。准确的说是未使用的交易输出,而每笔交易的输入其实是指上一笔交易的输出。下图展示了比特币系统中交易输入输出的过程:

比特币、区块链、交易脚本、智能合约、价值转移

图0 比特币系统中的交易输入输出过程

如下图所示,每笔交易都记录了时间、发送方、接收方和金额。如果要计算A的余额,必须遍历所有与A相关的交易,减去A发送的每笔金额,加上A收到的每笔金额,即可计算出来。

比特币系统中计算余额的方法类似。因此,要计算用户的比特币余额比特币交易过程,需要遍历整个交易历史。以太坊采用 Account 模型,即余额的概念,因此无需追溯整个交易历史。

比特币、区块链、交易脚本、智能合约、价值转移

图 1 分类帐

因此,我们可以将 UTXO 理解为一种货币:它有数量和所有者。要使交易有效,必须满足两个条件:

(1) 此交易必须包含其花费的 UTXO 所有者的有效签名

(2)花费的UTXO总量必须大于或等于交易产生的UTXO总量。

2.交易流程

上面,我们介绍了比特币的UTXO模型,解释了比特币“余额”的概念。接下来,我们正式开始讲解比特币的交易过程,在接下来的分析过程中,我们将回答两个非常重要的问题:

(1)如何保证用户只能使用自己的比特币?(比特币账本对全网开放

(2)如何保证交易的有效性?

下图展示了一个交易的完整流程。这里有两种类型的交易。一种是Coinbase交易,即通过挖矿获得的比特币。由于没有发件人,所以比较特殊。另一种是我们常见的普通事务,包括输入和输出。

比特币、区块链、交易脚本、智能合约、价值转移

图2 比特币交易的基本流程

在这里,我们假设 12.5 比特币因挖掘 Alice 而获得奖励。在一笔交易中,Alice 需要向 Bob 转移 10 个比特币。Bob 最终确认并收到了 Alice 发送的 10 个比特币,同时添加了 2. 5 个比特币。事实上,这笔交易最终产生了2个输出,一个是发送给Bob的10比特币,另一个是2.5比特币从零钱发送给Alice(注:此处不考虑交易)费用)。

在这里,发生了几项关键操作

(1)一开始,Alice被奖励了12.5比特币进行挖矿,结果产生了一笔Coinbase交易。这个交易包含一个输入和一个输出。输出包含当前的输出索引,金额, 接收者的锁定脚本和公钥,这里锁定脚本的作用是只有 Alice 可以使用输出,要使用这个 UTXO 必须证明你是 Alice,如何证明我们后面会解释。

(2) 那么,既然 Alice 想给 Bob 发送 10 个比特币比特币交易过程,她需要做的第一件事就是确认她是否有足够的“余额”来支付这笔交易。正如我们在上一节所说的,我们需要为了计算用户的余额,需要遍历Alice的所有交易记录,这里我们假设Alice只有一笔Coinbase交易,也就是说Alice当前的余额是12.5个比特币。因为1< @k6@ >5 大于要花费的 10 个比特币,因此交易可以继续进行。

(3)接下来,我们要创建一个交易。这个交易包含1个输入和2个输出(一个发送给Alice,另一个发送给她自己)。

由于比特币使用的是 UTXO 模型,因此一笔交易的输入实际上使用的是前一笔交易的输出(UTXO)。输入还包含发送者的公钥,这里是 Alice 的公钥。这里,有一个很重要的问题,我们怎么知道 Alice 使用的是她自己的 UTXO?如果 Alice 使用的是别人的 UTXO,我们如何验证它?

在这里,我们看到除了引用前一交易的输出和发送者 Alice 的公钥外,输入还包含一个解锁脚本。解锁脚本包含 Alice 对先前交易输出的签名和她自己的公钥。在《区块链快速入门》中我们知道,通过数字签名技术,我们可以使用公钥来验证用户的签名(私钥加密)来证明签名者是否是用户本人。如下图所示,我们可以通过解锁脚本中提供的 Alice 的签名和公钥来验证 Alice 是否使用了她自己的 UTXO。

比特币、区块链、交易脚本、智能合约、价值转移

图3 数字签名技术(签名与验证)

(4)在上一步中,我们验证了交易中输入引用的最后一个UTXO确实是Alice的,从而证明了输入的有效性。接下来,我们需要创建2个输出,一个是Bod的10个比特币,包括一个lock脚本,限制只使用Bod;另一个是change产生的输出,发送给Alice的2.5个比特币,同样也包含一个Lock脚本,限制给Alice她自己。

(5) 最终交易创建后,会广播到比特币网络。当比特币网络确认交易并将该交易放入下一次挖矿竞争时,该交易被打包成一个区块并获得后确认全网共识,确认交易有效。

比特币的基本交易流程基本是这样的。

在下图中,我们可以了解真实的比特币交易包含哪些数据?

b6f6b339b546a13822192b06ccbdd817afea5311845f769702ae2912f7d94ab5 交易

比特币、区块链、交易脚本、智能合约、价值转移

比特币、区块链、交易脚本、智能合约、价值转移

图 4 普通交易

3.关键概念

一个交易包含以下信息:

3.1 交易分类

有两种类型的交易:

比特币、区块链、交易脚本、智能合约、价值转移

比特币、区块链、交易脚本、智能合约、价值转移

图 5 Coinbase 交易

3.2 交易输入

交易的输入结构如下:

比特币、区块链、交易脚本、智能合约、价值转移

图 6 交易输入结构

3.3 交易输出

交易的输出结构如下:

图 7 交易输出结构

3.4 交易脚本(1) 概念

比特币客户端使用以类似 Forth 的脚本语言编写的脚本来验证比特币交易。这种脚本语言不是图灵完备的,也没有循环等复杂功能。它是一种基于堆栈的执行语言。虽然脚本语言的简单特性使其无法实现复杂的功能,但也提高了交易脚本的安全性(设计简单,减少了攻击面)。以太坊正在批评比特币交易脚本的功能有限,因此设计了一种图灵完备的脚本语言,我们通常称之为智能合约脚本语言,旨在实现更复杂的功能,但同时也增加了安全风险。

当比特币交易被验证时,每个输入中的解锁脚本和它引用的输出中的锁定脚本同时执行,以检查交易是否有效。如图 8 所示,它是最常见的比特币交易解锁和锁定脚本类型。

比特币、区块链、交易脚本、智能合约、价值转移

图8 解锁脚本和锁定脚本

(2)验证过程

当我们拿到一笔交易时,如何验证交易输入是否有效,即如何验证输入所引用的输出是否有效。

首先,将当前输入的解锁脚本和该输入所引用的前一交易输出的锁定脚本结合起来,如图8所示,进行下一步的验证过程。如果最后返回TRUE,则交易有效。

比特币、区块链、交易脚本、智能合约、价值转移

图 9 交易有效性验证流程

从上面的验证过程,其实我们可以发现,如果要实现多人签名的验证和定时消费的验证(需要多长时间才能使用),同样的原理也可以使用.

(3)案例分析

接下来,我们将通过分析一个真实的比特币交易来加深对比特币交易脚本验证过程的理解。

地址:

比特币、区块链、交易脚本、智能合约、价值转移

图10cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79交易数据

为了验证交易是否有效,我们需要

由 cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79 中的输入引用的先前输出的锁定脚本根据当前输入中的解锁脚本进行检查。

解锁脚本(SriptSig):

8b4830450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e0141042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb

翻译后:

PUSHDATA(7 2) [30450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e01] PUSHDATA(6 5) [042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb]

解锁脚本包含发件人签名(绿色部分)和公钥(红色部分)。

此输入引用的先前输出的锁定脚本:

比特币、区块链、交易脚本、智能合约、价值转移

可以找到输入引用的最后一笔交易的输出,如下所示:

比特币、区块链、交易脚本、智能合约、价值转移

锁定脚本为:1976a91446af3fb481837fadbb421727f9959c2d32a3682988ac

翻译后:

OP_DUP OP_HASH16046af3fb481837fadbb421727f9959c2d32a36829OP_EQUALVERIFY OP_CHECKSIG

我们结合解锁脚本和锁定脚本进行验证:

PUSHDATA(7 2) [30450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e01] PUSHDATA(6 5) [042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb]

OP_DUP OP_HASH16046af3fb481837fadbb421727f9959c2d32a36829OP_EQUALVERIFY OP_CHECKSIG

然后一一执行指令

操作说明

阐明

推送数据 3045…0e01

将 3045…0e01(签名)放入堆栈

3045…0e01

PUSH DATA 042e...出租车

将 042e...cabb(公钥)放在堆栈上

042e...出租车

3045…0e01

OP_DUP 042e...出租车

复制栈顶数据

042e...出租车

042e...出租车

3045…0e01

OP_HASH160

对栈顶的数据使用SH256哈希算法,然后对其应用RIPEMD160算法,得到:

46af3fb481837fadbb421727f9959c2d32a36829

46af…6829

042e...出租车

3045…0e01

推送数据 46af…6829

将 46af...6829 放入堆栈

46af…6829

46af…6829

042e...出租车

3045…0e01

OP_EQUALVERIFY

验证栈顶的两个数据是否相等

042e...出租车

3045…0e01

OP_CHECKSIG

验证签名

真的

结果

返回TRUE,表示交易有效

最终的交易脚本返回TRUE,证明交易的有效性。

注意:如果您想了解有关比特币脚本语言的更多信息,可以查看:

版权声明:manoon 发表于 2021-11-23 16:57:38。
转载请注明:比特币、区块链、交易脚本、智能合约、价值转移 | 198区块链导航

暂无评论

暂无评论...