比特币能处理的事物有限,智能合约又可能是资源密集型的。所以即使比特币一直支持基本的智能合约功能,但这两者从来都不是天作之合。
最近由 Blockstream 数学家 Andrew Poelstra 带头研究的一个课题或许可以有助解决这一问题。Andrew在“Scaling Bitcoin Stanford”演讲中提及的“无脚本脚本”,有可能将某些智能合约完全从比特币区块链中移除,同时仍然保证比特币完整的安全性。
上世纪90年代,数字货币大佬 Nick Szabo首次提出的智能合约概念基本上是自动执行合约。最典型的是自动还款:满足特定条件时,资金从A汇给B。 例如,如果有人在播放一首歌曲,这笔钱则会从流媒体自动支付给艺术家。
虽然智能合约通常与以太坊等“第二代”区块链相关联,但比特币也一直支持基本的智能合约。从某种意义上说,任何比特币交易在技术上都是一个“智能”的合同:资金有条件转移,条件就是提供有效的加密签名。更先进点的智能合约(如多重数据和时间锁定)可用于启用闪电网络等layer 2协议。
但区块链的智能合约是存在一定的问题。首先,这个过程变得越来越复杂,执行需要更多的资源。这就是个很大的问题,不仅仅是参与的各方,全网节点都来执行合约。
全网执行也意味着,整个网络都确切的知道某个智能合约,完全没有隐私可言。 此外,这对于可互换性也是不利的。如果智能合约由于某种原因而不受欢迎,所涉及的资金(在区块链上公开可见)就会受到破坏。
随着智能合约变得越来越复杂,甚至可能产生安全隐患。例如,替代软件的实现可能会使合约在细节上有略微差异,从而使网络上的所有节点达成共识变得困难。这些智能合约中的潜在缺陷也是公开的,这就给黑客以可乘之机。
前面提到的Andrew Poelstra等认为,许多问题都可以通过将大量合约移至链下来解决。只有合约涉及的各方才能执行,不需要全网节点都计算出整个智能合约。
问题的关键就在于确保网络的其他节点仍然能够正确执行合约的结果,即满足所需条件时,才能进行支付。
Schnorr 签名
Poelstra 最初开始在Mimblewimble 协议背景下研究 “无脚本脚本”,这是一个自创的短语。 比特币的精简版本提供了更多的隐私和更好的可扩展性,但不支持脚本:在比特币交易中的代码位允许最基本的智能合约功能。
所以,Poelstra 想出了如何获得脚本所提供的实用程序,而不需要在区块链上使用脚本:Scriptless Scripts。
Scriptless Scripts的关键在于规定的加密签名可以间接地揭示不属于包含签名事务的一部分。 换句话说,当有人签署验证一个普通的比特币交易时,默认一个没有托管在区块链上的智能合约仍然忠实地执行。
这就使得 Schnorr 签名成为可能。这种类型的签名还没有在比特币协议上实现,但是从现在开始的一年左右就可能部署。
Schnorr 签名允许的签名:几个签名可以以数学计算的方式形成一个签名。而且,很重要的一点是,这个数学计算是“线性的”。意味着可以对这些签名执行相对直接但非常清楚的数学运算。
举个例子:
我们知道私钥和签名实际上就是数字,签名由私钥产生。
假设一个私钥是10,从该私钥导出的Schnorr 签名的前半部分为10000。另一个私钥是15,导出的Schnorr签名的后半部分为15000。那么,Schnorr 签名就是25000(或者10000+15000)。
这里所谓Schnorr签名就是由两个人的私钥生成的Schnorr签名的两个部分之和。
而且由于组成签名的两个部分都是数字,所以能对它们进行数学运算。例如,可以前一半和后一半之差是5000(或15000-10000)。
实际比这复杂的多,但是 Schnorr 签名线性的特点能做不少文章。
再举个例子:
一个人(小明)特别想听一位艺术家(贝多芬)的第七交响曲。贝多芬有这首曲子的版权,所以由他提供自己的签名给托管该曲目的服务器,服务器才能够播放。假设这个“歌曲签名”是7000,那么小明为了听歌得先拿到歌曲签名,这个签名价值一个比特币。
小明和贝多芬可以做两件事来让交易自动执行。首先,创建了一个普通的比特币交易,若小明和贝多芬提供各自的1/2 Schnorr签名后创建出一个完整的Schnorr 签名,则小明向贝多芬发送一个比特币。(当然还需要一些其他的安全措施确保交易不受破坏)
接下来,
贝多芬知道自己那一半的Schnorr 签名,比方说是8000;而且知道歌曲签名是上面提到过的7000。那么计算可得两签名的差值是1000。我们把这个差值1000叫做转换签名(adptor signature)。然后,贝多芬把这个转换签名,交给小明。
下面密码学登场了。
修改普通签名验证的方法,让小明即便不能访问任何一个签名(不知道签名具体是多少)的情况下,也能验证刚接收到的转换签名1000的确是贝多芬的那1/2 Schnorr签名与歌曲签名之差。(多亏了零知识证明这种存在,当然,适用的场合其实不只局限在签名这个例子,可用范围非常广)
验证转换签名1000之后,小明可以将自己的1/2Schnorr签名交给贝多芬,一旦贝多芬使用小明的1/2Schnorr签名创建出完整的Schnorr签名并广播到比特币网络中,那么,贝多芬同时也自动将他的1/2Schnorr签名8000显示给小明。
小明现在可以拿贝多芬的1/2 Schnorr签名8000减去转换签名1000,获得了贝多芬曲目的“歌曲签名”7000。
OK, 可以听歌了。
换句话说,通过广播,贝多芬收到一个比特的同时签名自动卖给了小明。
从区块链的角度来看,交易是相当普通的。 除了“结算交易”之外,智能合约的任何内容都不会记录在区块链上。没有人会知道某个底层的合约被执行,合约相关的数据也不需要由相关各方以外的任何人计算或存储。
网友评论