在講具體實例之前我們先送出第二個彩蛋。第二個彩蛋是關于智能合約的,什么是智能合約,智能合約對于我們這些做技術或編碼的人而言有什么潛在的價值。
先來看什么是合約。舉個例子,假如我要租房,需要跟房東簽一個租房協議,這個協議通常會包括:預訂一年或多久的時間,租金是每月付或每季度付,押金多少等等,這個租房合約其他人肯定用不了,如果要用必須重新簽訂。那這就是合約的第一個屬性:唯一性,它是給某些特定的人,也就是合約的關系方所定制的。合約還有一個特性:它有時間限制。比如我和房東簽訂的合約時間是一年,那么一年之后就會自動失效。
智能合約和現實中的合約非常像,它也有這些特性。首先智能合約是給某一些參與者定制的,一般來講是兩方以上;其次智能合約通常也應該具備時間屬性。智能合約相當于是一種自動的合約執行的機制。
那么智能合約對于程序員來講有什么價值呢?了解了智能合約唯一性和時間性的特性之后,相信大家都能想到,假如要跟公司或者客戶簽訂協議,不可能用同一份協議去給一千個客戶服務。所以如果你掌握了智能合約開發能力就相當于掌握了在未來的智能合約時代或者說區塊鏈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代幣的特性就像現實生活里的收藏品、汽車或房子等,是一種不可替代的資產,這種資產的轉移是帶有價值變動的。