以太坊智慧合約程式設計(1):概述

買賣虛擬貨幣

譯註:原文首發於consensys開發者部落格,原作者為eva以及consensys的開發團隊。如果您想要獲取更多及時資訊,可以訪問consensys首頁點選左下角newsletter訂閱郵件。本文的翻譯獲得了consensys創始人lubin先生的授權。

有些人說以太坊太難對付,於是我們(譯註:指consensys, 下同)寫了這篇文章來幫助大家學習如何利用以太坊編寫智慧合約和應用。這裡所用到的工具,錢包,應用程式以及整個生態系統仍處於開發狀態,它們將來會更好用!

第一部分概述,討論了關鍵概念,幾大以太坊客戶端以及寫智慧合約用到的程式語言。
第二部分討論了總體的工作流程,以及目前流行的一些dapp框架和工具。
第三部分主要關於程式設計,我們將學習如何使用truffle來為智慧合約編寫測試和構建dapp。

第一部分. 概述

如果你對諸如比特幣以及其工作原理等密碼學貨幣的概念完全陌生,我們建議你先看看andreas antonopoulos所著的bitcoin book的頭幾章,然後讀一下以太坊白皮書。(譯註:以太坊白皮書中文版請看 http://ethfans.org/posts/ethereum-whitepaper)

如果你覺得白皮書中的章節太晦澀,也可以直接動手來熟悉以太坊。在以太坊上做開發並不要求你理解所有那些“密碼經濟電腦科學”(crypto economic computer science),而白皮書的大部分是關於以太坊想對於比特幣架構上的改進。

新手教程

ethereum.org提供了官方的新手入門教程,以及一個代幣合約和眾籌合約的教程。合約語言solidity也有官方文件。學習智慧合約的另一份不錯的資料(也是我的入門資料)是dappsforbeginners,不過現在可能有些過時了。

這篇文章的目的是成為上述資料的補充,同時介紹一些基本的開發者工具,使入門以太坊,智慧合約以及構建dapps(decentralized apps, 分散式應用)更加容易。我會試圖按照我自己(依然是新手)的理解來解釋工作流程中的每一步是在做什麼,我也得到了consensys酷酷的開發者們的許多幫助。

基本概念

瞭解這些名詞是一個不錯的開始:

公鑰加密系統。 alice有一把公鑰和一把私鑰。她可以用她的私鑰建立數字簽名,而bob可以用她的公鑰來驗證這個簽名確實是用alice的私鑰建立的,也就是說,確實是alice的簽名。當你建立一個以太坊或者比特幣錢包的時候,那長長的0xdf...5f地址實質上是個公鑰,對應的私鑰儲存某處。類似於coinbase的線上錢包可以幫你保管私鑰,你也可以自己保管。如果你弄丟了存有資金的錢包的私鑰,你就等於永遠失去了那筆資金,因此你最好對私鑰做好備份。過來人表示:透過踩坑學習到這一點是非常痛苦的...

點對點網路。 就像bittorrent, 以太坊分散式網路中的所有節點都地位平等,沒有中心伺服器。(未來會有半中心化的混合型服務出現為使用者和開發者提供方便,這我們後面會講到。)

區塊鏈。 區塊鏈就像是一個全球唯一的帳簿,或者說是資料庫,記錄了網路中所有交易歷史。

以太坊虛擬機器(evm)。 它讓你能在以太坊上寫出更強大的程式(比特幣上也可以寫指令碼程式)。它有時也用來指以太坊區塊鏈,負責執行智慧合約以及一切。

節點。 你可以執行節點,透過它讀寫以太坊區塊鏈,也即使用以太坊虛擬機器。完全節點需要下載整個區塊鏈。輕節點仍在開發中。

礦工。 挖礦,也就是處理區塊鏈上的區塊的節點。這個網頁可以看到當前活躍的一部分以太坊礦工:stats.ethdev.com。

工作量證明。 礦工們總是在競爭解決一些數學問題。第一個解出答案的(算出下一個區塊)將獲得以太幣作為獎勵。然後所有節點都更新自己的區塊鏈。所有想要算出下一個區塊的礦工都有與其他節點保持同步,並且維護同一個區塊鏈的動力,因此整個網路總是能達成共識。(注意:以太坊正計劃轉向沒有礦工的權益證明系統(pos),不過那不在本文討論範圍之內。)

以太幣。 縮寫eth。一種你可以購買和使用的真正的數字貨幣。這裡是可以交易以太幣的其中一家交易所的走勢圖。在寫這篇文章的時候,1個以太幣價值65美分。

gas. (汽油) 在以太坊上執行程式以及儲存資料都要消耗一定量的以太幣,gas是以太幣轉換而成。這個機制用來保證效率。

dapp. 以太坊社羣把基於智慧合約的應用稱為去中心化的應用程式(decentralized app)。dapp的目標是(或者應該是)讓你的智慧合約有一個友好的介面,外加一些額外的東西,例如ipfs(可以儲存和讀取資料的去中心化網路,不是出自以太坊團隊但有類似的精神)。dapp可以跑在一臺能與以太坊節點互動的中心化伺服器上,也可以跑在任意一個以太坊平等節點上。(花一分鐘思考一下:與一般的網站不同,dapp不能跑在普通的伺服器上。他們需要提交交易到區塊鏈並且從區塊鏈而不是中心化資料庫讀取重要資料。相對於典型的使用者登入系統,使用者有可能被表示成一個錢包地址而其它使用者資料儲存在本地。許多事情都會與目前的web應用有不同架構。)

如果想看看從另一個新手視角怎麼理解這些概念,請讀just enough bitcoin for ethereum。

以太坊客戶端,智慧合約語言

編寫和部署智慧合約並不要求你執行一個以太坊節點。下面有列出基於瀏覽器的ide和api。但如果是為了學習的話,還是應該執行一個以太坊節點,以便理解其中的基本元件,何況執行節點也不難。

執行以太坊節點可用的客戶端

以太坊有許多不同語言的客戶端實現(即多種與以太坊網路互動的方法),包括c++, go, python, java, haskell等等。為什麼需要這麼多實現?不同的實現能滿足不同的需求(例如haskell實現的目標是可以被數學驗證),能使以太坊更加安全,能豐富整個生態系統。

在寫作本文時,我使用的是go語言實現的客戶端geth (go-ethereum),其他時候還會使用一個叫testrpc的工具, 它使用了python客戶端pyethereum。後面的例子會用到這些工具。

注: 我曾經使用過c++的客戶端,現在仍然在用其中的ethminer元件和geth配合挖礦,因此這些不同的元件是可以一起工作的。
關於挖礦:挖礦很有趣,有點像精心照料你的室內盆栽,同時又是一種瞭解整個系統的方法。雖然以太幣現在的價格可能連電費都補不齊,但以後誰知道呢。人們正在創造許多酷酷的dapp, 可能會讓以太坊越來越流行。

互動式控制檯。 客戶端執行起來後,你就可以同步區塊鏈,建立錢包,收發以太幣了。使用geth的一種方式是透過javascript控制檯(javascript console, 類似你在chrome瀏覽器裡面按f12出來的那個,只不過是跑在終端裡)。此外還可以使用類似curl的命令透過json rpc來與客戶端互動。本文的目標是帶大家過一邊dapp開發的流程,因此這塊就不多說了。但是我們應該記住這些命令列工具是除錯,配置節點,以及使用錢包的利器。

在測試網路執行節點。 如果你在正式網路執行geth客戶端,下載整個區塊鏈與網路同步會需要相當時間。(你可以透過比較節點日誌中列印的最後一個塊號和stats.ethdev.com上列出的最新塊來確定是否已經同步。) 另一個問題是在正式網路上跑智慧合約需要實實在在的以太幣。在測試網路上執行節點的話就沒有這個問題。此時也不需要同步整個區塊鏈,建立一個自己的私有鏈就勾了,對於開發來說更省時間。

testrpc. 用geth可以建立一個測試網路,另一種更快的建立測試網路的方法是使用testrpc. testrpc可以在啟動時幫你建立一堆存有資金的測試賬戶。它的執行速度也更快因此更適合開發和測試。你可以從testrpc起步,然後隨著合約慢慢成型,轉移到geth建立的測試網路上 - 啟動方法很簡單,只需要指定一個networkid:geth --networkid "12345"。這裡是testrpc的程式碼倉庫,下文我們還會再講到它。

接下來我們來談談可用的程式語言,之後就可以開始真正的程式設計了。

寫智慧合約用的程式語言

用solidity就好。 要寫智慧合約有好幾種語言可選:有點類似javascript的solidity, 副檔名是.sol. 和python接近的serpent, 檔名以.se結尾。還有類似lisp的lll。serpent曾經流行過一段時間,但現在最流行而且最穩定的要算是solidity了,因此用solidity就好。聽說你喜歡python? 用solidity。

solc編譯器。 用solidity寫好智慧合約之後,需要用solc來編譯。它是一個來自c++客戶端實現的元件(又一次,不同的實現產生互補),這裡是安裝方法。如果你不想安裝solc也可以直接使用基於瀏覽器的編譯器,例如solidity real-time compiler或者cosmo。後文有關程式設計的部分會假設你安裝了solc。

注意:以太坊正處於積極的開發中,有時候新的版本之間會有不同步。確認你使用的是最新的dev版本,或者穩定版本。如果遇到問題可以去以太坊專案對應的gitter聊天室或者forums.ethereum.org上問問其他人在用什麼版本。

web3.js api. 當solidity合約編譯好並且傳送到網路上之後,你可以使用以太坊的web3.js javascript api來呼叫它,構建能與之互動的web應用。

以上就是在以太坊上編寫智慧合約和構建與之互動的dapp所需的基本工具。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;