1、联合外部服务智能合约的第一个应用案例通常是,根据一些外部事件,改变自己的行为。例如,按照某个月降雨量向投保人支付一定金额的农业保单。这个想象的过程是这样的:智能合约会一直等到预定的时间,从外部服务获取天气报告,然后按照获取的数据采取恰当的行动。听起来很简单,但却不可能实现。为什么呢?因为区块链是基于共识的系统;就是说只有在每个交易和区块处理过后,每个节点达到相同状态,智能合约才会开始运行。区块链上发生的所有事情必须是确定的,这样才不会出现分歧。两个有信誉的节点对区块链状态有歧义的时候,整个系统就变得完全没有价值了。然后就是智能合约由链上的每个节点独立执行,因此如果智能合约从外部服务获取数据的话,这个数据获取过程是由各节点重复和独立完成的。但是因为这个数据来源于区块链外部,不能保证每个节点都收到同样的答案。也许这些数据源收到不同节点要求时,会给出不同的应答;或者干脆暂时不可用。不管怎样,共识都被打破了,整个区块链也就崩溃了。那么解决方法是什么呢?事实上很简单。不需要智能合约发出外部数据获取指令,而是由一个或多个受信任方预报者进行交易,而这些交易会将需要的数据嵌入区块链。每个节点都有该数据的相同备份,因此可以用于智能合约的计算中。也就是说,由预报者将数据推送进区块链,而不是由智能合约将数据拉取进去。并且如果是智能合约引起外部世界事件的情况,同样会出现类似的问题。例如,很多人都喜欢利用银行api进行资金转移的想法,但是如果每个节点都独立执行区块链代码,那么由谁去获取这个银行api呢?也许你会说,可以选择一个节点去做这个;但是如果该节点发生故障了,无论是不是故意的,我们又该怎么办呢?那么选择全部节点去完成api获取的话,是否每个节点都可信,怎么保证api密码的安全呢?况且我们又是否愿意一个api被多次频繁使用呢?更糟糕的是,如果智能合约想要知道api获取是否成功,就会发现我们又到过分依赖外部数据的尴尬境地中。同样的,可以用一个简单的解决办法。智能合约不需要获取外部api,我们用受信任的服务监控区块链状态,然后做出相应的反馈。例如,一个银行可以积极地监控区块链,然后进行链上交易对应的资金转移。这样就不会对区块链共识产生威胁,因为它完全处于被动状态。这两个解决方法可以总结出以下结论。第一,区块链和外部世界之间的互动都需要受信任的服务。但是尽管技术上说是可行的,却可能歪曲去中心化系统的目标。第二,这些解决方案用到的机制都是数据库读写的简单直接的例子;提供外部信息的预报者只是简单地把相关信息写进区块链中。而现实世界中反映区块链状态的服务也只是读取区块链的数据。也就是说,区块链和外部世界的互动被限制于常规的数据库操作。
2、执行链上支付这个提议是我们常常听到的:用智能合约自动执行所谓“智能债券”的优惠券支付。就是在恰当的时候,用智能合约代码自动发起支付,避开手动程序的复杂性,保证发行者的执行。当然,为了实现以上功能,支付必须用区块链上的资金;否则智能合约就不能保证完成支付。要注意,这个包含债券和现金的金融账本用例中,区块链只是数据库。所以在优惠券的支付中,我们谈论的是在规定时间内自动执行的数据库运行。尽管自动化运行在技术上是可行的,却有金融难度。如果债券的智能合约控制了用于债券支付的资金,这些支付就有了保障。同时意味着发行者或其他任何人都不能使用这些债券。但是如果这些资金不受智能合约控制,就不能保障系统进行支付。也就是说,智能债券要么对发行者无用,要么对投资者无效。只要随意想想就知道这是很明显的结果。从投资者角度看,债券的全部意义在于其吸引人的报率,当然有一定的故障风险。对于发行者来说,债券目的是为有报、同样有风险的活动进行融资,例如建造厂房。发行者没办法保证实现融资,同时投资者还会收到报。区块链没办法解决风险和报之间的关联,这并没什么值得惊讶的。
3、隐藏机密数据 部署区块链的最大挑战是其高透明度。例如假如10家公司共同建立一个区块链,其中两家公司进行了双边贸易,另外八家公司马上就可以看到相关信息。尽管有很多解决问题的方法,中心化数据库的简单性和高效性是独一无二的。其中受信任的管理者完全控制信息查看渠道。有些人认为智能合约可以解决这个问题,因为首先每个智能合约都包含一个完全自己可以控制的小型数据库。这个数据库的所有读写都由合约代码决定,使合约之间数据的直接互相读取变得不可能这个数据和代码之间紧密的联系被称为封装,是流行的面向对象编程范式的基础。所以,如果一个智能合约不能获取另一个的数据,还能说解决了区块链保密性问题吗?讨论智能合约的信息隐藏还有任何意义吗?不幸的是,答案是否定的。因为即使一个智能合约不能读取另一个的数据,相关数据还是存储在区块链的每个节点上。对每个区块链参与者来说,他们完全控制的是信息是存储在系统磁盘或存储器里的。没有任何东西可以阻挡其读取自己系统里的数据,除非他们自己选择不读取。在智能合约中隐藏数据与在网页的html代码中隐藏一样安全。当然一般用户是无法看到数据的,因为它不是显示在他们浏览器窗口的。他们需要做的就是网页浏览器添加“浏览源代码”选项浏览器都有该功能,然后相关信息就普遍可见了。同样的,想要查看智能合约中隐藏的数据的用户需要修改其区块链软件,显示合约的完整状态,然后所有秘密性特征都会消失。随便一个稍微像样点的程序员都可以在一个小时内完成以上操作。
4、智能合约的用途智能合约既然能做这么多事,也许就会有人问它真正的目的是什么。为了答这个问题,就需要到区块链本身的基本原理了。总结来说,区块链使数据库可以直接安全地被无需互信的团体共享,也无需中心管理者。区块链支持数据的脱媒,能显著减少复杂性和成本。交易可以修改任何数据库,其中包括必须整体性成功或失败的数据库的变化。比如说金融账本中,验证a是否资金充足的交易代表a给b的付款,然后从a账户中拿出的资金会添加到b的账户中。常规数据库中的这些交易是由单一受信任机构创建的;相反在区块链驱动的共享数据库中,任何区块链用户都可以创建交易。并且因为用户不是完全互信,所以其数据库必须包含限制交易的规范。比如说在点对点金融账本中,每笔交易必须保存全额资金;否则参与者就可以随心所欲的分配资金。表达这些规则的方式很多,但是目前主要有两个范本,分别是比特币和以太坊。比特币的方法可以称为“交易限制”,其评估交易的依据有:交易删除的数据库条目以及被创建的条目。金融账本规则规定被删除条目的总资金额必须等于被创建的条目的资金额假设现有条目的修改与条目的删除和新建条目对等。然后到开头智能合约用途的问题:智能合约是用于区块链中受交易限制而无法执行的应用案例的。按照智能合约应用的标准,可以预测许可型区块链将有很多应用案例。无论答案是什么,最重要的是记住智能合约只是限制数据库中交易的一种方式而已。显然这是很有用的,也是安全的数据库共享必须的;但是智能合约做不了其他任何事,也肯定脱离不了它们所在的数据库范围。