1. 程式人生 > >以太坊開發入門

以太坊開發入門

智能合約 合約 以太坊 以太坊開發 ethereum truffle solidity 區塊鏈 區塊鏈開發 blockchain

以太坊開發入門

目標讀者:

  • 專業的程序員;

  • 想深入了解以太坊/區塊鏈及其生態的讀者;

如果你已經有一定的以太坊技術基礎,只想研究一些落地項目,可以直接跳到後面的項目模塊。

預備知識:

  • 了解區塊鏈的概念以及比特幣的運行機制。

  • 有基本的編程知識將是極大的加分項,了解系統/架構/數學等知識。

不知你是否和我一樣,一開始被各種數學問題所迷惑,如拜占庭問題,雙花問題等。我的建議是一開始先拋開這些問題,對區塊鏈的原理有一個基本的全局的了解,然後再回過頭來思考這些問題。 事實上,如果我們只想基於以太坊開發智能合約應用,也不必完全理解區塊鏈的架構。

1 以太坊

以太坊和比特幣一樣,底層框架都是區塊鏈協議,區塊鏈本質上是一個應用了密碼學技術的分布式數據庫系統。在看了前面提及的阿裏雲整理的科普文章之後,為了能進一步了解以太坊,建議看一下以太坊白皮書

2 智能合約

智能合約是一段運行在以太坊區塊鏈系統之上的一段代碼,合約根據事先制訂的規則來自動轉移數字資產。例如,一個人可能有一個存儲合約,形式為“A可以每天最多提現X個幣,B每天最多Y個,A和B一起可以隨意提取,A可以停掉B的提現權 ”。

3 以太坊賬戶

以太坊中有兩種賬戶:外部賬戶(EOA)和合約賬戶

外部賬戶具有以下特性:

1.有一個以太幣余額;
2.可以發送交易(以太幣轉賬或者激活合約代碼);
3.通過私鑰控制;
4.沒有相關聯的代碼。

合約賬戶擁有以下特性:

1.有一個以太幣余額;
2.有相關聯的代碼;
3.代碼執行是通過交易或者其他合約發送的call來激活;
4.當被執行時 -- 運行在隨機復雜度 (圖靈完備性)-- 只能操作其擁有的特定儲存,例如可以擁有其永久state -- 可以call其他合約.

所有以太坊區塊鏈上的行動都是由各賬戶發送的交易激活。每次一個合約賬戶收到一個交易,交易自帶的參數都會成為代碼的輸入值運行。合約代碼會被以太坊虛擬機(EVM)在每一個參與網絡的節點上運行,以作為它們新區塊的驗證。

4 什麽是Gas

以太坊智能合約由區塊鏈網絡中的每個完整節點重復執行,使得合約執行的消耗變得昂貴,所以這也促使大家將能在鏈下進行的運算都不放到區塊鏈上進行。對於每個被執行的命令都會有一個特定的消耗,用單位gas計數。每個合約可以利用的命令都會有一個相應的gas值。gas值的存在避免智能合約進入死循環,你不能編寫永不結束的程序,因為你用盡了gas,計算將被節點拒絕。

在以太坊中,每筆交易都被要求包括一個gas limit和一個交易願為單位gas支付的費用。礦工可以有選擇的打包這些交易並收取這些費用。在現實中,由於礦工會優先選擇打包費用高的交易,所以用戶所選擇支付的交易費用多少會影響到該交易被打包所需等待的時長。

如果該交易由於計算,包括原始消息和一些觸發的其他消息,需要使用的gas數量小於或等於所設置的gas limit,那麽這個交易會被處理。

如果gas總消耗超過gas limit,那麽所有的操作都會被復原,但交易是成立的並且交易費任會被礦工收取。區塊鏈會顯示這筆交易完成嘗試,但因為沒有提供足夠的gas導致所有的合約命令都被復原(out-of-gas)。

所有交易裏沒有被使用的超量gas都會以以太幣的形式打回給交易發起者。因為gas消耗一般只是一個大致估算,所以許多用戶會超額支付gas來保證他們的交易會被接受。

5 去中心化應用DApp

DApp是一種“服務端”運行在區塊鏈網絡上的應用,類似於app運行在Android/iOS等設備上,DApp運行在以太坊網絡上。以太坊在GitHub下有一個代碼倉庫dapp-bin(https://github.com/ethereum/dapp-bin),裏面有一些文檔和示例。使用前,你需要看看文件最近的狀態,因為他們將很可能已經被淘汰。

6 DApp客戶端

目前有四個可運行的,分別由C+ +,Go,Python和Java實現的幾乎全兼容以太坊協議的客戶端。C + +和Go實現的客戶端目前完全兼容。

1. go-ethereum

go-ethereum客戶端通常被稱為geth,是目前用戶最多,使用最廣泛的客戶端。通過Geth客戶端與以太坊網絡進行連接和交互可以實現賬戶管理、合約部署、挖礦等眾多有趣且實用的功能(https://ethereum.github.io/go-ethereum)。

2. pyethapp

Pyethapp是以python為基礎的客戶端,實現以太坊加密經濟狀態機。python實現旨在提供一個更容易刪節和擴展的代碼庫。

Pyethapp利用兩個以太坊核心組成部分來實現客戶端:

  • pyethereum ——核心庫,以區塊鏈、以太坊模擬機和挖礦為特征;

  • pydevp2p ——點對點網絡庫,以節點發現和運輸多碼復用和加密連接為特征。

Github: https://github.com/ethereum/pyethapp
維基百科: https://github.com/ethereum/pyethapp/wiki/Getting-Started
Gitter聊天: https://gitter.im/ethereum/pyethapp

3. Parity

Parity 聲稱是世界上最快速最輕便的客戶端。它用Rust語言寫成,可靠性、性能和代碼清晰度都有所增強。Parity由Ethcore開發。Ethcore由以太坊基金會的幾個會員創建。

網站: https://ethcore.io/parity.html
Github: https://github.com/ethcore/parity
Gitter聊天: https://gitter.im/ethcore/parity

7 DApp瀏覽器

一個DApp瀏覽器,正如它字面所表達的,用來讓DApp客戶端(常常使用JS與以太坊的智能合約進行交互)的使用更加容易。

DApp瀏覽器的主要目的是:

提供到一個以太坊節點的連接(或者連接到一個本地節點或者遠程節點),和一個方便的切換不同節點(甚至是不同的網絡)。

提供一個帳戶(或者一個錢包)來方便用戶與DApp交互。

1. Mist

Mist https://github.com/ethereum/mist DApp瀏覽器。一個漂亮的界面來與以太坊節點交互,與智能合約發、收交易。是以太坊官方的.

2. Status

Status https://status.im/ DApp瀏覽器。是一個手機上可以使用的

3. MetaMask

MetaMask https://metamask.io/ Google瀏覽器擴展,把Chrome變成了一個DApp瀏覽器。它的核心特性是註入以太坊提供的js客戶端庫web3,到每一個界面,來讓DApp連接到MetaMask提供的以太坊節點服務。不過這個Chrome擴展,可以允許你管理你的錢包,以及連接到不同的以太坊網絡(包括本地的開發網絡)

4. Parity

Parity是一個以太坊客戶端(也是一個全節點的實現),集成到了Web瀏覽器,並使之成為一個DApp瀏覽器。

8 以太坊代幣

現在你應該知道我們可以通過寫智能合約,並將狀態存到區塊鏈上了?那如果,在狀態這塊,我們存的是一個Map類型,鍵是地址,值是整數。然後我們將這些整數值叫做余額,誰的余額呢?它就是我們要說的代幣(代幣的數據結構就是這樣簡單,存的就是某個用戶當前的余額)。

是的,所有你剛才聽到的代幣,只是一些數據,存儲在一個哈希表裏,通過api或者所謂的協議,來進行增刪改查。

這是一個簡單的基本合約(https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/BasicToken.sol)。

你可以看看ethereum的創建一個眾籌合約的官方教程https://www.ethereum.org/crowdsaleCrowdsale與另一個合約MyToken交互,和前面的基本合約類似,並沒有什麽神奇的地方。你將會發現它僅僅是一個合約。

人們使用代幣來做各種各樣的事情,阻攔大家如何使用的只有想像力。代幣常常用來激勵用戶與某個協議進行交互,或者證明對某個資產的所有權,投票權等等。

以太坊的創始人Vitalik最近有一個關於代幣發售模型,也是一篇不錯的文章https://vitalik.ca/general/2017/06/09/sales.html。

9 與智能合約進行交互

你與智能合約的交互(也稱做調用函數和讀取狀態)通過連接到某個以太坊節點,並執行操作碼。當前有各種各樣的以太坊客戶端,可以方便進行開發。Geth和parity都提供了控制臺或瀏覽器的方式來更好的與智能合約交互。

如果你想要一個程序的庫用來與智能合約交互的接口,也有這樣的客戶端實現。對於JS語言,可以使用web3.js。以於go語言,可以使用在go-ethereum中的abigen的程序,提供了go包,用來與智能合約交互。

如果只是用來測試和開發,可以使用Ganache來運行一個本地節點(這個節點壓短區塊時間等,可以方便打整的開發與測試)。

當你部署了一個智能合約,你實際進行的操作是向地址0x0發送了一個交易,使用當前合約內容作為參數,一個以太坊交易詳解https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f。

10 Truffle和Embark

一旦你開始寫智能合約,你會重復做大量的操作,比如編譯源碼為字節碼和abi,部署到網絡,測試然後部署合約等等。你也許希望更關註於你想要實現的東西。

Truffle和Embark框架,標準化和自動化了這些瑣碎的工作。它們提供了一個好的開發,部署,以及更為重要的,測試智能合約的體驗。

你可以通過官方文檔來開啟使用Truffle的旅程。

也可以參考:以太坊開發DApp入門實戰教程,適合區塊鏈新手。
如果是老手可以參考,以太坊實戰電商教程。

Embark(https://github.com/embark-framework/embark)提供了類似的,幫助開發者組織工程的稍有些不同的工具。

當你一開始接觸智能合約這塊時,應該盡量不要使用框架。直到你明白了使用框架能帶來的價值時,才應該開始使用,正如你不應該通過rails new來學習HTML語言一樣。

11 ETHPM

分享是關心,所以ETHPM是一個去中心化的智能合約包管理資源庫https://www.ethpm.com/registry
ETHPM,你可以關聯或連接到某個著名的合約或庫,減少代碼重復,盡可能理想的為未來的開發提供好的基礎。使用這裏的這個規範https://github.com/ethereum/EIPs/issues/190 Truffle和Embark均可與之集成,並創造一個愉快的開發體驗。詳細的說明了相關的信息以及背景。

12 以太坊網絡

Mainnet-以太坊主網,通常是所有客戶端的默認網絡。

Ropsten - 以太坊使用工作量證明的主測試網絡。這個網絡,因為低的計算量,容易遭到DDOS攻擊,分片,或者其它問題。垃圾郵件攻擊後被暫時放棄,最近才恢復使用。

鏈接:https://github.com/ethereum/ropsten

Kovan -parity客戶端組成的測試網絡,使用授權證明來提升對垃圾郵件攻擊的抗擾度,並且持續4秒的阻塞時間。

鏈接:https://github.com/kovan-testnet/proposal

Rinkeby-geth客戶端組成的測試網絡,使用集團共識,盡管計算量低,但是對惡意行為者更有彈性。

鏈接:https://www.rinkeby.io/

你可以自己搭建你自己的測試網絡,也許使用kubernetes

https://github.com/MaximilianMeister/kuberneteth

或者

docker-compose
https://capgemini.github.io/blockchain/ethereum-docker-compose

但也許你將很快就可以不需要花什麽時間。

13 智能合約編程語言

Solidity

Solidity是第一批的描述智能合約的語言。當前是最流行的語言,因此也有最多的例子,文檔,和教程。你應該學習這個,除非你有要學習其它的理由。

你可以使用基於瀏覽器的Remix IDE來進行快速驗證。

下面是一個Solidity的合約:

pragma solidity ^0.4.11;

contract BasicToken {
    mapping(address => uint256) balances; function transfer(address _to, uint256 _value) returns () {
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
    } function balanceOf(address _owner) constant returns (uint256 balance) { return balances[_owner];
    }
}

LLL

LLL是一門Lisp風格的底層編程語言,就像語言名稱看到的這樣。雖然以太坊官方並沒有將它作為主要需要支持的語言,但它仍舊持續進行著更新,且與solidity在同一個資源庫。

這是一個使用LLL語言寫的一個ERC20代幣的合約。

鏈接:https://github.com/benjaminion/LLL_erc20/blob/1c659e890e2b30408555b9467a8dfd8988211b3b/erc20.lll

如果你正在學習,也許不是那麽的容易習慣LLL語言的寫法。

Serpent

Serpent是一個類Python的高級語言,最終也會被編譯為EVM字節碼。它主要被Augur團隊使用。

但最近Zeppelin Solution團隊發現其編譯器有一個嚴重的bug。

鏈接:https://blog.zeppelin.solutions/serpent-compiler-audit-3095d1257929。

在這個問題被修復之前都不建議繼續使用。

如果你對Augur如何解決這些漏洞感興趣,你可以閱讀Zeppelin Solution的這篇文章。

鏈接:https://blog.zeppelin.solutions/augur-rep-token-critical-vulnerability-disclosure-3d8bdffd79d2

Serpent的合約看起來如下:

1\.  `def register(key, value):` 2\.  `# Key not yet claimed` 3\.  `if not self.storage[key]:` 4\.  `self.storage[key]  = value` 5\.  `return(1)` 6\.  `else:` 7\.  `return(0) # Key already claimed` 9\.  `def ask(key):` 10\.  `return(self.storage[key])`

14 智能合約的安全

一旦一個智能合約部署到了以太坊的網絡上,它將是永不可變的,且將永久存在。如果你寫了一個bug,你將不能下架這個有問題的版本,你只能在後續的版本中修復。

由於許多工程師開發的Ethereum和其他智能合同平臺來自於Web開發,所以這個概念實在是太新,而且是瘋狂的。

ConsenSys有一個非常棒的資源叫智能合約的最佳實踐,你應該深入的理解一下。

鏈接:https://github.com/ConsenSys/smart-contract-best-practices

一個Parity的錢包被黑的解釋

https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7

在你部署你的智能合約的時候,由於你管理的是真正的資金,你應該先開一個賞金計劃https://blog.zeppelin.solutions/setting-up-a-bug-bounty-smart-contract-with-openzeppelin-a0e56434ad0e,並盡量保證它完整的測試過。

15 Whisper

Whisper是一個集成進以太坊的消息系統。它允許DApp發布小量的信息來進行非實時的消息通信。

https://github.com/ethereum/go-ethereum/wiki/Whisper-Overview

它使用shh協議。盡管它已經有段時間沒有更新了,這是一個使用Whisper協議實現一個聊天客戶端的例子。

鏈接:https://github.com/ethereum/meteor-dapp-whisper-chat-client。

16 去中心自動化組織

這是一個組織(就像,一群人),其中,使用代碼來保證最終的強制執行,而不是使用傳統的法律文件。這群人使用智能合約來做常見組織做的所有的事情,比如在某件事上進行投票,比如決定是否對什麽進行投資等等。

副作用是決策,管理,以及對什麽進行投資的結果將會不可改變的存儲在區塊鏈上。

之前slock.it創建了標準的DAO框架來說明這個理念。這裏https://github.com/slockit/DAO/DAO 有概念的總覽,以及如何使用框架來實現一個自己的DAO(這個項目由於bug被黑客攻擊了)

17 Aragon

Aragon https://aragon.one/ 也正在應對挑戰,設計一個根據智能合約邏輯運作的公司,重點是創建一個可以接受投資,處理會計,支付雇員,分配股權,正如我們現在知道的完成每天的公司的業務。他們也實現了漂亮的DApp客戶端來讓他們的協議使用起來更為簡單。

查看這裏Aragon核心合約https://github.com/aragon/aragon-core/tree/master/contracts來更多的理解它是如何做的。

18 存儲

IPFS&FileCoin

IPFS(星際文件系統)是一個協議,用來分發文件。你可以認為它是一個基於bittorrent和git這樣概念的一個文件系統,文件可以定位,且是不可變的。IPFS以IPLD數據模型存儲信息,它非常有趣,提供了一些特別的特性,你可以通過下面的說明了解一些。

可以參考用區塊鏈、IPFS、Node.js和MongoDB來構建的電商平臺的以太坊教程:

這是一個新的協議,它有一個http的網關和文件系統適配器,這讓你可以通過http,掛載整個互聯網文件系統到你本地的盤/ipfs。IPFS還提供了一個尋址服務IPNS(星際命名空間),它允許可變的狀態(需要註意的是在IPFS裏的所有東西都是不可變的)。你甚至可以使用DNS TXT記錄來定位到你的IPNS客戶端,允許你生成用戶友好的鏈接來指向到對應的數據。

FileCoin是Protocol Lab為創建一個去中心化的基於IPFS的存儲市場的努力結果,也就是向整個網絡提供存儲資源的激勵層。FileCoin的共識協議沒有使用浪費資源的工作量證明,而是使用了Proff of Replication和Proof of SpaceTime來保證每片數據被復制某個特定的拷貝數量且存儲某個特定的時間。

你應該讀一下IPFS的白皮書,FileCoin的白皮書,以及IPLD的規範。

相關鏈接

IPFS:https://github.com/ipfs/ipfs/blob/master/papers/ipfs-cap2pfs/ipfs-p2p-file-system.pdf
FileCoin:https://filecoin.io/filecoin.pdf
IPLD:https://github.com/ipld/specs/tree/master/ipld

由於當前FileCoin還沒有上線,你可以使用當前的IPFS存儲網絡來運行html/css/js,並把它作為一個類似orbit-db的數據庫。

Swarm

Swarm是一個去中心化的存儲網絡,集成於以太坊生態系統,作為第一陣營的項目,看看這裏關於IPFS與這個項目的比較和優劣。但本質上,基本上是一樣的,除了它們有不同的哲學,並在底層使用稍微不同的協議。

鏈接:https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM

19 項目

Augur

Augur是一個去中心化的預測市場,讓大家對於某個現實世界的事件進行對賭。一方面,用戶在某個具體可以發生的事件上投註,一旦結果成真,它們贏得的代幣有真正的價值。為了實現這個,你需要實現一個去中心化的先知協議,來輸入現實世界中的信息,它使用REP協議代幣來進行經濟激勵。

Augur白皮書:http://www.augur.link/augur.pdf;

第一時間獲得Augur的最新進展,可以關註其Medium賬號:
https://medium.com/@AugurProject;
你還可以看看Augur項目的合約代碼:https://github.com/AugurProject/augur-core;
以及了解下Augur Master Plan:https://medium.com/@AugurProject/augur-master-plan-42dda65a3e3d

Gnosis

Gnosis與Augur有類似的理念,也是一個去中心化的預測市場。

這是項目的白皮書:https://gnosis.pm/resources/default/pdf/gnosis-whitepaper-DEC2017.pdf
以及與Augur項目的對比:https://medium.com/@akhounov/hopefully-impartial-comparison-of-gnosis-and-augur-f743d11d6d37。

0xProject

0xProject創建了一個交換代幣的協議,以及一個DApp來實現這個協議。開發者可以創建一個基於它們自己的分布式應用創建交易所(技術上叫中繼層),而用戶也不用信任這些app就可完成交易,結算在區塊鏈上完成。0x協議旨在使用離線的第三方來廣播交易和管理訂單(可以創建/更新/刪除訂單,而不用直接向Ethereum發送緩慢/昂貴的交易),但最終會使用Ethereum進行結算。

它們實現了場外交易,一個DApp使用這個協議來在用戶之間直接交換代幣。你可以在github上查看他們的合約。

鏈接:https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts

Swap

ConsenSys的Swap協議也是非常類似的,但更專註於p2p的直接交易(而不是基於訂單表),這裏有一個白皮書https://swap.tech/pdfs/SwapWhitepaper.pdfSwap,可以看看,這裏有一個關於協議的介紹https://blog.airswap.io/

Bancor

代幣的流動性是相對來說在加密幣的生態中是一個非常大的問題。在用戶間的交易需要滿足買方和賣方兩邊的想法。

Bancor是一個協議,可以讓你的代幣:

1.可以根據訂單自動給予價格;
2.可以通過持有其它的代幣作為抵押器來即時創造流動性。

Open Zeppelin & zeppelinOS

Zeppelin Solutions是一個科技公司,在這個領域內正完成一些偉大,而且專業的事。它們實在做了太多事,太難一一說清了。

他們管理了Open Zeppelin,一系列經過審查的,最佳的智能合約實踐,你可以繼承並應用於你自己的DApp中。你可以查看他們的github資源來學習更多。你應該讀一下裏面的每一個合約。

他們堅持代碼復用的理念,然後進一步創建了Zeppelin OS。你可以忽略OS,它不是傳統意義上的操作系統的概念。zeppelinOS特性,工具和服務的集合,旨在提供穩固的開發人員體驗,同時最大限度地提高智能合同安全性。

zeppelinOS中的其中一部分是“zeppelinOS Kernel”。其實他們不是傳統意義上的核心,而且是一組庫。它們是通過庫模型實現的可升級的智能合約,可以在出現安全問題時獨立的進行更新。因為你在合約內包含的代碼更少,部署也將花費更少的gas,而開發者也減少了代碼的重復。

zeppelinOS還有一些其他整齊的規劃,比如調度程序(智能合約的異步執行,因為默認合同一般不會主動觸發某個行為),市場級的協議和鏈下開發者體驗工具。

以太坊開發入門