主页 > imtoken钱包最新版本 > BSV 智能合约入门(一)

BSV 智能合约入门(一)

imtoken钱包最新版本 2023-01-17 01:02:44

提到智能合约比特币合约交易技巧,大多数人都会下意识地将比特币排除在外,因为目前流行的观点是比特币不具备智能合约的能力。 但是我今天要给大家介绍的恰恰相反:即比特币从诞生之日起就具备了支持智能合约的能力。 让我们一起一探究竟。

比特币 UTXO 模型

比特币底层采用了一种非常特殊的交易模型设计,即UTXO(Unspent Transaction Outputs)模型。 这里我们简单介绍一下,先看看最基本的交易是怎么表示的。

每笔比特币交易主要由两部分组成:输入记录和输出记录。

每条输出记录主要包含信息:

每条输入记录主要包含信息:

假设有人成功给我发了一个比特币,那么链上就有一条历史交易记录TX_1。 它的一条输出记录(表示为 TX_1_OUT_1)包含 1 个比特币和一个只能由我的私钥“打开”的“锁”(锁脚本)。 正是因为这把“锁”的存在,其他人无法使用这个比特币。

如果国内比特币交易网站销户了,那以后怎么交易_比特币合约交易技巧_火币比特币交易手续费

现在我想把这个比特币转给另一个人,所以我需要建立一个新的交易记录TX_2。 它的输入记录包含对之前交易输出TX_1_OUT_1的引用,以及一个由我的私钥签名的“密钥”(解锁脚本); 输出记录(标记为 TX_2_OUT_1)包含比特币数量 1,以及一个只有接收者才能“打开”的“锁”(另一个锁定脚本)。

这笔新交易TX_2是我发给矿工的,只有矿工验证解锁脚本的有效性后,交易才会被记录在链账本中。 至此也意味着我完成了一个典型的接收+支出比特币的场景。

此时输出TX_1_OUT_1会被系统标记为已花费,因为它已被TX_2中的输入成功使用。 如果你再次尝试用它来构造交易,它将被矿工拒绝为“双花”。 相反,输出 TX_2_OUT_1 被称为未花费输出 (UTXO),因为它没有被任何输入消耗。

UTXO模型

所以我们可以这样来类比比特币的流通:每一笔输入都指向前一笔交易的输出,只有能够提供一把合适的“钥匙”来打开前一笔输出上的“锁”,它所包含的比特币才能被移动到新的交易输出。 输出。 谁拥有输出“密钥”,谁就拥有其中的比特币。

如果国内比特币交易网站销户了,那以后怎么交易_比特币合约交易技巧_火币比特币交易手续费

比特币脚本(Script)和虚拟机(BVM)

实际上,比特币的底层是使用一种叫做Script的脚本语言来实现“锁”和“钥匙”的,这是一种基于栈的脚本语言。 简单来说,就是由操作码组成的一组指令。 以下是操作码的几个简单示例:(有关操作码的完整列表比特币合约交易技巧,请参阅此处)

操作码描述

OP_2

将值 2 压入栈顶

比特币合约交易技巧_火币比特币交易手续费_如果国内比特币交易网站销户了,那以后怎么交易

OP_ADD

添加栈顶两个元素的值

OP_EQUAL

如果栈顶的两个元素相等则返回真; 否则返回假

锁定脚本(位于上一个交易的输出)和解锁脚本(位于当前交易的输入)都是由这些操作码中的一些串联而成,每个操作码后面可以跟零到两个运算符。

如果国内比特币交易网站销户了,那以后怎么交易_比特币合约交易技巧_火币比特币交易手续费

为了验证解锁脚本的有效性,比特币节点中引入了比特币虚拟机(BVM)。 BVM 将锁定脚本与解锁脚本串联起来,形成一个完整的执行脚本。 这个完整的脚本将由 BVM 执行。 当执行完成时,如果栈顶元素的布尔值为真(即该值为非零),则认为脚本执行成功,否则认为脚本执行失败执行。

脚本执行示例

让我们看一个例子。 假设在一笔交易中,使用以下脚本将一些比特币锁定在输出中:

OP_1 OP_2 OP_ADD OP_EQUAL

在另一个尝试花费此输出的交易中,使用以下脚本:

比特币合约交易技巧_如果国内比特币交易网站销户了,那以后怎么交易_火币比特币交易手续费

OP_3

这里为了说明解锁授权是如何工作的,我们来一步步模拟脚本的执行。

OP_3 OP_1 OP_2 OP_ADD OP_EQUAL

BVM执行过程

最后只剩下栈顶的值为true,说明整个脚本执行成功。 如果使用除3以外的任何值作为解锁脚本,则整个脚本的执行结果一定为false,即无法解锁成功。

比特币智能合约

如上一个脚本示例所示,对于一个具体的锁定脚本,只有当具体的解锁脚本与之相连时,整体的执行结果才为真。 从这个意义上讲,任何花费比特币的行为都可以看作是一种合约:一方提供一定数量的比特币,并就条款达成一致; 另一方只有在提供满足这些条款的证据时才能花费并锁定在合同中。 比特币。 它也被称为“智能”合约,因为它只需要得到比特币网络矿工的自动确认和执行。

正是借助比特币脚本语言的通用性和灵活的表达方式,我们可以在比特币网络上执行任意复杂的合约,这也是我想在以后的文章中深入展示给大家的。