一、什么是賬戶余額模型?
如果UTXO是掰不開的硬幣,那賬戶余額模型就是撕不掉的存折,存折上印著你在區塊鏈上擁有的一切。
我們用以太坊舉例,下文特別感謝Draveness的智力支持,很難找出比他《UTXO與賬戶模型》更簡明的文章,不愧是寫了三年博客的編程大神。
以太坊外觀復雜,但掀開蓋子往里一看,其實只有三塊鋼板:賬戶、交易和區塊。

圖1 以太坊賬戶模型
賬戶就是存折,記著你的余額;
交易就是匯款單,你負責填單簽名輸密碼;
區塊就是銀行,柜員把交易錄入系統,相當于礦工把交易刻進區塊,都能改變賬戶信息。
以上就是賬戶余額模式的基本邏輯,這與UTXO模型有很大不同。
UTXO模型中,每筆輸入都是前一筆交易的未花費輸出,環環相扣,不會出現重復交易。
而賬戶模型則與之不同,每次賬戶變動就像涂一層修正液,只能看到最新結果,一旦重復記賬就會次次都錯,那如何防范這種隱患?
以太坊的做法是:在賬戶里增加一個標簽,交易后標簽數字+1,每次交易前檢查標簽有無重號,一旦重號則取消交易。
這個標簽的名字叫nonce,看起來和比特幣工作量證明中找的隨機數(nonce)一樣,但以太坊中nonce意指“序號”,有了它你就能安心付款。
可是,賬戶中最重要的不是序號,而是余額。交易的本質是改變雙方余額。礦工一旦挖到交易信息,就會記入區塊,從而改寫賬戶信息。

圖2 以太坊賬戶基本結構
序號和余額構成賬戶最基本的結構,以太坊賬戶的特別之處在于:它有兩種類型。
二、以太坊賬戶類型和內部結構
一種是外部賬戶,它和比特幣地址的功能相同,靠私鑰撬動余額,如圖2。
另一種是合約賬戶。每次收到消息時,賬戶中的合約代碼會智能地跑起來,這就是以太坊“智能合約”的來歷。
合約賬戶的基本元素就如下圖:

圖3 以太坊合約賬戶基本元素
序號能防重復交易,余額表示當前權益,合約代碼能夠響應特定請求,比如你可以教你男友設置:今年生日發你1個以太幣,以后每年增加1倍。
另外,每個賬戶還配備存儲空間,內部存有合約代碼和其他數據的哈希值,技術上能防篡改。這就構成合約賬戶的基本框架。
以太坊最著名的合約賬戶當屬ERC20,ERC指以太坊認證請求(Ethereum Request for Comment),20是賬戶編號。ERC20是發行Token的合約,轉Token給別人只需調用該合約。
所以你看,發行Token很簡單,只需在以太坊上開個賬戶,這和你去銀行柜面開張卡沒什么區別,YouTube上有很多手把手教程,練順手之后,發一種幣就像發一圈牌一樣簡單。
在以太坊上開好戶,然后用這個賬戶發出的Token換別人手上的BTC或ETH,這是大多數ICO在技術上的實現方式。
ERC20最大的功能是讓所有人都能當億萬富翁,很簡單:發行1萬億個以你名字命名的幣,讓你朋友花1塊錢買一個玩玩,這樣你的幣就有了1元的市場價格,于是一轉身你就身價萬億。
在技術上,這都得歸功于以太坊的賬戶模式。
此模式中,序號、余額、合約代碼和存儲信息等,都稱為狀態。狀態相當于忽明忽暗、五顏六色的燈,整個以太坊就是蓋在我們頭頂上的不停閃爍的霓彩。這也是為什么人們把以太坊稱為“狀態機”的原因。

賬戶模型能高效切換狀態,這為區塊鏈應用撒出更多可能,比如每個賬戶都既能用智能合約向其他賬戶發消息,又能設定收到消息后如何應對,于是只要把規則寫進代碼,不需要運營人員,僅憑代碼就能干活。
效率方面,賬戶模型完勝UTXO,比如當我們計算某個地址的余額時,賬戶模式會秒出結果,而UTXO模型會遍歷網絡中全部的區塊,再加總得出余額,但UTXO并不在乎慢,因為它堅守的是寫入的數據不可更改。
安全方面,UTXO模型被公認領先,所以很多人認為UTXO和私鑰的搭配更能保護財富,因為私鑰代表對財富的擁有權,而UTXO又能確保賬戶系統安全,這種觀點看起來很正確,但卻隱藏著一個前提:使用者已經過培訓,而且使用和保管私鑰過程中能處處小心。
保管難度還在其次,最重要的是,私鑰一旦丟失或泄露,用戶將失去所有財富,此時UTXO的穩固就會沒有意義。
這是加密數字貨幣普及過程中遇到的首要難題,包括比特幣在內的很多數字貨幣至今束手無策,但這里有一種新的解題思路,它來自6月即將上線、同樣使用賬戶模型的EOS。
三、讓財富真正屬于普通用戶
EOS設計者認為:私鑰對普通用戶并不代表真正的所有權,因為稍不留心就會丟失財富,這不符合價值保有的本意。
設計系統時,應該分清對財富的控制能力和擁有權利之間的區別。真正的財富應該像本領,即使暫時被別人拿到,但依然屬于你。
所以,EOS沒有把人的身份綁定在光禿禿的私鑰上,而是標注于一個賬戶,這個賬戶對應一個密碼。
這種設計有什么好處呢?
最大的好處是普通用戶的財富得到極大的保障,一旦密碼泄露造成財產損失,普通用戶可以多一項選擇:在預設時間內取消交易。
比如,你可以預設轉賬1萬個幣以上需要1小時后才確認,所以一旦有人通過密碼盜取你的財富,你會收到通知,1小時內,你能通過預設的社交關系人取消交易。
社交關系人可以是默認的身份開設機構,也可以是你指定的親戚朋友。于是,普通用戶突然具備一種能力:在預設時間內,簽署消息指明一筆交易無效,而這種能力的存在本身也能壓制惡意。
這就是EOS給我們守護財富的新思路。
當然,回到財富保有的初衷,EOS的賬戶模式保障了普通用戶擁有財富的權利,但也意味著放棄了專業用戶對財富絕對控制的能力,這部分用戶必然會選擇留在UTXO+私鑰的世界。
之所以兩種模型會分家,根源還是來自我們熟悉的不可能三角:分布式、安全和高效三者不可兼得,最多取二。

圖4 不可能三角和兩種模型的站位
既然都選分布式,就只能在安全和高效間權衡。比特幣要做的是電子現金系統,安全穩健至上,于是抱著UTXO站在圖4左邊;而以太坊和EOS都希望做成智能合約平臺,追求高效靈活,所以靠右選擇賬戶模型。
賬戶模型的確高效,但必然付出安穩的代價,可這又有什么辦法呢,為了開墾區塊鏈的新邊疆,總得先付出些什么。
結語
UTXO是區塊鏈的原生模型,比特幣含著它出生,但區塊鏈要長大,就不能沒有賬戶余額模型,因為它可以更快翻出更多姿勢。
總之,每個區塊鏈系統最終都面臨兩種模式間的權衡,但目的只有一個:用更低的代價博取更高的收益。
接受王峰采訪前,李笑來說過很多遍:“很少有東西能夠跑贏比特幣,最好的姿勢是持幣睡覺。”但他最后卻賣了幣。
當向王峰解釋為什么會賣幣時,他說:
開交易所時,銀行賬戶總被凍結,因為要保證擠兌時儲備充足,不得不在熊市賣出一些,等幾個月之后凍結,再也買不回那么多。
是他當初沒有選擇抱幣安逸不得已的結果,即使明知如此,卻依然選擇下地干活,因為他的原則是不斷成長,成長才能給他歡樂。
那些賣掉的比特幣是他的尋歡成本,而正是這些成本讓他在成長的跑道上一路狂奔。
一個人之所以值錢,不是他賬戶余額有錢,而是因為他的原則值錢。
如果這類創業者最終能墾出一片天地,一定不是因為姿勢對或者運氣好,真正的原因是:在所有人都看不見光的夜里,依然肯付代價。