主页 > imtoken钱包官网 > BSV 智能合约入门(一)
BSV 智能合约入门(一)
提到智能合约比特币合约交易技巧,大多数人都会下意识地将比特币排除在外,因为目前流行的观点是比特币不具备智能合约的能力。 但是我今天要给大家介绍的恰恰相反:即比特币从诞生之日起就具备了支持智能合约的能力。 让我们一起一探究竟。
比特币 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),因为它没有被任何输入消耗。
所以我们可以这样来类比比特币的流通:每一笔输入都指向前一笔交易的输出,只有能够提供一把合适的“钥匙”来打开前一笔输出上的“锁”,它所包含的比特币才能被移动到新的交易输出。 输出。 谁拥有输出“密钥”,谁就拥有其中的比特币。
比特币脚本(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
最后只剩下栈顶的值为true,说明整个脚本执行成功。 如果使用除3以外的任何值作为解锁脚本,则整个脚本的执行结果一定为false,即无法解锁成功。
比特币智能合约
如上一个脚本示例所示,对于一个具体的锁定脚本,只有当具体的解锁脚本与之相连时,整体的执行结果才为真。 从这个意义上讲,任何花费比特币的行为都可以看作是一种合约:一方提供一定数量的比特币,并就条款达成一致; 另一方只有在提供满足这些条款的证据时才能花费并锁定在合同中。 比特币。 它也被称为“智能”合约,因为它只需要得到比特币网络矿工的自动确认和执行。
正是借助比特币脚本语言的通用性和灵活的表达方式,我们可以在比特币网络上执行任意复杂的合约,这也是我想在以后的文章中深入展示给大家的。