最近一周比特币的疯狂到达顶点。先是真格基金徐小平被曝光的一段私下表态引发资本市场对区块链概念的疯狂追捧,紧接着,包括比特币在内的全部数字货币大幅跳水。这样,又一个经典的荷兰郁金香似泡沫破灭了。
在此过程中,观察众生相很有意思。我的方法是看今日头条给我推的区块链相关消息。前几天的消息标题大体上类似“至今对区块链最明白的解释”,让人联想到一群中国大妈恶补区块链知识的场景。而一崩盘,便是各种理性分析,譬如比特币价格曲线和经典的泡沫价格曲线演绎路径惊人吻合,又是一幅吃瓜群众看热闹的景象。
崩盘(希望如此
)挺好的,终于消停了,是不是可以稍微回归理性了?把比特币与郁金香泡沫相提并论的人应该知道故事的后半段:1637年的郁金香风波最终促进了荷兰鲜花产业的繁荣。同理,这一轮数字货币的炒作和崩盘会不会拉开区块链广泛应用的序幕呢?至少,已经全民扫盲了。要知道,中国政府将区块链纳入“十三五”重点目标和重大项目,肯定不是为了让老百姓炒比特币。那么问题来了,除了比特币,区块链还有啥?
本文便将尝试为你解释区块链的其他应用,既包括了所谓“山寨币”(基于比特币源码开发的其他数字货币。对,比特币是开源的,这样你就能理解为啥有那么多XX币了吧
)、“竞争币”(全新开发的数字货币
),也包括区块链的非币应用。将它们的实现机制与比特币进行对照(参见比特币原理),便可进一步理解区块链,理解区块链更广阔的应用空间。同时,也会对比特币的发明者中本聪多一分敬佩,比特币确实是一个天才的设计,说它开启了一个新时代丝毫也不过分。文章分为三个部分:
- 首先,我们来看看各种区块链应用通常遵守的实现架构;
- 接着,依次介绍几个代表应用的原理,主要突出它们与比特币设计上的不同以及各自的应用场景。这些应用包括染色币、NXT、PrimeCoin、Dash、CryptoNote和以太坊。需要说明的是,这里列举的应用绝对不能代表区块链的全部可能,因为脑洞一旦打开,便有无限可能;
- 最后,分享一下我对区块链应用前景的预测。
1. 区块链应用的通常架构
区块链应用的协议架构通常由p2p网络、区块链、协议和应用四部分组成,如下图所示。
区块链应用的通常架构
p2p网络是指在节点之间建立连接的对等网络协议栈。“对等”网络是指组成网络的所有节点角色和重要性相同,任意节点下线都不会影响网络整体的正常运转。区块链应用的对等网络协议与大家熟知的迅雷、电驴、快播等相似。这个领域经过几十年的发展和应用,已相当成熟。
区块链是存储共识信息的分布式数据库。对于不同应用,由若干区块前后连接形成的链式结构是类似的。这根链条对应一个时间序列:越是排在前面的区块越早产生,是较后产生区块的祖先。和比特币区块链一样,子区块中会保存父区块的哈希值,如果篡改了父区块,将引起连锁反应,导致所有后代区块失效,因此越早产生的区块可靠性越高(越不容易被恶意分叉攻击弄失效
),这就是区块链无法被篡改的原因。而区块的内部结构,各应用可能有不同的定义:比特币区块存储的信息单元是交易,以太坊的区块除交易外,还存储着账号状态。具体讲到每个应用时再详述。区块中存储的用户相关信息都会以数字签名来保护,因此无法冒充其他用户的身份来发起交易。
区块链应用的核心是协议,其中最关键的是共识机制。区块链本质是一个分布式数据库,因此和其他分布式系统一样,需要满足以下三个特性要求:
- 一致性(Consistency,简称C):不同用户看到的系统状态是一致的;
- 可用性(Availability,简称A):在任何时候都能对其进行读写访问;
- 分区容忍性(Partition-tolerance,简称P):网络时延和节点掉线都不会对系统正常工作产生影响。
同时,按照CAP原理,以上三者不可兼得,需要在C和P之间取舍权衡。区块链便是放弃强一致性来换取高可用和完全的分区容忍。虽然如此,弱一致性,即最终一致还是必须的,保障它的方法就是共识机制。区块链的共识机制定义了由谁来产生新区块,冲突(即发生分叉
)时哪一条链是有效的。共识机制常见的是两类:
- “工作量证明(Proof of Work)”,典型代表如比特币。证明工作量的算法除比特币采用的SHA256外,还有出于特定目的的更多选择和设计;
- “股权证明(Proof of Stake)”,典型代表如Nxt(未来币)。
区块链应用的其他协议还包括合法性约定、签名算法、出块策略等。
最上层的应用则是为用户提供的功能。最常见的当然是数字货币功能了。然而这并不是全部,其他还包括智能合约、权益证明、遗嘱、房产证、驾照等等等,无法穷举。事实上,任何目前需要通过权威中心才能完成的事情都可以通过区块链来实现。譬如,货币交易中需要国家作为担保方保证货币的真实性。又譬如,签订合约需要一个公证人以确保合约是确实经过双方同意的。由于区块链具备三个基本特性,即唯一、不可篡改和用户身份无法冒充,任何记录在区块链中的信息绝对可信,不容置疑,这样作为担保的中间权威便不再是必要的。
OK。建立起区块链应用的基本框架后,下面我们就来看看,通过对比特币原始设计各模块进行扩展、定制和重新设计后能产生怎样丰富多彩的应用。
2. 别样的区块链应用
染色币
染色币是在应用层对比特币的一种扩展:通过在交易数据中携带自定义信息,来表示货币以外的另一种资产权益。就好比你在一张1元纸币写上“今从小明处借得1000元,以此为据”,签名后给小明,那么对于小明而言,这张纸币的价值便不再是1元,而是价值1000元的债权权益,小明肯定不会用这张纸币去乘公交车了。通过在普通数字货币中附加信息,使之具备其他含义,这便是名称中“染色”的由来。
那为啥非得在纸币上写欠条呢?拿张白纸写不好吗?写在钞票上最大的好处是无法复制。如果写在白纸上,小明用(很好的)复印机复印10份,你就欠小明1万了。而纸币由于其自身的防伪技术,复印后的1元纸币很容易认出来,因此小明无法作弊。类似的,将信息附加在比特币的交易数据中,一旦交易录入到区块链,这些信息便无法被篡改或销毁,同时,由于交易有发起者的签名,也就无法冒充、抵赖了。
还有一个原因是:方便。毕竟比特币的网络已经具备相当规模,节点越多,区块链的可靠性越强,染色币是大树底下好乘凉,远胜从0建立自己的网络。通过开发特定的钱包应用,便可签发例如欠条了;普通比特币钱包处理这些携带特殊信息的交易与处理正常交易并无差异,而定制钱包可从中读出夹带的信息。事实上,比特币交易中约有1%左右是非币交易,而且有十几种染色币协议。
技术控可能会问,究竟如何扩展呢?较早时,做法不统一,最常见的是将要夹带的信息伪装成一个符合语法但无效的比特币地址,作为交易的输出地址。这种做法对于严谨的程序员是难以接受的,因此社区引入OP_RETURN脚本,用来显式返回需要携带的信息。脚本....什么东东?好吧,我解释一下。比特币交易的基本单元是UTXO,可以把它理解为一张银行本票。没见过本票?下图有一个票样。签发本票的一方必须提供收款人的姓名,收款人持本人身份证在任何一家银行都能将本票兑现,这里收款人姓名是签发者为本票兑现设置的“支付条件”,如果身份证姓名与本票收款人不符,本票就不能兑现。
本票
类似的,UTXO也被原来的所有者设置了支付条件,新的所有者想使用时也必须提供满足条件的证据。当然,身份证是不灵了。在数字世界中,“支付条件”以一段被称为“锁定脚本”的程序代码来表示,而“满足条件的证据”也是一段代码,称作“解锁脚本”。以代码而不是直接定死支付条件是为了方便扩展。下图是常见的一种标准,P2PK(Pay to Public Key)。它和本票十分相似,解锁时需要提供收款人的公开身份证明,对于本票而言是身份证,而对于比特币而言就是签名<sig>和公钥<PubK>。
锁定脚本和解锁脚本
好,终于到重点了。OP_RETURN语句便是一种锁定脚本,语法是:
OP_RETURN <DATA>
。只是这把锁无钥匙可开。因此,OP_RETURN锁定的交易无法再作为交易输入,这种特殊交易的唯一目的就是存储一小段数据<DATA>
,最长40字节。你可能会说,40字节能存啥?当然不能把《三体》小说存下,但足够用来存储《三体》手稿的32字节数字摘要,这样,任何人购买到一套《三体》的电子书都可以很方便地验证是否与原著一字不差(以相同算法计算电子书的数字摘要,然后与存储的摘要比较即可
)。
PrimeCoin(质数币)
为了保证区块链的唯一性,只能由一个节点产生新区块,比特币的做法是:让所有节点竞争着去解决使新区块哈希值小于指定目标的数学问题,第一个求出来的便有资格产生新区块。这个数学问题有如此特点:很难解,需要进行大量的计算;同时却十分容易验证答案正确与否,这样,其他节点便可对胜出者给出的答案进行验证,防止其作弊。由于胜出是靠拼算力完成计算工作,因此这种所有节点对产生新区块的人选形成共识的机制,称为“工作量证明(Proof of Work)”。为了在竞赛中胜出,矿工们便不断提升算力,现在挖矿的主力是如下图所示的矿场,耗电量惊人,通常只能建在水电站旁边。
有人就想,耗这么多电就只是为了计算没任何价值的哈希值,不如把算力用在做点有意义的事情上。既然难计算、易验证的数学问题都适合作为工作量的证明,于是出现了一个新币种PrimeCoin(质数币),它采用了与比特币不同的工作量证明算法:寻找新的素数。所谓素数,就是只能被1和自身整除的数,目前已知最大的素数共有1700万位!寻找素数是人类两千年来基础数学研究的一项传统,由此创造了很多新的数学理论和研究方法,请参考Why do People find these primes。于是,挖矿消耗的大量电力总算具有一点实际意义了。
Nxt(未来币)
对于基于工作量证明(PoW,Proof of Work)的共识机制,产生一个新区块所需的计算量越大,恶意攻击共识机制的门槛就越高。比特币通过新产生的区块来发行新币,由于拥有的算力越大,挖到新区块的几率就越高,进而更有可能获得新币奖励,因此比特币矿工会争相升级硬件配置以提升自身算力。在利益的刺激下,比特币网络的总算力水平不断突破记录,网络可靠性随之不断提升。为限制货币总量,新区块的奖励是定期递减的,然而不断购买新硬件导致成本持续攀升,挖矿就变得越来越无利可图,最终矿工将纷纷退出,网络的可靠性转而停滞、甚至下降。为了解决这个问题,新的共识机制被提出,其中包括“基于股权证明(PoS,Proof of Stake)”的机制,Nxt(未来币)便是典型代表(之所以说“典型”,因为Nxt是全新开发的
)。
Nxt的新币发行策略与比特币不同:所有10亿个新币在创世区块便全部产生,从创世账号转给了73位初始合伙人的账号,再通过后续交易分散到其他账号。不像比特币,Nxt新区块创建时没有新币产生,创建新区块的节点靠交易费获得回报。“凭股权,得分红(交易费)”,这便是Nxt的激励机制,投资回报率大概在0.1%左右。由于不需要像比特币一样付出的大量计算硬件投入和电力消耗,回报还是相当可观的。这种策略还有一个有趣的副作用:创世账号的余额为负10亿NXT,不仅无法再向任何账号转账,而且任何转给它的NXT都会永远消失,相当于Nxt网络中存在一个“黑洞”!
基于工作量证明拼的是谁胳膊粗,而基于股权证明比的是谁资本多。Nxt的“股权”指账户的有效余额,即持有超过1440个区块的货币总数。Nxt设定的出块周期是60秒,因此这段时间约等于24小时。设定有效期限制是为了防止“历史攻击(history attack)”,后面将详细解释。产生新区块的节点按照以下规则选出:一个节点账号的撞击点(account hit)落在目标范围内,即account hit < T(T为目标值
),则该节点有权产生下一个区块。一个节点的撞击点按照以下步骤算出:
第一步:以该节点账号的公钥对父区块签名进行签名,得到64字节的签名数据;
第二步:以SHA256算法求取签名的哈希值;
第三步:取哈希值的前8字节作为该节点的撞击点。
目标值T的计算公式如下。其中,Tb称为基础目标值,它的作用是控制出币速度,由过去三个区块的平均创建时长及前一个基础目标值决定,对于所有节点而都一视同仁。S是距离上一个区块创建过去的时间,以秒为单位。而Be是账号的有效余额。
在比特币原理一文中,我们介绍过,散列值的大小是不可预测的,如果尝试去寻找一个使散列值大小小于目标值的数,这件事的难度完全由目标值的大小决定。对于股权Be越大的节点而言,T也越大,因此更有可能满足“acount hit<T”的条件而被选中。而T又是随时间流逝不断增大的,无论如何最终都会有一个节点被挑选出来去创建新区块。所有账号的有效余额都保存在区块链中,任何节点都可以查询,因此新区块应该由哪个账号来创建是透明和确定的。这里解释一下上文提出的问题:为啥股权是有效余额,而不直接是账号余额?假设一个用户有两个账号A和B,同时参与创块者选秀。账号A的余额较大,但账号A计算的account hit更大,不满足“account hit<T"的要求,因此账号A没被选中;账号B计算的account hit比较小,不幸的是,B的余额更小,按理账号B也不会被选中。但是这个用户立刻将账号A中的大部分NXT转到账号B,B便符合要求了,于是用户获得了额外的创币机会。可如果规定持有超过1440区块的NXT才能用于计算目标值,这一招便失效了。这就是为什么“股权”必须是有效余额,而不能是余额了。与比特币一样,Nxt也有所谓“51%”攻击,但并不是掌握51%的算力,而是拥有51%的股权,即数字货币总量的51%。这几乎是不可能的,目前Nxt最大的股东账号也只拥有大概5%的货币。
一方面看,不需要浪费大量硬件和能源是PoS相对PoW的优势,从另一方面看,也是它的劣势:违法代价很低。PoS的可靠性建立在一个假设上,即:拥有绝大多数股份的节点,产生了绝大多数新区块,它们是系统正常运行的最大受益者,因此会反过来自觉维护系统的正常运行。然而,用户为挖矿支付电费和服务器账单掏的是真金白银,NXT却只是一种虚拟资产,并不与现实资产产生任何关联,因此PoS系统的用户甚至会配合攻击者实施攻击。例如,按照规则,当存在分叉时新区块应当链接到累积难度最大的分支(与比特币类似
);然而,为了不因为站错队而损失交易费,创建新区块的节点经常会为所有分支都创建新区块,因为不像比特币,创建一个合法的Nxt区块几乎没有代价。这就使得攻击者只需要取得一次创块机会,选择性地在最符合其利益的分支上增加一个区块,便可以使该分支最长从而成为主链(如下图所示),这就是所谓“nothing-at-stake攻击”。股权没有任何现实担保物,因此什么都不是(nothing)!为了防止这种情况发生,Nxt网络会对同时在多个分支创建新区块的行为进行处罚。可是谁来执行呢?网管吗?这听起来一点也不“去中心化”。相比之下,比特币的共识机制简单粗暴却无疑是最有效的。耗电的问题嘛,等太阳能和核能普及,那就不是事了。
Dash(达世币)
将比特币当货币使用在体验上存在两个问题:1. 隐私性没有保证,容易被追踪;2. 交易的确认时间过长。
先说说隐私性。按理说,使用比特币不需要提供使用者的真实姓名,应该能够匿名才对;况且比特币天生就适合网上交易,不见面,对方连我是不是条狗都不知道,匿名性比真实货币还好。事实却并非如此。一方面,比特币和真实货币不一样,它是“有历史的”。我们知道,比特币的交易单位是“UTXO(未交易的输出)”,为了判断一个输出是否“未交易”,正要花出去的这些比特币,它们在比特币账号之间倒手的过程都被记录下来了。人们经常说”这钱来得不干净”,对于一捆纸币,只能捕风捉影,而对于一堆比特币,简直是铁证如山。更何况,由于比特币账簿(区块链
)是公开的,这些证据对于所有人都昭然若揭。虽然中本聪在论文中建议每次交易使用不同的比特币地址,然而仍不难通过一些线索分析出地址的归属。以下面两个关联的比特币交易为例,交易1中地址1BZS4gVbWyUyfVPme1n2yfyzVEf66sfh5q
转入了0.01BTC,这些比特币随后又和来自其他地址的零钱在交易2中被花出。假设我碰巧是交易2的收款方,我以0.08BTC的价格卖了一把AK47给小明,我收款的地址是37PmM69vFvdZabnwer74KFTSpVvogMkPvd
,我根据这两个交易的信息可以推断出:
- 交易2中地址
1PM6t8MKSPMf82h5V55drqN9TDs1HtJkd1
属于小明,因为0.005BTH是我给他的找零; - 交易2中输入的其他几个地址也属于小明,因为比特币钱包会自动将用户不同地址的UTXO拼凑起来进行支付;
-
交易1中输出的0.01BTH一定是找零,因为输入有0.042BTH,如果是付给其他人的费用就不用拼凑多个UTXO了。进而推断出,交易1的3个地址也属于小明
两个真实的比特币交易
以此类推,通过大数据分析,便可推断出小明的资金往来,他拥有的总比特币数等隐私信息!
再说说交易时间过长的问题。为了防止“重复支出”,一笔比特币交易被记入了区块还不可靠,因为可能会因为分叉攻击而失效,只有在这个区块上再“叠”上5个区块才行,因此一笔交易需要6个区块周期,也就是约60分钟左右才能可靠确认。
“老板,来杯奶茶,比特币支付!”
“好的,待我确认,请稍候一个小时。”
“... ...”
针对比特币的这两个缺陷,Dash提供了称为PrivateSend和InstantSend的新特性,解决方案是两层网络结构。第一层是和比特币网络一样由矿工节点(Mining node
)组成,负责提供和比特币网络一样的记账服务;第二层由控制节点(MasterNode
)组成,提供增强服务,其中就包括PrivateSend和InstantSend。任何节点都可以成为控制节点,就像任何节点都可以挖矿一样,前提是节点缴纳1000DASH的保证金;保证金可随时提取使用,但一旦被使用,节点便会失去控制节点的身份。而作为控制节点提供服务的回报是:当每个新区块产生时,会从所有控制节点中随机选取一个和挖到这个区块的矿工分享奖励(实际上,各占45%,还有10%作为公共基金
)。
下面就来说说控制节点网络是如何解决隐私性和确认延时长问题的。PrivateSend是对CoinJoin机制的改进。CoinJoin的核心思想是将若干不相关的交易合并成一个,从而混淆分析用户身份的线索。以下图为例,假设假设交易1输出的0.5BTC已知属于小明,为了洗白...呃,匿名化这些钱,小明拿出另一个地址的0.3BTC,凑成0.8BTC;然后邀请自己的好友、同样拥有0.8BTC的小东,两人一起构造了一个交易,分别将属于自己的0.8BTC转给自己的另一个账户;由于两个输出金额都是0.8BTC,旁人就无法分出哪个属于小明,哪个属于小东了。这就好比,你有一些被做了记号的银锭,你拿到银匠那融化重铸了一个元宝,记号便失效了。
PrivateSend的改进之处有三。其一是由控制节点来撮合混淆操作:当一个用户需要混淆服务时,便会向一个控制节点发请求;后者向全网广播混淆邀约,直到找到另外两个同样也需要混淆的用户(
每次混淆发生在三个用户之间
);然后再由控制节点来构造混淆交易。这样,陌生人也可以合作了。其二,混淆交易不包含交易费,这些交易费会另起独立的交易批量支付给矿工。第三点改进是Dash钱包会在任何有效交易发生前自动完成混淆操作,即预混淆,这样可以节约实际交易的时间,同时混淆的次数越多,跟踪的难度也越大。Dash钱包会将管理的数字货币转换成固定面值,即0.1DASH、1DASH、10DASH和1000DASH,混淆时更容易,也更隐蔽。下图是一个例子,不同颜色代表不同的用户归属,如此一搅和,还能分清谁是谁的么?PrivateSend混淆服务
这里要注意,PrivateSend服务并不同于电子钱包(eWallet)提供的匿名服务:后者要求你将数字货币转账给服务商,服务商再从其他用户的若干账户将等额的数字货币发回给你,你需要完全信任服务提供商;而在PrivateSend的过程中,数字货币是在你自己的账户之间转账,始终处于你的完全控制之下。PrivateSend真正遵循了去中心化的精神。
Dash的InstantSend特性同样依赖控制节点:一项交易在得到全网大多数节点确认前,由10个控制节点组成的裁决委员会一致通过便可生效。相比比特币网络确认一笔交易需要约一个小时,Dash最快只需要数秒,十分接近刷信用卡。具体过程如下:
- 用户A向用户B支付一定数额的DASH,这笔交易通过特定“锁定交易”消息广播全网;
- 交易抵达组成裁决委员会的控制节点,后者会独立对交易有效性进行检查,如果有效的话,就签名并发出“共识交易”消息;如果无效,例如交易输入已被支付或者交易已经被锁定,则拒绝交易;
- 一个节点收到来自所有裁判节点(
注意“所有”!
)的共识消息后,便可认为交易得到确认,否则就如在比特币网络一样等待交易被成功加入新区块(i.e., failout
)。
那问题来了,判决委员会是如何选出的?怎么保证它们不会被攻击者控制而作弊呢?判决委员会的组成是Dash网络中的“第二共识”(“第一共识”是区块链
),是由确定算法决定的:粗略讲来,是按照控制节点保障金账号地址(masternode_vin
)距离当前区块哈希值的差异大小排序,取最接近的10个组成裁决委员会。如果攻击者试图控制判决委员会,就必须拥有尽可能多的控制节点,由于每个控制节点需要缴纳1000DASH的保证金,在控制节点数已达数千个,而每个DASH价值数百美元时,成本将非常高昂。
Ethereum(以太坊)
区块链通常被视为一个分布式数据库,五花八门的区块链应用定义了各自的数据结构,并且按照某种应用协议去读写数据库从而实现特定的应用,例如数字货币。而以太坊实现的模型则是一台通用的分布式计算机(即EVM:Ethereum Virtual Machine
),其中:
- 区块链相当于硬盘,存储着程序和数据;
- 矿工节点相当于CPU,负责读取数据、执行程序和改写数据;
只不过与云计算不同,这台分布式计算机效率很低,因为计算都必须在所有节点上重复进行,但具有最高的可用性和可靠性,特别适用于对等节点之间直接交互或团队协作的应用,典型代表就是智能合约。目前合约的效力必须由一个权威来保障,譬如法院。举个例子,对于一份购买合同,应该是一方付款后,另一方就立即发货,那如果发货方抵赖不发货怎么办?这时付款方就可以向法院起诉发货方,要求强制执行。而在去中心化的环境下,权威并不存在,这时就可以通过智能合约来完成:货款一到就会自动触发货物发出,根本没有机会抵赖。
与比特币不同,以太坊区块链的结构要复杂多得多得多,其中账号是最主要的数据单元,又分为两类:
- EOA(Externally Owned Account,外持账号):即用户账号,主要存储的信息是账户余额,只能由持有对应私钥的用户修改,例如,将一定数量的数字货币(
以太坊的数字货币称为ether
)转给其他用户; - 合约账号(Contract Account):即以代码描述的合约片段。为啥也叫“账号”呢?因为它和用户账号一样,也有地址。地址有啥用?地址用来对合约进行寻址,以便执行(
调用
)它。那为啥说是“片段”呢?因为一个合约账号可以发消息激活其他合约账号一起共同执行合约,就像一个子程序可以调用其他子程序一样,既然不是一份完整的合约,那就叫“合约片段”咯(为了描述方便,除特殊说明,下面不再区分“合约”和“合约片段”
)。除了代码,合约账号还有一个“键-值”数据库(将32位关键字映射到32位的数据
),用于存储合约相关数据,例如,分红合约中的股权人名单。
合约的用途主要包括以下四类:
- 充当数据仓库,供系统以外或者其他合约片段读取所需数据。例如可以定义一个合约片段,专门用于存储上面举例的股权人名单,这样,任何方需要这份名单都可以激活这个合约片段来获取;
- 对EOA施加较复杂的外部访问权限策略。这样的合约称为“转发合约”,通常逻辑是:判断设定的条件是否满足,只有满足才将一个消息转发到其目的地。通过转发合约可以实现多签名(
multisig
),好比三把钥匙一起才能打开保险库的锁; - 程序库,例如,SHA256算法实现;
- 就是我们通常理解的合约了,例如,保险合同,对冲基金协议等。
构成合约的代码也好,数据也好,都是静止不变的,要想让它们“动”起来,就需要一个初始推动力,这就是交易。一个交易由用户以某个EOA的身份发起,如果交易的接收者是另一个EOA,便实现了一次转账;而如果交易的对象是一个合约账号,那么就会触发合约执行。交易的数据结构中主要包括以下元素:
- 接收者
- 发送者的签名
- VALUE:从发送者转移到接收者的ether
- 数据字节组:发给一个合约账号的交易相当于函数调用,那么交易中的数据字节组自然相当于是输入参数了(
程序猿们,很亲切吧^_^
) - STARTGAS(
稍后解释
) - GASPRICE(
这个也是
)
另外,前面也提到,一个合约是可以引用另一个合约的,引用的方法就是向它发消息,相当于调用子函数。消息的数据结构与交易很相似,包括了发送者、接收者、VALUE、数据字节组、STARTGAS等内容。
接下来,我们来看一个智能合约的例子:Alice和Bob各出100GavCoin赌下周一旧金山的气温是否会超过35°C,如果超过了,Alice赢,否则Bob赢。基于以太坊实现这个赌约的架构如下图所示,其中涉及的账号涵义如下:
- Bob:Bob掌握的EOA;
- Alice 1/Alice 2/ Alice 3:Alice掌握的3个EOA;
- Forwarding contract:转发合约账号,只有提供了合适的签名,消息才能被转发。Bob和Alice都非常谨慎:Bob选择能应对未来量子计算威胁的Lamport签名算法,而Alice选择多签名;
- Lamport sig verifier:验证Lamport签名的合约账号;
- SHA256:以SHA256算法计算哈希值的合约账号,将被Lamport sig verifier调用;
- Bet:代表赌约的合约账号。它存储的合同代码会定期获取天气信息,根据Bob和Alice的约定进行检查,并自动将GavCoin转账给Bob或Alice;
- GavCoin:GavCoin是一个简单的数字货币实现,实际就是一个“键-值”数据库,每个用户账号都是一个关键字,对应的值就是账户余额。GavCoin就是提供数据仓库访问功能的合约账号,转账通过将一个关键字索引的值减少、将另一个关键字索引的值相应增大来实现;
- Weather feed:提供天气信息的合约账号(
例如,也可以是一个简单数据库,由外部应用定期更新
)。
到了下一周,旧金山气温没有超过35°C,Bob赢了。这时Bob就可以请求履行赌约,拿到赢得的钱。调用路径如图中箭头所示,每个箭头代表一个消息或交易。
天气赌约
很强大是不是?那现在有一个问题:这些合约账号是怎么来的?合约账号可以通过一个特殊的交易产生。这个交易没有接收者,而数据字节数组中保存的就是合约代码。当矿工收到此交易时,便会产生一个合约账号并将其加入到区块链中。
程序猿读者可能会很好奇:合约代码到底长什么样子呢?EVM采用的是一种堆栈式字节码语言,类似比特币脚本语言、汇编和Lisp的混合。下面是以这种语言编写的一段代码,它的作用是:将一个32位“键-值”对插入合约账号的内部数据库,插入前还会检查该关键字是否已存在。
PUSH1 0 CALLDATALOAD SLOAD NOT PUSH1 9 JUMPI STOP JUMPDEST PUSH1 32 CALLDATALOAD PUSH1 0 CALLDATALOAD SSTORE
先不忙晕倒!就像我们通常不会直接以汇编语言写程序一样,合约代码也可以通过高级语言来编写(例如,Solidity
),然后编译成字节码。
最后来说说以太坊的挖矿。和比特币一样,以太坊目前也是通过PoW来实现分布共识。同时,一开始就介绍过,挖矿节点还负责运行合约代码。那问题来了,如果恶意用户创建一段包含无限循环的合约代码,矿工节点岂不是会被玩死?这种情况不会发生,因为执行代码是收费的。矿工挖到新区块的奖励包括两部分:
- 5.0 Ether的固定奖励;
- 加入新区块的所有交易支付的燃料费(Gas)
上面的“燃料费”就是触发合约的用户为矿工执行合约代码支付的费用(嗯,燃料...看样子,以太坊这台计算机是内燃机驱动的^_^
)。前面介绍交易的数据结构时,有两个参数我卖了个关子,现在揭秘:
- STARTGAS:本交易完成最多消耗的燃料单位。一个交易会激活一个合约账号,后者则可能通过消息激活更多的合约账号,这一连锁调用涉及的所有合约代码都会逐个指令来收费,不同指令消耗的汽油量可能不同;
- GASPRICE:每单位燃料的价格,以wei表示。以太坊也定义了它的数字货币,称为以太币,Ether(
简写为ETH
)和wei都是常用的货币单位,1Ether = 10^18 wei。这里请注意不要混淆了以太币的价格和燃料的价格,这两者是独立的,但都由市场决定。如果交易设定的单位燃料价格过低,矿工节点可能会拒绝处理交易,交易也就失效了。
矿工收到交易后,首先要做的是将STARTGAS*GASPRICE
wei从交易发送者的账户扣除。交易的发送者需要设置足够大的STARTGAS值,否则当燃料耗尽而合约代码没有全部执行完,执行结果会回滚,而扣除的燃料费不会退回。从另一方面而言,如果合约执行完后仍剩余N个单位的燃料,那么N*GASPRICE
wei的以太币将退回发送者的账户。
3. 区块链应用前景预测
今年科技届最热的词一定是区块链,没有“之一”。事实上,这种热度已远远超出技术领域,辐射炙烤着所有人。无数炒币暴富的案例,错过风口的焦虑,都让人们急迫地想在这波区块链的大潮中做点什么。已经有这么多脑袋在想同一个问题,我不敢说还能造出什么新意,这里的“预测”是我对已被识别出、甚至已有原型的区块链应用进行的一番前景分析,希望能对读者在洪流中不至迷失方向有所帮助。
区块链无疑是颠覆性的技术创新,按照《创新者窘境》(缩写版戳这里)一书的观点,颠覆技术的特点是带来了与以往不同的价值主张,因此区块链如果被用来解决一个已有解决方案的老问题,不一定更合适,甚至不一定有效;而如果有产品仍然宣称这么做了,那多半是炒概念。我认为真正靠谱的区块链应用应该紧紧围绕“去中心化”,看哪些应用场景能获得显著收益。这样的应用场景,我认为主要有如下三个:数字货币、金融基础设施和智能合约。
数字货币将长期作为黑市交易的媒介
首先澄清一下,这里说的“数字货币”是以比特币为代表、没有国家强权背书的“非法币”(国字号的数字货币将在金融基础设施中介绍
)。这一论断包括以下几个方面:
- 数字货币没有成为一个国家正式通货的可能性
- 黑市是数字货币最后唯一的流通市场
- 数字货币的稳定汇率由全球地下经济体的GDP决定
从技术上而言,比特币完全具备成为货币的能力,然而任何国家,好吧,任何正常的国家都不会允许比特币作为流通货币,这是因为它的“去中心化”。去中心化意味着任何人,包括国家意志都不能阻止比特币的流通,更不能改变比特币的发行量。而一个国家所有干预经济的手段最终都是通过改变货币流量量起作用的。
通货总量必须与经济活动的总规模相适应,否则就会产生通货膨胀或者通货紧缩。当然,通货膨胀不一定是坏事,国家有时会刻意保持甚至制造一定程度的通货膨胀以刺激经济增长,所谓“适度宽松的货币政策”就是这个意思。假设比特币等去中心化货币成为流通货币,这部分经济将彻底失控。更何况,比特币流通不受国界限制,国家的汇率管控、关税等对外经济政策也将失效,届时国将不国。
看过我比特币原理一文的读者可能会问:你不是赞成比特币的吗?还说比特币如同金本位一样,并不一定阻碍经济繁荣。这并非我前后矛盾,而是要分清理想与现实。比特币给出了一个乌托邦理想,确实很美好,但无法在资本主义世界出现。资本主义的本质是增长,经济保持增速是资本的唯一目的,因为资本只有从增长中才能获得回报。对于自给自足的桃花源居民,比特币很适合,固定的通货刚好让他们交易所需又避免了以物易物的麻烦,衣食无忧、其乐融融。如果把桃花源打包上市,引入外部投资,开发原生态乡村旅游,建设现代化新农村,桃花源便走上了资本主义道路,GDP年年创造新高,这时固定数量的比特币就玩不转了。
人们将比特币等称为“数字货币”,但它们目前还不是,因为它们没有发挥货币应有的功能。货币的定义是“交易的一般等价物“,是交易发生的媒介。人们以产品或服务换回货币,早晚还是要用这些货币去换取自己需要的产品或服务,如果不想换或不能换,货币就不能称之为“货币”。目前比特币交易火爆,其本质和邮票热、郁金香热、古董热并无差异,比特币本身是被作为一种商品。当泡沫破灭,特别是各国政府严控数字货币与法币的交易时,热潮就会逐渐退却。那问题来了,到那时候比特币会消失么?我认为不会。即使完全不能兑换成法币,比特币仍可充当黑市交易的媒介,而且是地下世界最适合的通货。例如,阿富汗战乱区同时也是毒品生产的重灾区,军阀以毒养军,那么通过卖出毒品换得比特币,然后以比特币从地下武器市场购买军火,这就形成了比特币流通的一个闭环。由于数字货币不受国界约束,全球黑市依托数字货币便可融合成一个庞大的隐形地下经济体。
这个地下经济体总的经济规模不妨也用GDP来衡量,假设为1万亿美元,同时假设比特币是它的流通货币,那么粗略可认为,2100W BTC = 1W亿美元,那么1BTC的价格就是47,619美元。嗯,这样看来,比特币还有很大升值空间,币粉们,你们请继续!
区块链将成为国家金融基础设施的技术基础
各国政府不断加强对比特币等数字货币的监管力度,与此同时,又在积极研究本国的数字货币。然而,不要将两者混淆起来。有政府背书的数字货币本质上是国家金融基础设施的关键技术创新,主要目的是取代纸币,因此是法币的数字形式,而不是一种全新的货币。它的目的是提高交易的透明度(防洗钱、资本流出控制)、减小货币发行成本,并且使跨境结算更便捷。
区块链技术由于其去中心化的架构特点,是实现这一目的的最佳选择:建立一个可靠的、中心化的第三方机构需要庞大的服务器成本和维护成本等,并且一旦受到攻击可能影响整个系统的安危;而去中心化方式在省却了这些成本的同时,其系统的每个节点均存储有一套完整的数据拷贝,即便多个节点受到攻击也很难影响整体系统的安全。
建立在数字技术的金融体系一旦建立,便有可能改变现有国际金融秩序,而率先建成这一金融系统的国家,将成为事实上新的金融立法者。这就不难理解,金砖四国及一些欧盟国家为何会不约而同宣布正在研发本国的数字货币,委内瑞拉甚至宣布本国“石油币”将于今年2月底开始流通。
有读者可能会问,支付宝、微信支付与国家的数字货币有啥区别吗,咱们国家不已经是世界第一了?支付宝、微信支付都是电子支付系统,在业务层面,实现的是便捷转账而和货币是不是数字的没关系;在技术上,目前的电子支付系统都是中心化架构,也和区块链的区中心化架构截然不同。数字货币的使用过程天生就是电子转账,因此随着数字货币的普及,支付宝、微信支付等也将退出历史舞台。
智能合约将是区块链应用最活跃的领域
国字号的数字货币,民间资本基本无缘参与,比特币等就成了最大的资本赌局,造就了本世纪第二大的资产泡沫(第一大是房地产
)和用之不竭的旁氏骗局。按照经典炒作曲线的阶段划分,当泡沫破灭、跌入低谷才会后将缓慢进入理性的应用阶段,我认为这一阶段,智能合约将是区块链应用领域的主角。
由于个人不足信,因此在很多领域中介都必不可少,例如,资产交易中介、证券中介。而区块链就是为消除信任的必要而生:基于区块链的智能合约可使得人与人之间直接交易,由算法来防欺诈。为何消除中介如此重要呢?因为商业巨头的垄断地位通常来自其作为信任中心的存在。例如,如果可靠的P2P通信可能,还需要微信作甚?而数字合约可以保证“一手交货,一手交钱”,那为什么还需要交易平台?区块链去中心化给了屌丝逆袭巨头的机会。可以想见,资本在冷静下来后将蜂拥进入此领域。智能合约空间广阔,大有可为!
网友评论