1703869250
1703869251
安全的交易
1703869252
1703869253
假设爱丽丝拥有一辆智能汽车想卖给鲍勃,能够数字化地转移汽车控制权会引起几个有趣的可能性。比如,爱丽丝也许正在国外旅行正需要钱来支付旅费,所以要卖掉停在她家后院车库的汽车。只要联上互联网,鲍勃就可以用比特币支付给爱丽丝车钱,爱丽丝可以远程通过区块链把车的所有权转移给鲍勃,鲍勃就可以开走这辆车。
1703869254
1703869255
然而,这样的交易存在一定的风险。如果鲍勃先支付,爱丽丝也许收了钱而不转移车的所有权。如果爱丽丝先转移车的所有权,鲍勃也许不付钱就把车开走了。即使假设爱丽丝在现场,也有可能另一方突然改变主意而撤销交易。这时候让不在场的第三方来调解争议也很困难。
1703869256
1703869257
我们之前多次碰到这种问题,包括在合币(第6章)和域名币(第10章)中。解决这类问题要使用同样的原则。只要支付的货币和汽车的拥有权同时存在相同的区块链,爱丽丝和鲍勃就可以产生一个不可分割的交易。这个交易同时转移汽车的所有权和车款。具体地说,这个交易规定两个输入:爱丽丝的所有权和鲍勃的支付款;规定两个输出:归鲍勃的所有权和归爱丽丝的支付款。这个交易需要双方提供输入要素,因此要求双方都要签名。如果只有一方签名,交易就无效。一旦一方签名,交易的细节就无法改变,除非这个签名无效。签过名的交易一旦对整个区块链广播,鲍勃只要等预设的几次确认(一般是6次),就可以拥有这辆车。鲍勃支付给爱丽丝的款项也同时被确认。两个确认是相辅相成,缺一不可的。
1703869258
1703869259
细心的读者也许注意到了一个微妙的问题。鲍勃可以收到爱丽丝签名的交易,自己也签名,但是不立即对外广播。等到爱丽丝卖东西的价格变了,鲍勃才把旧交易用原来的价格对外广播。所以为了避免这种问题,比较复杂的不可分割的交易里包括截止时间。过了截止时间后,爱丽丝可以发送输入她控制下的新地址,用来表示撤回她发给鲍勃的已经签过名的交易。
1703869260
1703869261
这是本章案例之一。我们将会在本章看到,很多其他案例使用区块链技术促使现实中的各种交易程序去中心化,从而达到不同种类的去中心化状态。其中,不可分割性(atomicity)是绝大多数案例共有的特性。也就是说,交易每一方的交割都是联系在一起的,所以它们都同时发生或者都不发生。不可分割性是区块链以外应用程序领域里重要的安全概念。
1703869262
1703869263
1703869264
1703869265
1703869267
区块链技术驱动金融:数字货币与智能合约技术 11.2 通往区块链融合之路
1703869268
1703869269
因为比特币的区块链是专用在货币上的,把它改造为用于表示其他应用是很有挑战性的。在比特币世界里,你会发现有许多人偏爱把比特币或者别的区块链作为去中心化的平台。在本节,我们来分析两种方法。
1703869270
1703869271
方法1:直接在比特币基础上
1703869272
1703869273
区块链融合自然而然的出发点是比特币。这也是我们在前面11.1节智能汽车例子里用的办法。直接使用比特币的好处就是容易实现——代码容易运行,比特币网络有很强的挖矿能力,共识过程没有瑕疵。然而,我们必须在比特币上做些修改才能用于我们的例子。比如,用于授权比特币交易的加密要等同于用于打开车门的加密。有时候对比特币的修改是不可能的,而且从根本上说,如果你有非常复杂的涉及不同方的合约,用比特币的区块链不一定能足够胜任或者不可分割地执行。为了展示用比特币区块链的危险性,我们研究一下如何构建一些中性的非中介化的应用程序。
1703869274
1703869275
首先,我们来研究众筹服务。在2015年,最广泛使用的众筹网站是Kickstarter, 它通过一个中心化的网站,连接了创业者和资金提供方。我们欣赏Kickstarter的想法,但希望通过建造一个完全去中心化的替代系统。这个系统需要让创业者能要求投资人捐款,但是在收到一定预先设定数额之前,创业者不能花掉任何一分钱。所有的这些都是没有中介的。
1703869276
1703869277
用比特币的技术实现这样的众筹服务,需要创业者创建一个特定输入的交易(输入数可以随着进程而改变)和一个支付给自己的输出,比如支付1 000个比特币(BTC)。这个交易将在潜在的资助者中流传。任何资助者都可以把资助额加在交易的输入上,并且数字化签名他们的输入和总输出。只有到所有输入等于或者大于输出的时候,创业者才能取得这笔交易的所有输入(见图11.1)。因为签名形式有限,我们要用到比特币一些鲜为人知的功能,才能花掉最后的交易额。虽然这在当今的比特币系统能做到,但是我们必须钻研到比特币里很少人知道的角落。这并不是一个日常见到的标准比特币交易。
1703869278
1703869279
1703869280
1703869281
1703869282
图11.1 通过比特币众筹
1703869283
1703869284
注:由不同资助者发起的多输入的单笔交易。每个资助者签下他们的输入和输出。只有在累积输入数额达到或者超过输出,该交易才有效。
1703869285
1703869286
另一个案例:支付证明费用(paying for a proof)。这个案例初看起来好像奇怪,但是它有很重要的应用。为了表示清楚,我们假设有个哈希函数H和一个大家都知道的数字y, y是H输入x后产生的输出。爱丽丝知道这个x的数值,鲍勃为了知道这个x值,愿意支付给爱丽丝。广义上讲,H可以是任何计算程序,鲍勃希望知道他感兴趣的能够产生特定结果的输入值。这个问题的进一步演变是,鲍勃也许愿意支付一定的费用,让这个输入值公开在区块链上。
1703869287
1703869288
为了安全地实现这笔交易,我们必须确认交易的不可分割性。爱丽丝只有提交正确的输入才能收到钱。而鲍勃一收到输入必须承担支付责任。记得我们在第10章的不可分割的交叉链互换协议中,展示了如何绑定支付和呈现哈希函数输入值。类似的方法可以用在这里。
1703869289
1703869290
这些例子显示了直接使用比特币区块链的重要局限性。在每个例子中,我们必须把复杂的真实世界交易编译成比特币的概念。这不一定总能实现。在智能汽车的例子里,我们假设该车用ECDSA签名技术来验证汽车的主人。这就允许我们使用区块链和遥控器相同的公/私密钥来开锁并发动汽车。在众筹例子中,创业者只能拿到他们要求的数额,不能多也不能少。如果资助的金额大于需求的,多出的部分就成为交易费用。最后,在支付证明费用的例子里,如果函数H不是比特币语言所支持的哈希函数,那么连接支付和公开数字这种模式就很困难。
1703869291
1703869292
如果你不能,或者不想把应用程序强行套入比特币的交易体系,那么可以选择使用附着币,我们在第9章讨论过附着币。这样比特币就成为数据存储,因此比特币的脚本语言如何表达就与之无关。这种用附着币的方式,不仅可以构建很多其他应用,还可以使应用透明化。重新回到卖车的例子,如果区块链中对象的颜色是公开的(比如以有颜色的货币来表示),任何人都可以通过检查区块链得知汽车在何时购买,以什么价格,而不用知道买卖双方的真实身份。这种方式在某种情况下很有用。在对它不利的时候,颜色的对象可以不对外公开。
1703869293
1703869294
然而,这种附着币有重大缺陷。附着币的用户无法依靠比特币的矿工来验证交易(因为矿工无法了解附着币的交易语言含义)。这意味着所有附着币的用户必须以全网节点的方式运行。SPV也不可能。只要在构建的时候存在使得共识无法达成的漏洞,附着币就会变得很不稳定。如果两个附着币对一个交易的有效性持不同意见,会导致这个货币形成两个分叉货币。这会导致灾难性的后果。相反,如果由矿工来验证交易,这种不同意见的情况就会很少发生。如果这种情况真的发生了,那么它很快就会引起注意并且很可能解决,而不会导致货币分叉。
1703869295
1703869296
从另一方面考虑,无论我们是否用附着币,用比特币的初始范畴外的交易会加重或者“污染”比特币的区块链。在比特币世界,这个问题双方争执不下。我们不选边站,但是我们要指出有一个解决的办法:就像我们在9.1节看到的,仅仅把比特币当成时间戳服务,而不是当成数据存储。目前有刚刚起步的服务,提供另外的区块链或者数据存储服务。其中有一个服务是通过比特币区块链做时间戳服务。这就像第9章讨论过的时间戳服务,但是多了每10分钟一次哈希计算,而不是每周一次在新闻报纸上。用比特币当时间戳只要每区块(或者每次服务或者协议)一次交易。不完美的地方就是,很难找到像比特币区块链这样容易获得并且广泛复制留存的外部数据存储。同时,一般的非比特币数据存储更加中心化。
1703869297
1703869298
总的来说,不管是否使用嵌套技术,比特币的区块链诞生了许多创新的应用。这些通过比特币区块链产生的应用,受到用户和矿工的广泛接受。因此,使用比特币区块链是一个安全且容易实现的选择。
1703869299
[
上一页 ]
[ :1.70386925e+09 ]
[
下一页 ]