適讀人群:
- 專業攻城獅+程序猿
- 系統、深入地瞭解以太坊/區塊鏈
就是這麼簡單,當然前提是您對下面這些知識有些瞭解
- 瞭解區塊鏈的概念以及比特幣的運行機制。
- 您已經是一名專業的軟件攻城獅,並且有基本的編程知識,理解系統/架構/數學等知識
1 以太坊
以太坊是一臺分佈式計算機,網絡中的每個節點都執行一些字節碼(智能合約),然後將結果狀態存儲在區塊鏈中。區塊鏈實質是一個應用了密碼學技術的分佈式數據庫系統。(有關密碼學的文章,前幾篇文章中也有提及。)
當然,一個段落不足以清楚解釋問題,您可以繼續閱讀以太坊白皮書 (鏈接地址:https://github.com/ethereum/wiki/wiki/White-Paper),或者在其他相關帖子中去了解。
2 智能合約
“智能合約”實際上只是一些類似在 Ethereum 平臺這樣的分佈式環境中執行的代碼。執行該代碼的平臺為這段代碼提供了一些屬性,例如:不變性,確定性操作,分佈式和可驗證狀態等。“智能合約”實際上就是執行代碼被管理的狀態存儲在區塊鏈中,不可變,任何人都可以通過回顧這條鏈上的所有交易來檢查當前狀態是否正確。
在以太坊中,合約有一個地址來唯一標識它們(這是創建者地址的散列,以及他們之前發送了多少交易)。然後,客戶端可以通過發送以太網,調用函數,查詢它管理的分佈式狀態等方式與該地址進行交互。
智能合約也是一些代碼,其中一些分佈式狀態由區塊鏈管理。例如,您用來接收/發送ETH的multi-sid錢包只是一個智能合約,上面有一個用戶界面。
3 GAS
智能合約(代碼塊)由網絡中的每個完整節點執行,容錯性強(優點),但是這會花費大量的算力和時間(缺點)。因為執行計算需要花費金錢,所以執行計算的成本與代碼執行的計算有關。換言之,EVM 中的每個低級別操作碼都需要花費一定量的“GAS”來執行。“GAS”只是一個抽象詞彙,用於表示執行計算的成本。還有一個網絡執行中的gas限制,以解決停機問題; 也就是說,你不能編寫永不結束的程序,因為你消耗完“GAS”,網絡會停止計算。
gas 的“價格”(即這臺分佈式計算機上兩個數字相加會花費我多少成本)”由市場決定,類似於比特幣的交易費用。如果您支付更高的 gas 價格,節點將優先處理您的交易以獲得更多收益。
一般來說,在Ethereum上計算和存儲要比在傳統環境中價格高,但是Eathereum為您的代碼提供了上面討論的所有這些好的屬性,這些屬性也同樣重要。
4 去中心化應用DApp
DApp 是一個運行在以太網絡上的“服務端”,就像Android/ios上的app.
github上的ethereum組織有一個dapp-bin存儲庫,它有一些引用和示例。不過,一定要查看最近的文件狀態信息,因為信息會很快過時。
5 DApp 客戶端
這些分佈式應用程序通常伴隨著一些用戶友好的前端,因為沒有人希望通過客戶端或操作碼手動處理例如帶有散列和操作碼這樣的請求。
dApp客戶端實際上就是任何“客戶端”或“前端”,除了這個客戶端與Ethereum區塊鏈(可能除了其他服務)的接口之外。這些客戶端通常是用JavaScript編寫的,因為我們還沒有將所有的庫都轉換成NodeJS。
更重要的是,大多數dApp客戶端主要使用JavaScript編寫,因為它可以在Web瀏覽器中運行。由於有很多GO語言的庫,它們也經常用Go編寫。所以您可以在JavaScript和Go(或許是Rust)之間進行選擇,以便與Ethereum區塊鏈及其上正在開發的協議進行交互。
那麼問題來了?*圍繞“分佈式應用程序”的確切術語/定義存在一些混淆/討論:是否僅僅是智能合約?它是整個系統的後端,在某種程度上,與以太坊平臺的接口存儲信任?或者也可能包含客戶端代碼以及用戶界面,因此整個包被稱為“dApp”?
*我將其定義為“與以太坊區塊鏈接口系統後端”。這與“智能合約”有很大不同,證明其自身概念,並且也意味著(確實)任何人都可以創建客戶端來與分佈式應用進行交互。
6 DApp瀏覽器
dApp 瀏覽器, 它是一個應用程序,為了 dApp 客戶端(通常是與 Ethereum 節點交互的 JavaScript (與智能合約進行通信))的使用更容易。
dApp 瀏覽器的主要目的是:
- 提供一個到 Ethereum 節點的連接(本地或遠程託管的節點),也可以通過簡單的方式將連接更改為指向不同節點(可能連接到不同的網絡),
- 併為用戶提供帳戶界面(“錢包”),方便與這些dApp進行交互。
Mist 是官方 Ethereum dApp 瀏覽器。它實際上只是一個漂亮的 Web 用戶界面,用於與 Ethereum 節點進行交互並向智能合約發送/接收事務。
Status 是一款移動瀏覽器,在手機上可以使用。
MetaMask 是一款 Chrome 擴展程序,可將 Chrome 變成“dApps 瀏覽器”。其核心功能是它將 web3(一個 JavaScript Ethereum 客戶端庫)注入每個頁面,允許 dApp 連接到 MetaMask 託管的以太坊節點。Chrome 擴展程序允許管理錢包並將其連接到可用的不同以太網絡。
Parity是一個以太坊客戶端(以及一個全節點實現),它與您的Web瀏覽器集成在一起,將它變成一個dApp瀏覽器。
7 以太坊節點
大多數關於比特幣節點的知識在這都適用。節點存儲區塊鏈的副本,並可選擇執行所有事務以確認結果狀態。使用 geth(first-party,Go)或 parity(third-party,Rust)運行一個完整的節點或輕客戶端。
您的節點需要知道要下載哪個區塊鏈以及要與哪些對等點通信; 請參閱下面不同的可用網絡的相關討論。
您應該繼續使用 docker 和某種持久性存儲來運行所有這些節點客戶端。如果你不想自己運行一個節點,你可以使用像 Infura 這樣的第三方。還有一種方法可以運行本地節點進行測試和開發,稍後再討論。
如果您將dApp客戶端分發給用戶,則不需要提供對以太坊節點的訪問; dApp瀏覽器為任何需要它的客戶端提供連接。
8 以太坊代幣
你知道我們如何編寫代碼(“智能合約”)將狀態存儲到區塊鏈上了? 即在該狀態下我們將以太坊地址映射存儲為一個整數。並稱這個整數為balance。即“Tokens”
沒錯,你所聽到的所有“Tokens”存儲在哈希表中,通過API(aka協議)來增刪改查。這有一個簡單的基本合約。
繼續閱讀關於 [the ethereum.org tutorial on creating a crowdsale]; 你會發現它只是一個合約(Crowdsale),與另一個合約(MyToken)交互,就像上面鏈接的基本 token contract 一樣。
人們正在使用token來進行各種用途,並且很快你會發現想象力是無限的。Tokens經常用於激勵與協議的交互,證明資產的所有權,投票權等。
Vitalik 最近撰寫了一篇分析 tokens 的博客文章 [ Analyzing token sale models],可以拿來讀一下。
9 與智能合約進行交互
通過連接到 Ethereum 節點並通過 JSON RPC API 執行函數,您可以與智能合約(又名,執行方法和讀取狀態)進行交互。有許多以太坊節點客戶端以開發友好的方式執行此操作。geth 和 parity 都提供為與 contracts 交互提供控制檯/瀏覽器。
如果您想以編程方式與contracts進行交互,則有各種Ethereum客戶端實現。對於JavaScript,web3.js,ethjs和ethers.js很受歡迎。對於golang,go-ethereum中的abigen可執行文件提供了用於contracts進行交互的軟件包。儘管如此,它只是一個標準的JSON RPC API,因此如果一旦不可用,您可以隨時編寫自己的適配器以選擇您所選擇的語言。 除了簡單的功能執行外,一些客戶端庫還提供了便利功能。
運行本地以太坊節點進行測試和開發Ganache(以前稱為ethereumjs-testrpc)。
當你“deploy”一個智能合約時,你真正要做的就是用contract bytecode作為參數向0-address(0x0)發送一個交易。
10 Truffle,Embark,Populous,Perigord & Others
一旦你開始寫智能合約,你最後會一遍又一遍地做很多相同的操作; 將你的源代碼編譯成字節碼和abi,部署到網絡,測試已部署合約等。你可能也會想更關注於你想實現的東西。
像Truffle,Embark,Populous和Perigord這樣的框架可以標準化和自動化許多細節。他們為開發,部署以及非常重要的測試合約提供了很好的開發體驗。
這篇漫遊指南很好的闡述了使用Truffle 來部署和交互合約。
Embark(Node)對開發人員應該如何構建項目有類似但不同的想法。
Perigord(Go)與Truffle非常相似。
Populous(Python)是一個積極開發的Python框架,可以滿足相同的需求。
當你一開始接觸合約時,如果你沒有理解框架所提供的價值的話,你應該避免使用,就像你不應該開始學習如何使用rails new編寫HTML一樣。
11 ETHPM & NPM
共享一種關懷,所以ETHPM是一個去中心化的智能合約包資源庫。使用ETHPM,您可以繼承或鏈接到其他知名的合約和庫,從而減少代碼重複,併為將來的開發提供良好的合約基礎。
這裡有個規範,你可以在這裡獲得更多相關信息和背景。
12 State of the Networks
Mainnet - 以太網主網,通常是所以客戶端和瀏覽器的默認網絡。
Ropsten -主要在以太坊使用工作量證明測試網。這個網絡由於計算量小,很容易被DDOS,split和其他問題。它最近被再次啟用,並在被垃圾郵件攻擊後暫時放棄後再次啟用。
Kovan – Parity-唯一使用權威證明的客戶端測試網絡,針對垃圾郵件攻擊提供免疫力和一致的4秒封鎖時間。
Rinkeby - geth 客戶端僅使用 Clique Consensus 的 testnet,因此儘管計算量較低,但對惡意行為者更具適應性。
您也可以運行您自己的以太坊專用網絡。Go-ethereum 團隊建立了puppeth來配置完整的網絡,包括自定義的 bootnode,創世區塊和共識規則,這正是 Rinkeby 網絡的動力所在。您也可以運行自己的基礎架構,可能使用 kubernetes 或 docker-compose。但是你可能不需要在短時間內運行一個私有網絡。
13 “賬戶”和“錢包”
Ethereum 賬戶是私鑰和地址對。他們基本上只是儲存 Ether,創建時不需要 gas。以太坊網絡上的所有交易都來自一個賬戶; 合約不具備啟動交易的能力。
錢包是兩件事情之一: 1)用於創建和發送使用你的賬戶的交易的優化界面(即 MyEtherWallet, 2)一個用於發送和接收以太網的智能合約(這又是一些代碼)這是在Github上的一個錢包可靠實現.它們有多種類型,如多簽名等。
現在我們已經正確地定義了這兩者,準備好讓人們把這兩個詞混淆在一起,並把任何發送/接收到醚的東西都貼上“錢包”的標籤,並把所有東西都稱為“賬戶”。
14 智能合約編程語言
Solidity
Solidity是描述智能合約的first-party語言。因為是最流行的語言,所以有很多例子和參考教程。除非你有更好的學習,不然還是建議你認真學習他。
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語言寫的一個合約
Serpent
Serpent 是一種編譯為 EVM 字節碼的高級 Python-esq 語言。由於 Zeppelin 發現了許多嚴重的 bug,因此它已被棄用。對於類似語言,請參閱 Vyper。
Vyper(previously Viper)
Vyper也是python啟發和開發的,專注於安全性、簡單性和無意外。它仍在開發中。
Others
在可用性和開發的不同狀態中還有一些其他高級語言,毫無疑問將會有更多的語言被開發出來。但是,為了獲得廣泛的採用,語言和編譯器必須經過徹底的審查和測試,這是需要時間來證明的。
15 智能合約的安全
一旦智能合約部署到以太坊,它是不變的,並且永遠存在。如果你寫了一個bug,你不能刪除; 你只能在後續的版本修復。
因為有那麼多為 Ethereum 和其他智能合同平臺開發的工程師來自 web 開發,所以這是一個最新和最瘋狂的概念。
ConsenSys 擁有一個完美的 smart contract best practices,您應該深入理解。
在你部署一個能夠操作真實現金的智能合約之前,你應該打開一個 bug 獎勵並且對其進行測試。如果您正在處理RealMoney™,則應該對您的代碼進行專業審計。
16 Whisper
Whisper 是一個構建到以太坊的信息系統。它允許dApp發佈少量信息,以實現非實時通信。
它使用協議shh這是非常好的,很少有文檔和採用這種協議。儘管它在一段時間內沒有更新,但這裡有一個使用Whisper實現聊天客戶端的示例dapp。
17 去中心自動化組織(DAOS)
這是一個組織(就像一群人),他們不用法律文件來強制執行操作,而是使用一堆智能合約。然後,你們的人群使用這些合約來完成一個組織所做的所有正常工作,比如進行投票。
這樣做的一個副作用是決策制定,治理,並且永久地存儲在區塊鏈中(在這些合約的狀態下)。
18 IPFS & FileCoin
IPFS(星際文件系統)是分發文件的協議。把它看作是一個使用 bittorrent 和 git 背後思想的文件系統,其中數據是內容尋址和不可變的。IPFS 使用稱為 IPLD 的數據模型存儲信息。
雖然這是一個新的協議,但有一個http網關和一個文件系統適配器,這意味著您可以通過http獲取IPFS內容,並將整個全局文件系統掛載到本地磁盤的/ ipfs上。IPFS還提供稱為IPNS(InterPlanetary名稱空間)的命名系統,它允許可變狀態(回想一下IPFS中的所有內容都是不可變的)。 您甚至可以使用DNS TXT記錄來指導您的IPNS客戶端,使您能夠生成人性化的數據鏈接。
FileCoin是Protocol Labs為IPFS上的存儲創建分佈式市場所做的努力; 即為網絡提供存儲的激勵層。 FileCoin共識協議消除工作證明的浪費,並且使用SpaceTime證明和複製證明,來確保一塊數據被複制了一定的次數,並被存儲了特定的時間。
您應該閱讀 IPFS白皮書,FileCoin白皮書 和 IPLD規範。
19 項目
Augur
Augur是一個去中心化的預測市場,可以讓用戶對真實世界的事件結果進行投注。一方面,您擁有預測市場,用戶通過交易代幣來表明對特定結果的信任; 一旦結果得以實現,獲勝代幣具有全部價值。 為了實現這一點,你需要分散的oracle協議,它創建了一個提供真實事件知識的市場,由 REP(聲譽)協議 token 激勵。
在GitHub上的對於Augur markets 合約非常值得一讀。
Gnosis
Gnosis 與Augur 有相似的理念,也是去中心化的預測市場。
Golem
與IPFS + FileCoin創建分佈式存儲市場一樣,Golem是計算能力的分佈式市場。
OxProject
0xProject創建用於交易token的協議和使用該協議的 dApp。開發人員可以在其分佈式應用程序(也稱為智能合約收集)之上建立一個交易所(技術上的“relayer”),用戶不必擔心您的應用程序的信用問題來結算交易; 結算在區塊鏈上處理。0x協議旨在使用鏈外第三方(“relayers”)廣播交易和管理訂單(因此可以創建/更新/刪除訂單,而無需向以太坊發送緩慢且昂貴的交易),但是使用 Ethereum 來進行結算。
他們首先實現了0xPortal(以前是0xOTC),這是一個 dApp,使用他們的協議在用戶之間直接傳輸 token。你可以查看他們在GitHub上的合約.他們向主網絡發起了合約,並正在與社區合作建立relayers.
Swap
ConsenSys的Swap協議非常相似,但專注於通過“Indexers”傳達意圖(而不是簽署交易承諾),然後讓訂單被撮合到p2p。這是白皮書。
Bancor
代幣的流動性是密碼生態系統中相對較大的問題。用戶之間的交易既要滿足你的購買慾望,也要滿足對方的出售意願(反之亦然)。
Bancor是一個協議(以及一套實施該協議的智能合約),可讓您創建token,1)根據訂單自行定價,2)通過持有另一個代幣(如Ether或任何ERC20)作為抵押提供即時流動性。
Open Zeppelin & zeppelin_os
Zeppelin是一家技術公司,在這個領域做了一些非常了不起的專業工作。老實說,他們正在做很多事情,而且很難詳盡的敘述。
他們管理Open Zeppelin,這是一套經過審核的智能合約最佳實踐,您可以在自己的dApp中繼承和使用它們。看看他們的GitHub上關於solidity contracts的回覆,這是一個很好的學習資源。老實說,你應該看看裡面的每一份合約。
他們正在將代碼可重用性概念向前推進一步,並創建zeppelin_os。 忽略術語“OS”; 它不是經典意義上的操作系統。zeppelin_os是一組功能,工具和服務的集合,旨在提供可靠的開發人員體驗,同時最大限度地提高智能合約安全性。
zeppelin_os的一部分是“zeppelin_os內核”,它不是內核,但實際上是一組知名的智能合約,充當庫。它們可以通過代理庫模型進行升級,並且可以在安全補丁情況下獨立升級。由於在合約本身中包含的代碼較少,因此部署成本更低,開發人員減少了代碼重複。
ENS - Ethereum Name Service
ENS是人類可讀名稱到地址的分散註冊表。再加一個描述性項目名稱。各種項目與它集成在一起,允許您支付.eth地址或以其他方式將其用作方便的查找工具。您也可以創建解析到.eth地址的DNS記錄。
Gravity:去中心化數據計算和交換引擎
Decentralized Data Computing and Exchange Engine
Gravity提供一個共享計算網絡,將空閒的手機、終端、PC等設備組成一個巨大的計算引擎。Gravity獨創點對點的MapReduce框架處理大數據,以及點對點的資源調度系統將網絡中的各節點的資源高效利用。利用區塊鏈價值,使資源共享者在互信的網絡中獲取激勵。
閱讀更多 Gravity地心 的文章