在讲具体实例之前我们先送出第二个彩蛋。第二个彩蛋是关于智能合约的,什么是智能合约,智能合约对于我们这些做技术或编码的人而言有什么潜在的价值。
先来看什么是合约。举个例子,假如我要租房,需要跟房东签一个租房协议,这个协议通常会包括:预订一年或多久的时间,租金是每月付或每季度付,押金多少等等,这个租房合约其他人肯定用不了,如果要用必须重新签订。那这就是合约的第一个属性:唯一性,它是给某些特定的人,也就是合约的关系方所定制的。合约还有一个特性:它有时间限制。比如我和房东签订的合约时间是一年,那么一年之后就会自动失效。
智能合约和现实中的合约非常像,它也有这些特性。首先智能合约是给某一些参与者定制的,一般来讲是两方以上;其次智能合约通常也应该具备时间属性。智能合约相当于是一种自动的合约执行的机制。
那么智能合约对于程序员来讲有什么价值呢?了解了智能合约唯一性和时间性的特性之后,相信大家都能想到,假如要跟公司或者客户签订协议,不可能用同一份协议去给一千个客户服务。所以如果你掌握了智能合约开发能力就相当于掌握了在未来的智能合约时代或者说区块链3.0时代的一个律师资格。
因为每个合约都要人起草、审核,这都是律师的工作,而作为程序员的你会智能合约编码,就相当于拥有了智能合约平台的律师资格证,可以在智能合约平台里帮助用户或企业起草合约。这就不会像现在这样,服务或系统做完成交之后程序员可能就没用了,智能合约领域不存在这样的情况,因为合约是一次性的,执行完成之后还要重新起草、重新签订。
从用例看智能合约

上图列的这4类合约从应用角度来讲是有明显区别的。
第一类是对赌(Betting)合约和作物保险(Crop Insurance)。这都是双方参与的合约。对赌是什么意思呢?就是两个人来赌一件事,比如赌明天的气温高于多少或低于多少,或者直接就赌扔两个骰子的结果是大于7还是小于7。这种合约在以太坊上非常容易实现,只要20多行代码;它要通过使用一些数据服务,比如生成随机数、查询天气等链外数据等。作物保险其实也是一样,作物保险相当于是一个农民和保险公司之间签的智能合约,比如农民花10美元向保险公司投保,保险的内容是今年如果有冰雹,农作物受到损失的话,保险公司需要赔付给农民100美元。关于今年有没有冰雹,其实也可以通过第三方的气象台的链外数据服务来得到,从而可以自动进行理赔。
第二类是投票(Voting)合约和拍卖(Auction)合约。这都是多人参与的公共行为。投票和选举是类似的,可以在一个智能合约里规定,现在有几个方案或候选人,大家可以通过合约来进行投票或选举,因为以太坊里所有人都是用地址标识的,所以能判断这个人是否已经投过票。拍卖的话,先把要拍卖的东西在创建合约的时候把它转给合约,大家都可以看到要拍卖的是什么,然后出价。出价可以是两种方式:一种是明确表示我出多少钱,这个钱数直接写到交易里面,因为区块链上所有交易都是透明的,大家都可以看到。另一种是暗拍的方式,比如我把拍卖的金额通过一种算法进行变换(比如进行哈希)传给合约,这样从交易数据上不能直接看出各人的出价。当拍卖时限到达的时候自动完成拍卖。
第三类是付款(Purchase)合约和微支付通道(Micro Payment Channel)。简单来说就是支付和金融,比如转账、金融方面的一些付款合约,和淘宝中的发货、收获确认的流程非常像,买家卖家之间建立一个合约,买家先把钱打到合约里,卖家在线上通过第三方发起一个资产转移,或线下发起一个邮寄的动作,把货发出来,买家收到货后调用合约上的某个函数去更改状态,相当于确认收货,卖家就可以从合约里把钱拿走,这个过程和淘宝其实没有什么区别。
微支付通道从技术上来讲属于多重签名合约。比如我经常去跟同一个煎饼摊的老板买煎饼,我们两个人达成一致:我每天从他这里拿走一个煎饼,周期性(限定时间)地结账,这就是签订一个微支付通道。这个解决的就是交易费的问题,大家都知道比特币或以太坊每笔交易都会产生交易费,如果交易金额很小,那这种交易成本就会相对变得非常高,而像这样定期结算的话就只需要支付一笔交易费。
ERC20和ERC721
最后再看两个非常有名的代币的标准,ERC20和ERC721。ERC,简单来讲就是以太坊社区的参与者可以给以太坊提出改进意见,以太坊核心开发团队会针对这个意见来做一些注释,最后实现到协议上或客户端里(进入EIP)。
ERC20注明的就是代币标准,其意义在于它是一个通用接口,定义了一组函数和事件,只要符合这个接口的实现都可以作为标准代币,由交易所或第三方服务来处理。
ERC721是针对ERC20作了一些改造,ERC721是指一种不可替代物(non-fungible)token,是一种可以追踪的、不可再分的代币。ERC721代币的特性就像现实生活里的收藏品、汽车或房子等,是一种不可替代的资产,这种资产的转移是带有价值变动的。