以太坊智能合約編程概述有哪些?以太坊智能合約編程基本概念是什么?

原文首發于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),不過那不在本文討論范圍之內 。)
以太幣 ??s寫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就好 。要寫智能合約有好幾種語言可?。河械憷嗨艼avascript的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所需的基本工具 。

相關經驗推薦