ArcBlock 一週年
(一)
這是我開過的最艱難的一次長途了。從家到 springfield(中轉站)570 英里,我早上 8:30 出發,下午 4:50 到。進入 Oregon 之後,天就跟漏了似的,一路時斷時續的暴雨,有的山路已經形成洪流,車駛過的時候,輪胎被水流帶著,方向盤都有些不聽使喚。好在一路車少,有驚無險。 - 程式君 04/28/2018
歲月如梭,光陰似箭,灣區的生活似乎就在昨天,而我成為華州的居民已經一年零一天了。這一年過得跌宕起伏,就像我只身驅車前往華州的旅途一樣,前半程傲睨自若,勢如破竹;後半程戰戰兢兢,如履薄冰。好在,最後一切安然。
三月份回灣區參加 Code BEAM 大會,重回 Tubi,見了很多老朋友。Tubi 一片欣欣向榮,全方位不斷重新整理自己的記錄 —— 17 年底搬入的新辦公室,僅僅一年多時光,便已已經捉襟見肘,整層樓明顯超載;而北京辦公室那邊,更是不得了,趁著國內網際網路公司一片哀嚎從高大上的 Wework 紛紛撤離之際又擴充了大片工位。我跟 haofei 調侃,Tubi 趕緊上市,我好在 Bellevue 買套房,結束租房生涯。回到家跟老婆聊種種往事,老婆打趣,從 Tubi 離開,你後悔過麼?我笑笑,不後悔啊,雖然整個加密貨幣市場一地雞毛,但是我們離一年前的初心,已經無比接近了。
是的,無比接近。
去年這個時候,我躊躇滿志地寫下了《歡迎來到區塊鏈的世界》,其中談到了 ArcBlock 看到的機會:
第一個方向,是圍繞著數字資產的持有者和創造者的產品和應用 —— 已有的大餅如何切。有以下機遇:
1. cryptocurrency 交易所。這目前是屬於幣安們的舞臺,很快也會迎來納斯達克等傳統交易所。也許未來 DEX(去中心化交易所)會成為重要甚至主要的力量。
2. 數字投行。誰來做區塊鏈時代的高盛?摩根斯坦利?
3. 數字投資。如果把 token 看做資產,那麼,誰是區塊鏈時代的富達,橋水?誰來幫使用者管理數字資產,打造合適的 cryptocurrency portfolio,讓其保值和增值?
幣安每天 $10B 的體量,已經可以和中小國家的證券交易所匹敵,足以說明問題。而若能做成區塊鏈時代的橋水和高盛,想想都能流口水。
第二個方向,用區塊鏈取代現有的解決方案。有幾個機遇:
1. 去中心化金融科技。Fintech 領域也許是目前除了交易所外最成熟的應用領域,如 Ripple。
2. 反欺詐。在電商,p2p lending,crowdfunding 等方向有很多機會。
3. 資料保全。在智慧財產權,證書,身份(identity),供應鏈,以及使用者的積分體系等等都有產生高質量使用者的機會。
4. 智慧合約(smart contract)和分散式應用(Dapps)。這是吵得最凶,最濫,關注點最高的領域,但目前除了以太貓(crypto kitty)外,似乎沒有太多實質的應用。這個領域需要足夠好的思考和最夠完善的基礎設施才更容易出成果。
5. 小額支付/點對點支付。這是一個很重要的方向,目前以我有限的想象力還很難看出有什麼需要用區塊鏈取代微信支付的小額支付場景。
第三個方向,打造更好的,技術更領先,更快,更容易構建應用的公鏈,以取代「緩慢」,「buggy」的以太坊。這個方向市場巨大,成則雄霸天下;卻也是異常擁擠的紅海,幾乎 90% 的區塊鏈公司都把自己定位於一個更好的公鏈,最終的結果是一將功成萬骨枯。
第四個方向,是圍繞打破區塊鏈只是為技術極客設計的樊籬,讓這個技術有更大的普惠性 —— 如何擴充套件這個大餅的邊界。這是 ArcBlock 看中的方向。它有以下機遇:
1. 打造能夠給菜場大媽使用的區塊鏈產品(首當其衝的必然是錢包應用),讓「舊時王謝堂前燕,飛入尋常百姓家」。
2. 打造產品為第一個和第二個方向的公司服務,成為淘金者身邊的李維斯。
3. 打造產品以及構建生態,橋接 real world 和 blockchain world —— 讓 app 開發者可以簡單嵌入一個 SDK 或者呼叫一些 API,使用 blockchain 的各種能力 —— app 開發者甚至不需要知道 blockchain tech 的存在。就像 app 開發者基本上都會使用 HTTP 來承載網路上的資料,有哪個 app developer 需要讀 RFC2616 / RFC7540 呢?blockchain tech 終將需要發展到這一步。
這裡面的 2 和 3,就是 ArcBlock 的機會。ArcBlock 選擇這個方向,是完完全全從使用者的角度出發,因為歷史一再證明,要想一門有使用場景的技術進入主流市場,簡單易理解體驗好是起碼的要求,而對使用者的簡單則是對開發者的難題,有時甚至是難以逾越的天塹。ArcBlock 的壁壘將是對 2 和 3 的使用者的需求的深刻理解,我們內部的服務提供能力,我們的 node 快速部署的能力,我們的 Blocklet 的 auto scaling 的能力,以及我們在追求正確方向和正確道路上打造出來的創新和學習能力 —— 這些都是冰山下面的部分,是風停了之後我們依舊能夠前行的能力。
一年過去了,同行者大多已經不知所蹤,而我們依舊在這條路上深耕 —— 更重要的是,我們一步步,從技術上,從產品上,從思想上對鏈,對應用,對使用者體驗有了自己獨特的洞見,並且將其付諸於產品之上。我們追求的不是大一統的公鏈,而是萬鏈齊發的應用鏈,也就是我們提出的鏈網的概念,因而,我們費盡心思賦予每個應用構建自己的鏈的能力。我逢人便說,我們的 forge framework 之於區塊鏈,就像 Ruby on Rails 之於 Web 2.0,它終將開啟潘多拉魔盒,讓區塊鏈成為每個開發者觸手可及的,去打造合適的應用的工具,而非幣圈先行者們用於圈錢的禁臠。
(二)
這條路並非坦途。一年前,所謂的 dapp(decentralized app)大多就是一些簡單的 smart contract,而這些 dapp 的極致代表是 cryptokitties,Fomo 3D 這樣出奇制勝的遊戲。真正和大家工作生活息息相關的應用,一個也沒有。對於 dapp,我們心心念唸的是,如何提供基礎平臺用區塊鏈重塑 taobao,ebay,eventbrite 這樣的交易相關的應用(區塊鏈的強項),甚至 wordpress,discuz! 這樣內容相關的應用。
這在當時是一個沒有人可以(用技術 / 產品)回答的問題。以太坊及其繼任者之所以無法回答這個問題,是因為 1) 公鏈把全網所有的資料糅雜在一起,不但拖累應用的表現,還嚴重影響應用的開發測試和部署。2) 以太坊的基礎設施及 smart contract 的能力,還不足以高效完成足夠複雜的業務邏輯。3) 開發者體驗太差。
當然,飯要一口口吃,路要一步步走。比特幣和以太坊作為最成功的兩個區塊鏈專案,值得我們深度學習和研究。我們並未像同期絕大多數專案那樣,fork 一個以太坊,改頭換面,宣稱是自己的專案;相反,我們走了一條艱難的路:通過打造一個跨鏈的中間層,我們深入比特幣和以太坊的奇妙的狀態世界,理解他們的執行機理,為我們自己的框架做技術儲備;同時,我們運營多條鏈的節點,學習他們的運作方式,從開發者的角度和節點使用者的角度,找出其中的痛點和產品上可以精進的地方。
在這個過程中,我們做了大量的準備工作,有些甚至看上去和鏈毫無關係。比如我們做的一個程式碼自動化的專案 Goldorin,可以把 yaml 格式的 schema 描述轉換成 GraphQL / Database 相關的程式碼(見我之前的文章: 如何在幾十個 Repo 中游刃有餘? ),它的誕生僅僅是為了提高我們 API 的開發效率,卻不料後來被應用到了我們的 ABT Chain Node 上,為 protobuf 介面自動生成 GraphQL 介面立下了汗馬功勞。
再比如說,我們在邊做邊學的過程中,每週有一到數次的團隊內部和外部的分享,一年下來,不知不覺已經累積了一百多次分享的素材(單單是對外的分享我們就做了二十多期,見: https://www. arcblock.io/zh/learning ),內容涵蓋之廣,外人可能很難想象:

這就好像柳傳志所說的:撒一層土,夯實,再撒一層。
當我們的技術儲備和對區塊鏈的理解到達一定層次後,我們也並未立即擼起袖子開幹。我們在 tendermint 上做了一個 ex_abci,提供 elixir 的 ABCI 的支援。tendermint 作為一個優秀的 p2p / PBFT consensus layer,定義了一套完善的介面,把區塊鏈的實現和 p2p / consensus 分隔開,這和我們分層處理,遮蔽細節的思路不謀而合。在 ex_abci 的基礎上,我們做了一個非常原始的區塊鏈開發框架 —— 使用以太坊的 MPT(Merkle Patricia Tree)的思路管理鏈上的 state,使用 protobuf 定義 state 和 transaction,用 gRPC 提供對外的 RPC 服務。框架本身只提供最基礎的 transaction 支援,比如 transfer,而更加豐富的 transaction 的支援交由 dapp 來完成。因為這個框架的目標是幫助開發者 鍛造 他們的應用 鏈 ,因而取名 Forge:

就著新鮮出爐的 Forge,我們嘗試著構建了一個 PoC app —— 一個去中心化的 wordpress。我管它叫 Final Chapter。使用者可以在 Final Chapter 裡建立文章,endorse(頂)或者 repel(踩)一篇文章。正如你所猜到的那樣,create_post / update_post / endorse / repel 都是自定義的 transaction。Final Chapter 前端使用 phoenix,後端使用 Forge,儘管僅僅是一個很原始的 PoC,但它驗證了 Forge 的方向的正確性,以及其具備的無窮潛力。我們還意外地發現,巧妙使用 MPT,可以實現區塊鏈世界的時間旅行 —— 一個使用者可以在 Final Chapter 的時間軸上自由地翱翔 —— 就像《星際穿越》中,Cooper 在黑洞中進入的四維空間。。
於是,使用者發表的文章有了自己的生命線,時間軸上經歷的任何一次 update_post,都是一個不可磨滅的版本,同理,每個使用者也有他們自己的,一步步迭代的版本,甚至,整個應用的全網資料,在每個 tick(一個區塊產生的時間)裡,都有獨一無二的版本(想了解更多請參閱:在程式中時間旅行)。

Forge 的 PoC 看上去是可行的,接下來我們便為其提供更加豐富的功能 ——
為了支援豐富的錢包型別,我們開發了 Mcrypto,開發者,甚至使用者可以決定她在鏈上使用什麼型別的錢包 —— 用 Secp256k1 還是 ED25519 算法制作金鑰?用 sha2,sha3 還是以太坊使用的 keccak f1600 來做雜湊?
為了讓錢包的金鑰可以像賬戶的密碼一樣為了安全起見不斷更新,我們提供了 account migration 的能力。這樣,當你的私鑰有潛在洩露的風險時,你可以使用 account migration 把舊的金鑰遷移到新的金鑰 —— 你的朋友們依舊可以給你的舊的錢包地址傳送交易,而相關的交易會自動轉向新的地址。
為了讓節點的升級可以像普通軟體的升級一樣無縫,我們提供了 auto upgrade node 的能力。當 upgrade 在網路中達成共識後,所有節點會在指定的高度一起停下來,自動更新為新的版本,並重新啟動。
為了提供足夠豐富的,開發者開箱可用的 transaction,我們開發了豐富的 transaction protocol,從賬戶的管理到資產的建立和管理,從鏈上的治理到跨鏈的支援,從簡單的交易形態到非常複雜的交易方式。舉個例子,如果你要開發一個應用來銷售電影票,每張電影票都是一個 none fungible 的 token(在 Forge 裡,我們稱之為 asset),影院的管理者可以從銷售電影票的過程中獲得 token,而購票者付出了 token,得到了 ticket asset。之後這個 ticket asset 作為一個憑證可以在影院入口消費。這整個流程如果用區塊鏈解決,非常具有挑戰性(想想你怎麼在以太坊上搞?)。類似的場景有很多,比如簽證,比如門禁,都是一個機構可以發行 asset,使用者可以通過付費或者一些前置條件來獲取這些 asset,並且在合適的場合消費。對此,我們提供了類似自動售貨機一樣的 asset factory 來解決這一類問題。
不僅如此,我們的 transaction protocol 還可以 hot upgrade —— 也就是說,節點不必重啟,一個新版本的 protocol 就可以部署至全網。
最後,我們力圖讓這一切都儘可能簡單。我們提供了 forge-cli,兩三條命令就可以讓開發者執行自己的節點;我們提供了多種語言的 SDK,儘可能掃清開發者開發的障礙;我們的 ABT Chain Node,提供鏈上資料的視覺化服務,對於節點的大部分操作都可以在 web 介面中完成;為了降低開發者大規模部署鏈上節點以及運營成本,我們開發了 forge-deploy 指令碼,可以用兩條命令在數分鐘左右(取決於節點的數量)在 AWS 全球大部分 region 部署大量 spot instance;對於小白使用者,我們還提供了 ABT Chain Node Desktop,可以直接安裝使用。
所有這些,都絕非易事,我們需要在和時間賽跑的同時,解決一個又一個沒有先例,解空間完全未知的問題,就像出塞三千里追擊匈奴的竇將軍,或者歷經十七載西行求法的陳玄奘,全靠一個堅定的目標和初心,以及百折不撓的堅韌,才在迷途中殺出一條路。
(三)
記得在某一期的《朗讀者》裡,董卿說過:我們成為什麼樣的人,可能不在於我們的能力,而在於我們的選擇。選擇是一次又一次自我重塑的過程,讓我們不斷成長,不斷完善 —— 如果說人生是一次不斷選擇的旅程,那麼千帆閱盡,最終留下的,是一片屬於自己的獨一無二的風景。
我發現自己似乎在面對選擇時,總是做出旁人看來最艱險的決定。
2010 年底,我在 Juniper 順風順水,本可在 engineering manager 的位置上一點點向上爬到養老,不用再面對諸如「35 歲的程式設計師還能不能寫得動程式碼」的問題,我卻選擇了搭上移動網際網路的班車去創業 —— 更確切的說,我把自己的人生賽道從通訊行業切換到了網際網路行業。
兩年後創業失敗,面對很多新的機會,我沒有立刻進入到下一個專案,而是選擇重回 Juniper,一方面為赴美工作鋪墊,另一方面也是停下來反思和覆盤。儘管看上去我又重新回到了通訊行業,但我清楚地知道,我的未來還在於網際網路,我的下一次創業也必然在網際網路而非通訊領域。於是在 Juniper 略顯悠閒(和創業相比)的工作生活中,我沒有選擇養生,而是寫書來複盤創業的過程,總結經驗教訓;寫公眾號來擴大自己的個人品牌的影響力,從而某種程度上彌補我之前創業的一個痛點:影響力不夠,進而很難招到合適的人。
2014 年底到了美國之後,面對更加悠閒的美國大公司養老式工作,我每天不到 7 點左右就奔赴公司,七小時工作之餘(別笑,我覺得大部分老美每天能正兒八經工作五小時就不錯了),我硬生生擠出來差不多另外七個小時去探索各種領域;沒過多久,我便主動要求調到舊金山的 web security 的團隊,儘管從彙報級別上來看,我從彙報給 Sr. Director,變成彙報給 Sr. Manager,很不符合常理,但 web security 貼近我中意的網際網路。
2015 年底,Tubi 的機會出現,儘管降薪(不算 option,因為那時 Tubi 的 option 還幾乎沒有任何價值),並且放棄大量的 RSU,在掃清身份的障礙後,我還是義無反顧地加入了 Tubi。網際網路,創業公司,已經驗證過的商業模式,糟糕的工程能力,使得當時的 Tubi 對我來說,是天賜良緣(見我的文章:《緣分天註定》),是桑德伯格口中的 rocket ship —— 我一直很青睞桑德伯格的那句話:If you’re offered a seat on a rocket ship, don’t ask what seat. Just get on。
去年,同樣的劇本發生 —— 經歷了一番對未來趨勢的詳細研究,我深深地感到自己未來的賽道在於區塊鏈,或者說,區塊鏈背後的 web 3.0。於是,便有了我的 ArcBlock 一週年,以及這篇文章。
我不知道在另一個平行宇宙的自己,在每次面臨人生的十字路口時,都放棄那條「少有人走的路」,而選擇理性的 SWOT 分析下來更「正確」的路,將會是什麼樣。但肯定不會像我這樣,以三十七歲高齡(在程式設計師的世界裡,這已經算得上耆耆之年了),每天還花費五六個小時伏案疾書,寫就千八百行程式碼。
當然不可避免的,也會少了很多很多可以給兒孫們講睡前故事的素材。
打個廣告,我們的北京團隊在招資深前端工程師,要求具備良好的 react 開發經驗,對區塊鏈技術感興趣,能夠快速學習。有意者請將簡歷發至:career at http:// arcblock.io ,標題註明你的名字,想申請的職位,以及來自程式人生(e.g. subject: 李雷 - 前端工程師 - 程式人生)。我們會優先處理。
另外,北京時間下週三中午 1:00 我會詳細介紹和演示用 Forge SDK 建立區塊鏈應用,歡迎大家參與,報名請戳: