因为比特币的区块链是专用在货币上的,把它改造为用于表示其他应用是很有挑战性的。在比特币世界里,你会发现有许多人偏爱把比特币或者别的区块链作为去中心化的平台。在本节,我们来分析两种方法。
方法1:直接在比特币基础上
区块链融合自然而然的出发点是比特币。这也是我们在前面11.1节智能汽车例子里用的办法。直接使用比特币的好处就是容易实现——代码容易运行,比特币网络有很强的挖矿能力,共识过程没有瑕疵。然而,我们必须在比特币上做些修改才能用于我们的例子。比如,用于授权比特币交易的加密要等同于用于打开车门的加密。有时候对比特币的修改是不可能的,而且从根本上说,如果你有非常复杂的涉及不同方的合约,用比特币的区块链不一定能足够胜任或者不可分割地执行。为了展示用比特币区块链的危险性,我们研究一下如何构建一些中性的非中介化的应用程序。
首先,我们来研究众筹服务。在2015年,最广泛使用的众筹网站是Kickstarter, 它通过一个中心化的网站,连接了创业者和资金提供方。我们欣赏Kickstarter的想法,但希望通过建造一个完全去中心化的替代系统。这个系统需要让创业者能要求投资人捐款,但是在收到一定预先设定数额之前,创业者不能花掉任何一分钱。所有的这些都是没有中介的。
用比特币的技术实现这样的众筹服务,需要创业者创建一个特定输入的交易(输入数可以随着进程而改变)和一个支付给自己的输出,比如支付1 000个比特币(BTC)。这个交易将在潜在的资助者中流传。任何资助者都可以把资助额加在交易的输入上,并且数字化签名他们的输入和总输出。只有到所有输入等于或者大于输出的时候,创业者才能取得这笔交易的所有输入(见图11.1)。因为签名形式有限,我们要用到比特币一些鲜为人知的功能,才能花掉最后的交易额。虽然这在当今的比特币系统能做到,但是我们必须钻研到比特币里很少人知道的角落。这并不是一个日常见到的标准比特币交易。
图11.1 通过比特币众筹
注:由不同资助者发起的多输入的单笔交易。每个资助者签下他们的输入和输出。只有在累积输入数额达到或者超过输出,该交易才有效。
另一个案例:支付证明费用(paying for a proof)。这个案例初看起来好像奇怪,但是它有很重要的应用。为了表示清楚,我们假设有个哈希函数H和一个大家都知道的数字y, y是H输入x后产生的输出。爱丽丝知道这个x的数值,鲍勃为了知道这个x值,愿意支付给爱丽丝。广义上讲,H可以是任何计算程序,鲍勃希望知道他感兴趣的能够产生特定结果的输入值。这个问题的进一步演变是,鲍勃也许愿意支付一定的费用,让这个输入值公开在区块链上。
为了安全地实现这笔交易,我们必须确认交易的不可分割性。爱丽丝只有提交正确的输入才能收到钱。而鲍勃一收到输入必须承担支付责任。记得我们在第10章的不可分割的交叉链互换协议中,展示了如何绑定支付和呈现哈希函数输入值。类似的方法可以用在这里。
这些例子显示了直接使用比特币区块链的重要局限性。在每个例子中,我们必须把复杂的真实世界交易编译成比特币的概念。这不一定总能实现。在智能汽车的例子里,我们假设该车用ECDSA签名技术来验证汽车的主人。这就允许我们使用区块链和遥控器相同的公/私密钥来开锁并发动汽车。在众筹例子中,创业者只能拿到他们要求的数额,不能多也不能少。如果资助的金额大于需求的,多出的部分就成为交易费用。最后,在支付证明费用的例子里,如果函数H不是比特币语言所支持的哈希函数,那么连接支付和公开数字这种模式就很困难。
如果你不能,或者不想把应用程序强行套入比特币的交易体系,那么可以选择使用附着币,我们在第9章讨论过附着币。这样比特币就成为数据存储,因此比特币的脚本语言如何表达就与之无关。这种用附着币的方式,不仅可以构建很多其他应用,还可以使应用透明化。重新回到卖车的例子,如果区块链中对象的颜色是公开的(比如以有颜色的货币来表示),任何人都可以通过检查区块链得知汽车在何时购买,以什么价格,而不用知道买卖双方的真实身份。这种方式在某种情况下很有用。在对它不利的时候,颜色的对象可以不对外公开。
然而,这种附着币有重大缺陷。附着币的用户无法依靠比特币的矿工来验证交易(因为矿工无法了解附着币的交易语言含义)。这意味着所有附着币的用户必须以全网节点的方式运行。SPV也不可能。只要在构建的时候存在使得共识无法达成的漏洞,附着币就会变得很不稳定。如果两个附着币对一个交易的有效性持不同意见,会导致这个货币形成两个分叉货币。这会导致灾难性的后果。相反,如果由矿工来验证交易,这种不同意见的情况就会很少发生。如果这种情况真的发生了,那么它很快就会引起注意并且很可能解决,而不会导致货币分叉。
从另一方面考虑,无论我们是否用附着币,用比特币的初始范畴外的交易会加重或者“污染”比特币的区块链。在比特币世界,这个问题双方争执不下。我们不选边站,但是我们要指出有一个解决的办法:就像我们在9.1节看到的,仅仅把比特币当成时间戳服务,而不是当成数据存储。目前有刚刚起步的服务,提供另外的区块链或者数据存储服务。其中有一个服务是通过比特币区块链做时间戳服务。这就像第9章讨论过的时间戳服务,但是多了每10分钟一次哈希计算,而不是每周一次在新闻报纸上。用比特币当时间戳只要每区块(或者每次服务或者协议)一次交易。不完美的地方就是,很难找到像比特币区块链这样容易获得并且广泛复制留存的外部数据存储。同时,一般的非比特币数据存储更加中心化。
总的来说,不管是否使用嵌套技术,比特币的区块链诞生了许多创新的应用。这些通过比特币区块链产生的应用,受到用户和矿工的广泛接受。因此,使用比特币区块链是一个安全且容易实现的选择。
方法2:另类区块链
去中心化的另一个方法是使用另类区块链,也有几个选择方案。最明显的方法就是,使用一个全新的区块链,有自己的规则、功能和货币(也就是另类币)。另一个方案是,使用我们在第10章学过的侧链。这个方案的主要不同在于侧链的货币是1∶1的比例方式与比特币挂钩。有高级脚本语言的侧链可以满足复杂合约的要求,也能做到去中介化。但是,侧链需要对比特币进行修改,这些修改目前到2015年还没有进展。
第三个选择是用已经存在的另类区块链,这个区块链能够支持新的应用程序。截至2015年,我们在第10章讨论过的以太坊体系,是最有潜力的去中心化加密货币应用程序平台。从概念上看,以太坊是去中心化的复杂合约的理想平台。当然,以太坊也面临实际的挑战:至少到2015年,它还没有达到比特币同等水平的成熟度、接受度和挖矿计算力,也没有接受相应水平的安全性考验。无论如何,这是一个令人着迷的去中心化复杂合约的精美实验。未来,以太坊体系或者其他体系有可能蓬勃发展。