主页 > token.im钱包下载 > 比特币智能合约
比特币智能合约
这是智能合约系列的第一篇比特币合约是什么,解释了什么是智能合约以及比特币如何支持它。 本文假设您已经了解比特币的基本原理,什么是哈希算法,什么是数字签名。 但你不需要成为一名程序员。
阅读本文后,您将了解:
不只是转移
我们都知道大多数比特币交易都表达了这样一个意思:谁把他的比特币转给谁,比如A把他的10个比特币转给B。
如果A要支付这10个比特币,他必须在这里注明他从上次交易中得到的是哪一个比特币,并且在这次支付交易中,他必须提供自己的数字签名。
这项工作通常由比特币钱包完成,用户不会察觉。
之所以要提供数字签名,是因为之前的交易指定了比特币要支付给A的某个钱包地址,A必须使用匹配这个地址的数字签名才能花费比特币。
这是对比特币交易的普遍理解。 只有掌握地址对应的私钥并进行数字签名,才能使用对应的比特币。
然而,比特币交易并不是以这种有针对性的方式设计的。 在为交易指定比特币的接收者时,它使用锁定脚本; 当收件人想要花费该比特币时,他需要在新交易中提供解锁脚本。
脚本,简单的说就是指一个可执行程序
当我们通过转账交易向某个地址转入一定数量的比特币时,该交易实际上只包含了对这些比特币的锁定脚本。 锁定脚本定义解锁条件。 在转账交易中,锁定脚本定义了这些条件(虽然本文直接用文字描述了脚本内容,但实际上它们必须用特殊的脚本语言编写):
请提供两个值: - 第一个值在哈希后等于指定的 <地址> - 第二个值是第一个值的签名
本文所述的“XX的签名”中,XX通常是公钥,签名是指使用公钥对应的私钥对交易进行签名。
当一个交易想要解锁它所代表的比特币时,它必须提供这个脚本:
这里有两个值: - 第一个值是一个公钥 - 第二个值是一段数字签名
比特币矿工在验证一笔交易时,会将这两个脚本结合起来,看能否成功执行。 只有在成功执行后,新交易才会被添加到区块链中。
如果比特币只是作为一种虚拟货币来提供转账功能,就没有必要使用这个可编程的脚本。 但由于比特币交易提供了这种脚本机制,它能做的远不止简单的转账交易。
它可以定义智能合约。
什么是智能合约
根据维基百科,“智能合约是一种计算机程序,用于促进、验证和执行数字世界中的特定合约。它允许在没有第三方的情况下进行可信交易。它的执行是可追溯且不可变的。” “
智能合约可以根据不同的条件执行预设的步骤; 它的执行需要根据外部条件触发; 它的执行将修改该子句所针对的对象的状态。
智能合约包含合约中所有条款的信息,可以根据条件自动执行所有预设动作。
这并不是一个很新的概念,但是因为区块链的普及,智能合约的特性可以更好的实现。
如果智能合约要在不受第三方控制的情况下自动可信地执行,其条款所针对的对象(object)必须在其控制之下; 触发其执行的外部条件必须是可信的。
让我们看一下基于比特币示例的智能合约是什么样子的。
比特币智能合约
联名账户
比特币可以实现的最简单的合同类型之一是联名账户——需要两个或更多人同时签署的货币。
假设三个人合作提供某种专业服务,客户用比特币支付,他们希望所有收益至少有两个人的签名。
当客户付款时,交易的锁定脚本可以定义如下
请提供 2 个数值, 它们是公钥 A,B,C 之二的签名:
客户使用此交易支付他们的比特币,这相当于支付到他们的联名账户智能合约中。
假设他们三人中,A的控制权更大,我希望联合管理账户的规则定义为:A可以直接控制资金,如果是B和C,需要两个人共同决定。
比特币也支持这个逻辑。 此时,智能合约的锁定脚本可以写成两个条件:
条件 1: 请提供公钥 A 的签名; 条件 2: 请提供公钥 B 的签名; 请提供公钥 C 的签名。
比特币脚本使用“IF...ELSE...”的形式来定义这样的分支条件,解锁时可以选择其中一个执行,就像在传统合约中,双方决定自己要行使哪些权利根据情况。
时限
比特币脚本支持时间条件。 在比特币这样的分布式网络中,时间很难统一。 因此,比特币网络根据当前的区块链数据计算出所谓的“共识时间”。 这个共识时间比实际时间晚一个小时左右。 (参见 BIP-113)
比特币中的智能合约可以根据这个共识时间进行逻辑编写。
仍然假设A、B、C三方合作提供服务,他们希望客户支付给他们的钱进入这样一个联名账户:钱到账后,30天内,三人中的两人必须签字在他们能够控制它之前联合起来; 30 90天后,可以使用三者中的任何一个加上他们的律师D的签名; 九十天后,可使用三人中任何一人的签名。
支付交易的锁定脚本可以直接定义这三组不同的条件:
条件1: 请提供公钥 A, B 和 C 之二的签名 条件2: 当前距离交易时间必须已经过了 30 天 请提供公钥 A,B 和 C 之一的签名 请提供公钥 D 的签名 条件3: 当前距离交易时间必须已经过了 90 天 请提供公钥 A,B 和 C 之一的签名
类似的逻辑组合无穷无尽。 关于共管账户逻辑的智能合约,这里举个例子。 接下来我们看看其他类型的智能合约,比如博彩。
简单的双向投注
假设 A 和 B 两个人想打一个简单的赌注。 他们不在同一个地方,想通过比特币平台来做。 (当然,现在这不太现实,因为比特币的交易成本太高了,但还是举个例子吧)
比特币上没有可使用的随机数,也没有掷骰子。 于是他们做了一个初步设计:A和B各提供一个数,将两个数相加除以2,余数为0则A胜,余数为1则B胜。
解决方案听起来很简单,但有一些细节需要解决。
1)剪刀石头布问题
第一个问题是,如果他们中的一个先得出数字,另一个自然可以调整自己的数字以确保获胜。 就像剪刀石头布一样,每个人都出不了一个接一个。 但是比特币网络没有办法保证双方同时提供数字。
这个问题可以通过取哈希值来解决。 整个过程如下:
获胜者根据第二轮的数字确定。 赢家可以将双方的赌注从合同中扣除。
有了hash值,第二轮双方都不能临时修改自己的数字,从而解决了剪刀石头布的问题。
在第一轮中,A 和 B 都必须将赌注支付到特定的合约中。 这个合约脚本比较复杂,它定义了两组条件:
条件 1: 请提供三个数值 第一个数值经过哈希后等于 第二个数值哈希后等于 第一和第二个数值之和除于 2 等于 0 第三个数值,是公钥 A 的签名 条件 2: 请提供三个数值 第一个数值经过哈希后等于 第二个数值哈希后等于 第一和第二个数值之和除于 2 等于 1 第三个数值,是公钥 B 的签名
这份合约可以这样理解:当公开的数字之和除以2等于0时,只有A可以控制资金; 否则,只有 B 可以控制资金。
所以,第二轮结束后双方公开号码后,如果A赢了,他就可以用这两个号码和自己的签名把双方的赌注都取出来。 如果 B 赢了也是一样。
2)拒绝作弊
接下来,需要解决第二个问题。 万一第二轮,一个人公开号码后,另一个人发现自己肯定会输,不愿意公开号码怎么办。 虽然无法挽回赌注,但在没有互信的环境下,损人利己的行为还是需要避免的。
为了解决这个问题,可以添加保证金合约。
对于B来说,他需要向比特币网络支付一定的押金。 此保证金只能通过以下两种方式之一提取:
A 签字,但在一小时后(或双方约定的其他时间),B 签字并公开他的号码
保证金合约锁定脚本定义的条件大致如下:
条件 1: 当前时间距离交易时间必须已经过了一个小时 请提供公钥 A 的签名 条件 2: 请提供公钥 B 的签名 请提供一个数,它在哈希计算后等于
有了这个合约,如果B想要赎回他的押金,他必须公开他所投注的号码。 而且,如果一小时后仍未披露,A可以自行提取B的保证金。
A同样如此,A也需要为这样的合同支付保证金。
于是下注过程变成了三轮:
结果将根据第三轮披露的数字确定。 双方通过公开数字取走自己的存款; 赢家通过数字和自己的签名带走双方的赌注。 如果一方拒绝透露号码,另一方可以拿走对方的保证金; 双方都输掉赌注。
至此,赌约在双方互不信任的情况下完成。
比特币智能合约的特点
比如我们梳理一下比特币智能合约的特点。
比特币上的脚本支持基本的算术和逻辑运算,一些复杂的运算如计算哈希值、校验数字签名等,可以根据条件有选择地执行动作,也可以根据区块链共识时间判断时间。
基于这些能力,可以组合更复杂的逻辑。 但是它不支持循环,所以不是“图灵完备”。
图灵完备意味着能够进行任何可能的计算(准确地说,图灵机能够进行的任何计算)。 图灵完备语言设计的程序有一个著名的“停止问题”:你不运行它,你无法知道它是否能在有限的步数结束。 这在比特币交易中是不可接受的,因为任何交易在被放入区块链之前都会被验证,脚本会被执行。 如果有一个脚本不能执行,整个网络就无法运行。
按照这个逻辑,这些合约能实现什么? 或者,他们可以控制或改变外部事物吗?
从以上例子来看,他们只能控制交易脚本锁定的比特币。 如果我们通过“彩色币”在比特币网络上发行自定义资产,我们也可以通过智能合约来控制这些自定义资产。
彩色币是指在一个面额较小的比特币上加上额外的标签和属性,使其代表其他含义,比如自定义货币,或者实物资产的所有权证明等。 这个也可以通过脚本来实现,但是不属于智能合约的范畴,这里就不详细解释了。
这些合约的执行通常需要一个或多个参与者的动作来触发。 根据上面的例子,我们知道触发需要这些类型的外部信息:
参与者签名合约定义的信息辅助条件路径选择值
在本示例中,所有外部信息都是可信的。
数字签名比特币合约是什么,如果我们认为非对称加密算法没有被破解,私钥确实在其所有者手中,那么他们就是可信的。
合约定义信息,包括上述1)转账脚本中“哈希后的值为特定地址”的值; 2)质押协议中“哈希后的值为特定数字”的数字; 3)用于确定时间条件等的区块链共识时间。这些都是可信的。
辅助条件路径选择的值不影响合约的执行,只与执行路径的选择有关。
因此,上面提到的智能合约都是“无信任”合约,即不需要建立在人与人之间任何信任基础上的合约,也不需要任何第三方见证。
但部分合约要求的输入信息不能保证可信。
不可信的外部信息
许多智能合约的执行往往需要基于一些外部事实。 当这些事实被放入交易中以触发合约的执行时,它们的来源不一定是可信的。
考虑一个例子,A 和 B 两个人在 2014 年世界杯决赛前投注德国或阿根廷。 A 认为德国赢了,B 认为阿根廷赢了。 他们想把一切都投入到智能合约中。
我们如何编写这个智能合约?
粗糙无用的版本
该智能合约的条件必须涉及“谁赢得德国或阿根廷”这一事实。
这是合同的几乎无用的版本
条件 1: 请提供公钥 A 的签名; 条件 2: 请提供公钥 B 的签名。
这里面有一个假设:A和B都会根据决赛后的真实结果来选择执行条件1或者条件2。 但合同中对此没有限制。
所以这个智能合约基本上是没有用的。 A 和 B 之间需要完全相互信任以确保合同有效。
引入仲裁者
我们可以引入一个仲裁员C,这个合约条件就变成了:
条件 1: 请提供公钥 A 的签名; 请提供公钥 C 的签名。 条件 2: 请提供公钥 B 的签名; 请提供公钥 C 的签名。
此时A、B已经信任仲裁员C,仲裁员必须参与到这次对赌行为中。 C必须根据比赛结果有选择地允许A或B取走赌注。
与交易无关的仲裁员
从技术上讲,我们也可以实现一个与投注行为无关的仲裁员,他只对真实事件负责。
在世界杯决赛之前,这位中立的仲裁员发布了两把公钥,一把代表“德国赢”,一把代表“阿根廷赢”。
A 和 B 将赌注支付给以下合约脚本:
条件 1: 请提供公钥 A 的签名; 请提供公钥“德国胜”的签名; 条件 2: 请提供公钥 B 的签名; 请提供公钥“阿根廷胜”的签名;
世界杯决赛结束后,仲裁员根据比赛结果发布了其中一把私钥。 另一个私钥不能公开。
如果德国赢了,A可以通过仲裁员代表“德国赢”的私钥和自己的私钥签署交易,获得赌注。 如果阿根廷赢了,B 也可以这样做。
虽然这个中立的仲裁员没有参与任何交易,但是A和B之间的智能合约还是给了他一定程度的信任。
可信输入源是一个重要问题
根据以上讨论,我们知道大部分与现实生活相关的智能合约都可能涉及一些输入信息,其可信度无法通过密码学或区块链来保证。
这种智能合约要么将信任部分转移给第三方,要么需要设计额外的去中心化机制来解决这种信任问题。
因此,部署在可信区块链上的智能合约本身并不可信。
这是考察区块链应用时需要重点关注的问题。
最后我们看看比特币不支持哪些类型的智能合约。
比特币智能合约的局限性
比特币平台上的智能合约有比较大的局限性。 以下是我认为比较重要的几个方面:
1)它们不是图灵完备的
简而言之,图灵完备性是执行任何可以想象的计算的能力。 比特币平台上的智能合约不支持循环运算,因此不是图灵完备的。
2)合约执行时,无法指定受影响的比特币数量,要么全部解锁,要么完全不解锁
它不能轻易实现这样一个合约:A支付给B大量资金,但不希望B一下子全部取走,只允许他每个月取回一定数额,A可以随时冻结或取回所有余额时间。
3)合约没有中间状态
由于比特币上的智能合约只是一个锁定脚本,解锁成功前后没有中间状态,复杂的协议难以实现。
比如上面介绍的“不基于信任的投注”,这个简单的协议也需要三份合约——两份保证金合约和一份投注合约——来执行。
可以想象更复杂的协议。
关于因为这些限制而无法实现的智能合约,我就不多举例子了,因为在比特币之后,还有更好的智能合约区块链平台发展迅速,比如以太坊。
在比特币之后
除了上面提到的局限性,比特币平台不再适合作为智能合约平台还有两个重要因素,一是性能,二是交易成本高。 因此,在接下来的系列智能合约“科普”文章中,我会更多地介绍以太坊等平台上的智能合约。
最后,让我们简单回顾一下比特币智能合约的一些事实和特征:
比特币交易脚本可以通过设计复杂的逻辑来实现智能合约; 比特币智能合约只能控制交易中包含的比特币,或比特币平台上发行的自定义资产; 比特币智能合约需要外部输入信息才能执行。 从外部输入的信息可能是Trustless(不需要任何信任基础就可以信任),也可能不是; 智能合约的每次成功执行都会解锁它控制的所有比特币或自定义资产。 全有或全无。
欢迎加入群峰社,共同探讨学习。