比特币脚本及其改进一例

来源:互联网 发布:行车记录仪支架淘宝 编辑:程序博客网 时间:2024/05/03 04:05

假如你是2009年的中本聪,你已经找到了解决双重支付的方法,现在要设计比特币的转账功能了。你会怎么做呢?我的设计方案会是这样:

发送方向比特币网络发一份广播,其内容是这样的:“从A地址转账1 BTC给B地址。同时附上A地址私钥的签名”。网络各节点收到广播,校验签名合法。于是从A地址扣掉1 BTC,给B地址加上1 BTC。

简洁明了对不对?我猜你的设计方案也许和我差不多。幸亏你我都不是中本聪。如果是这样的设计,那么比特币的潜力将大打折扣,我们也无法看到今天区块链领域的蓬勃生息。让我们看看中本聪的设计方案:

发送方向比特币网络发一份广播,其内容是这样的:“我要转账1 BTC,并且我能提供一段脚本,这段脚本作为钥匙可以打开这1 BTC上的锁;同时,我根据接收方的要求为这1 BTC加个新的锁”。

网络各节点收到广播,运行脚本,发现确实能“开锁”。于是根据发送方的指令给这笔比特币换上一把“新锁”,这笔比特币也就有了新的主人。当接收方想使用这1 BTC时,只要能提供一段新的脚本作为钥匙打得开这把新锁就行。

乍一看,中本聪的设计似乎非常繁琐和反直觉,然而这样的设计却大有道理。脚本是一种简单的计算机语言,比如JavaScript就是一种脚本。比特币的脚本可以表述的内容非常灵活,远远超出了一对一转账的范畴。例如:A可以约定必须由收款人B和担保人C同时签名才能支配某笔比特币(担保交易),也可以约定B、C、D中任意两人签名就能支配(联名账户);A可以约定B必须在一年后才能动用某笔比特币(延时支付),也可以约定任何人都能支配(撒钱)或者都不能支配(烧钱)。通过这套内置的脚本编程语言,你可以灵活地编写出各种各样的约定——而这其实就是简单的智能合约。用比特币脚本编写的合约系统,使得比特币成为了人类历史上第一种可编程的货币。

 

真正的中本聪是这么说的

 

2010年,当发现了比特币的内置脚本系统后,有人在bitcointalk上发帖表示了惊讶和不解:“比特币的脚本让我有点紧张,这过于复杂了,而复杂是安全的天敌”。此君不是别人,正是后来成为中本聪继任者的Gavin Andresen。中本聪是如此回复他的:

无标题

大意是说:我希望比特币在0.1版就能拥有稳定的架构,未来不需要再做底层改变。在过去几年设计比特币的过程中,我发现只有使用脚本系统才能完成我希望支持的各种复杂交易类型——担保交易连带合同第三方仲裁多方签名等等。

放在今天,也许中本聪会直接说:“比特币需要脚本,有了脚本,就有了智能合约”。

插个题外话。这篇帖子短短9条,却可以堪称区块链技术发展史上的一次重要对话。你会发现8楼有人问“比特币的脚本系统是不是意味着用户可以发行自定义资产?”。此人ID是bytemaster,后来其创立了可以发行用户自定义资产的比特股。9楼Gavin回复说:

“I don’t think you need scripts to do something like that. Just send a bitcoin to yourself, and then declare that transaction is the root transaction for My Valuable Asset.”

这恐怕是彩色币的概念第一次被提出。

 

比特币脚本的真容

 

说了这么多虚的,来点干货。现在请把你的大脑当做一台基于堆栈的解释器和虚拟机,看看比特币的脚本到底是怎么运作的。一个典型的比特币标准交易(Pay-to-Public-Key-Hash)的验证流程,需要执行这样的脚本:

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG(scriptPubKey就是前文比喻的1 BTC上的脚本“锁”)scriptSig: <sig> <pubKey> (scriptSig就是前文比喻的发送方A提供的脚本“钥匙”)

 

Snip20150924_27

 

脚本执行完毕后,如果结果为true,那么说明验证通过,A有权支配这笔比特币。比特币网络就会根据A的指示为这笔比特币加上一把“新锁”,转账完成。

 

比特币脚本的局限性

 

为了保持比特币的向前兼容和简单稳定,比特币的开发者们对其脚本做了诸多限制。比如脚本中没有循环语句,比如bitcoin core客户端目前只支持5种固定模式的脚本。这一方面是由于历史包袱,一方面是比特币的开发团队倾向于保守和稳健。

如何开发一个用于登记、管理和交易股权的区块链协议呢?(可关注:小蚁)。小蚁复用了比特币的主要架构,其中就包括了脚本系统。在此基础上,小蚁参考了Gavin Andresen提出的比特币改进提案BIP12,增加了一条OP_EVAL指令。我们先来看看小蚁下的标准交易(Pay-to-Script-Hash)是怎么工作的:

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_EVALscriptSig: <sig1> <sig2> <redeemScript> redeemScript: OP_2 OP_3 OP_CHECKMULTISIG

Snip20150924_28

Snip20150924_29

 

比特币脚本 + BIP12 = 图灵完备

 

OP_EVAL指令的加入使得小蚁拥有了图灵完备的脚本系统,也就为更复杂的智能合约提供了可能。

图灵完备是指一个能计算出每个图灵可计算函数(Turing-computable function)的计算系统。或者说,图灵完备使我们的脚本系统有能力解决所有的可计算问题。一方面,它带来了强大的处理能力;另一方面,它也使对脚本的静态分析变为不可能:我们永远也无法知道脚本何时会停止,除非我们真正去执行它。

比特币网络中的每一个节点都要执行每一笔交易中的脚本,这就使得比特币脚本系统的设计需要足够精简。而作为一个点对点的电子现金系统,比特币也确实无需更为复杂的脚本系统。

小蚁采用图灵完备的脚本方案,并通过以下的两个方法来避免图灵完备带来的问题:

  1. 限制每个脚本可执行的步骤,一旦脚本的执行超过了限制,就立刻判定为验证失败。由于任何节点在广播交易之前会首先验证它,因此超出步骤限制的脚本不会影响到全网的所有节点。
  2. 对于执行步骤很多的交易,收取较高的手续费,从而减少通过构造复杂脚本来发动拒绝服务攻击的情况。

解决了图灵完备带来的问题之后,小蚁的脚本系统可以应用于以下的一些场景:

 

  1. 智能合约:对合约的条件进行判断,满足条件后自动执行合约条款,比如股权质押贷款;
  2. 更高级的权限管理:利用脚本来对参与签名的密钥分配权限,完成比m-of-n更精密的权限管理;
  3. 彩票:脚本可以配合小蚁区块中的强随机数,实现彩票功能;
  4. 其它:图灵完备意味着只要你能想到的功能都可以实现。

关于脚本和智能合约,就先聊到这里。如果对你来说这些太简单了,那么欢迎牛人加入小蚁团队,我们的官网是:https://www.antshares.com/;如果你想了解多一些区块链领域的创新和投资机会,请加入小蚁社群的QQ群:23917224。10月份小蚁的众筹方案会在那里第一时间公布。