以太坊基础开发入门教程,完整入门【转】
翻譯自:https://medium.com/@mattcondon/getting-up-to-speed-on-ethereum-63ed28821bbe
?
從入門到精通,干貨篇。
?
必讀,如果你:
?
-
是一個專業(yè)的程序員
-
如果你想了解以太坊當(dāng)前可以做到什么程度,通過什么,如何做到。
?
預(yù)備知識:
?
????1. 你需要知道區(qū)塊鏈的概念及實現(xiàn)一個無需信任的電子貨幣的運(yùn)作原理。可以先看看長版(https://www.youtube.com/watch?v=bBC-nXj3Ng4),如果你覺得太長,可以看看短版(https://www.youtube.com/watch?v=l9jOJk30eQs)。但我還是建議,看那個長的視頻。
????2. 如果你是一名軟件工程師,擁有軟件開發(fā)的經(jīng)驗。能知道從系統(tǒng)、架構(gòu)角度學(xué)一個東西,其實能倍增學(xué)習(xí)效果。
????3. 如果有一周的空閑時間。好了,下面開始就不再是廢話了。
????4. 你需要了解merkle tree(https://en.wikipedia.org/wiki/Merkle_tree)的基本概念,看他是如何做到防止信息篡改,以及信息自校驗的(譯者注:可以看我曾經(jīng)翻譯的以太坊官方的關(guān)于merkle tree的文章,http://me.tryblockchain.org/Ethereum-MerklePatriciaTree.html?)。
?
不用必須讀白皮書,只需要了解一些基本概念。但說實話,如果不讀,不會相信這些概念,從而不能真正明白這些概念,所以讀白皮書也許仍然是最快的方式。
?
我建議你完整的讀一下本文,從一個較高的層面了解一下,然后再挑感興趣的,一一鉆研,也許要花幾天時間哦。
?
你最后會發(fā)現(xiàn),區(qū)塊鏈就是建立在樸實無華的基本技術(shù)之上,一點也不神奇。雖然最近各種ICO把它炒得非常熱。每個人都是站在巨人的肩膀上,如果你是程序員,你能對這些項目和技術(shù),理解得更深。所以不要因為其它一些糟粕,而失去了一個提升自己的機(jī)會。
以太坊
?
以太坊,Ethereum(https://www.ethereum.org/)是一個分布式的計算機(jī),有許多的節(jié)點,其中的每一個節(jié)點,都會執(zhí)行字節(jié)碼(其實就是智能合約),然后把結(jié)果存在區(qū)塊鏈上。由于整個網(wǎng)絡(luò)是分布式的,且應(yīng)用就是一個個的狀態(tài)組成,存儲了狀態(tài)就有了服務(wù);所以它就能永不停機(jī),沒有一個中心化的結(jié)點(沒有任何一個節(jié)點說了算,去中心化的),任何第三方不能干預(yù)。
?
顯然上面這一段話,直接解釋了以太坊是什么。但你可能有非常多的問題。可以先讀一下以太坊的白皮書(https://github.com/ethereum/wiki/wiki/White-Paper)。或者看下這個視頻,25分鐘理解以太坊(https://www.youtube.com/watch?v=66SaEDzlmP4)。(譯者注:以太坊入門,確實沒有什么好的辦法,就是看白皮書最好,最快)
智能合約
?
智能合約與平時的代碼其實沒有什么區(qū)別,只是運(yùn)行于一個以太坊這樣的分布式平臺上而已。這個運(yùn)行的平臺,賦予了這些代碼不可變,確定性,分布式和可自校驗狀態(tài)等特點。代碼運(yùn)行過程中狀態(tài)的存儲,是不可變的。每一個人,都可以開一個自己的節(jié)點,重放整個區(qū)塊鏈,將會獲得同樣的結(jié)果(譯者注:能控制所有節(jié)點都達(dá)到一致狀態(tài),就是所謂的共識)。
?
在以太坊中,每個合約都有一個唯一的地址來標(biāo)識它自己(由創(chuàng)建者的哈希地址和曾經(jīng)發(fā)送過的交易的數(shù)量推算出來)。客戶端可以與這個地址進(jìn)行交互,可以發(fā)送ether,調(diào)用函數(shù),查詢當(dāng)前的狀態(tài)等。
?
智能合約,本質(zhì)上來說就是代碼,以及代碼運(yùn)行后存儲到區(qū)塊鏈上的狀態(tài)兩個元素組成。比如,你用來收發(fā)ETH的錢包,本質(zhì)上就是一個智能合約,只是外面套了一個界面。
?
概念非常強(qiáng)大,而我相信你已經(jīng)看完了。而你在看相關(guān)的新聞,經(jīng)常聽到這個非常有潛力,經(jīng)常聽到資產(chǎn)/權(quán)利管理,分權(quán)自治組織(DAO),身份,社交網(wǎng)絡(luò)等炫酷。但他本質(zhì)就是這些。
Gas
?
智能合約,就是一些代碼,運(yùn)行整個分布式網(wǎng)絡(luò)中。由于網(wǎng)絡(luò)中的每一個節(jié)點都是一個全節(jié)點。這樣的好處是容錯性強(qiáng),壞處是效率低,消耗資源與時間(譯者注:原來只在一個節(jié)點執(zhí)行一次就行,現(xiàn)在所有節(jié)點中每一個,都要執(zhí)行一模一樣的運(yùn)算)。因為執(zhí)行計算要花錢,而要執(zhí)行的運(yùn)算量與代碼直接相關(guān)。所以,每個在網(wǎng)絡(luò)運(yùn)行的底層操作都需要一定量的gas。gas只是一個名字,它代表的是執(zhí)行所需要花費(fèi)的成本(譯者注:由于以太坊是圖靈完備的,隨便一個死循環(huán)就將導(dǎo)致網(wǎng)絡(luò)不可用,所以引入了gas的概念)。整個分布式網(wǎng)絡(luò)引入了強(qiáng)制限制,來避免停機(jī)問題(https://en.wikipedia.org/wiki/Halting_problem)。因此如果你寫一個死循環(huán),當(dāng)gas耗盡后,網(wǎng)絡(luò)就會拒絕執(zhí)行接下來的操作,并且回滾你之前的所有操作。
?
gas的價格由市場決定,類似于比特幣的交易費(fèi)機(jī)制。如果你的gas價格高,節(jié)點則將優(yōu)先因為利益問題打包你的交易。
?
一般來說,在Ethereum中計算和存儲東西比在傳統(tǒng)環(huán)境中做的更為昂貴,但是,Ethereum為您的代碼提供了上述我們討論過的那些好的屬性,這可能是一樣有價值的。
?
一般來說,在以太坊網(wǎng)上讀取狀態(tài)是免費(fèi)的,只有寫入狀態(tài)是收費(fèi)的。下面這個文章是gas概念的一些深度解析(https://hackernoon.com/ether-purchase-power-df40a38c5a2f)。
分布式APP(?App / Dapp / dapp/ dApp)
?
一個分布式App是指,服務(wù)端運(yùn)行于以太坊網(wǎng)絡(luò)上一個或多個智能合約。
?
一個分布式的App不用將所有狀態(tài)都存儲在區(qū)塊鏈上,或者在鏈上進(jìn)行所有計算(譯者注:比如圖形渲染),這樣就太花gas了。所以一個分布式App把需要大家共同信任的狀態(tài)存在區(qū)塊鏈上就好了。許多的分布式應(yīng)用使用后面提到的技術(shù),如IPFS和Gelem,在鏈下進(jìn)行分布式存儲和計算。雖然沒在以太坊上,但仍使用的是區(qū)塊鏈技術(shù)。
?
我不知道誰開始在D上使用這個小小的缺點,是看起來酷,但會影響搜索。 你可以自由使用,但盡量方便別人的搜索。
?
以太坊的github上,有一個dapp-bin的目錄(https://github.com/ethereum/dapp-bin),有一些文檔和示例。使用前,你需要看看文件最近的狀態(tài),因為他們將很可能已經(jīng)被淘汰。
DApp客戶端
?
大多數(shù)的分布式應(yīng)用都通過一些用戶友好的前端提供服務(wù),因為不是所有人都愿意通過命令行,通過自己手動組裝哈希串和操作指令碼進(jìn)行交易。
?
一個DApp與傳統(tǒng)的開發(fā)中的,客戶端或前端是類似,區(qū)別僅在于它們與以太坊的區(qū)塊鏈進(jìn)行交互(也可以同時與其它服務(wù)交互)。這些客戶端往往用JS編寫,因為當(dāng)前還暫時沒有完成全部的向NodeJS的轉(zhuǎn)換。
?
另外,大多數(shù)的Dapp客戶端使用JS的原因,是因為它可以在瀏覽器中運(yùn)行,因為大家都有瀏覽器,這樣每個人都可以運(yùn)行了。由于有更多的go語言的開發(fā)工具,使用go語言來寫客戶端的也不少。在現(xiàn)在這個激烈的發(fā)展期,這意味著,除非你有自己的偏好,否則可能要從go和JS(也許還有,Rust)來選擇一種語言,來與以太坊區(qū)塊鏈,以及基于以太坊開發(fā)的協(xié)議進(jìn)行交互了。
?
以太坊的一個核心開發(fā)者,寫了一篇關(guān)于使用Meteor工具來創(chuàng)建Dapp的文章(https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor),這意味著Meteor已經(jīng)成為Dapp客戶端開發(fā)的新標(biāo)準(zhǔn)。這絕對是基于JS建立全棧應(yīng)用時的一個首選方法。但需要注意的是Meteor只是提供了一個開發(fā)工具,與DApp客戶端并不等同,DApp客戶端也完全可以由其它方式開發(fā)。(譯者注:還有一些其它的開發(fā)工具,如Truffle,也是非常不錯的哦)。
?
因為圍繞Meteor和DApp開發(fā)的活躍,有非常多的包在Atmophere(Meteor的包管理工具),它提供了許多常見的操作,如帳戶管理,從區(qū)塊鏈中獲得最新的50個區(qū)塊等等。
DApp瀏覽器
?
一個DApp瀏覽器,正如它字面所表達(dá)的,用來讓DApp客戶端(常常使用JS與以太坊的智能合約進(jìn)行交互)的使用更加容易。
?
DApp瀏覽器的主要目的是:
?
????1. 提供到一個以太坊節(jié)點的連接(或者連接到一個本地節(jié)點或者遠(yuǎn)程節(jié)點),和一個方便的切換不同節(jié)點(甚至是不同的網(wǎng)絡(luò))。
????2. 提供一個帳戶(或者一個錢包)來方便用戶與DApp交互。
?
Mist(https://github.com/ethereum/mist)是以太坊官方的DApp瀏覽器。一個漂亮的界面來與以太坊節(jié)點交互,與智能合約發(fā)、收交易。
?
Status(https://status.im/)是一個手機(jī)上可以使用的DApp瀏覽器。
?
MetaMask(https://metamask.io/)是一個Google瀏覽器擴(kuò)展,把Chrome變成了一個DApp瀏覽器。它的核心特性是注入以太坊提供的js客戶端庫web3,到每一個界面,來讓DApp連接到MetaMask提供的以太坊節(jié)點服務(wù)。不過這個Chrome擴(kuò)展,可以允許你管理你的錢包,以及連接到不同的以太坊網(wǎng)絡(luò)(譯者注:包括本地的開發(fā)網(wǎng)絡(luò))。
?
Parity(https://parity.io/parity.html)是一個以太坊客戶端(也是一個全節(jié)點的實現(xiàn)),集成到了Web瀏覽器,并使之成為一個DApp瀏覽器。
以太坊節(jié)點
?
與比特幣的節(jié)點類似。每個節(jié)點都存儲了整個區(qū)塊鏈的數(shù)據(jù),并重放所有的交易以驗證結(jié)果的狀態(tài)。你可以通過geth(https://github.com/ethereum/go-ethereum/wiki/geth)來運(yùn)行一個全節(jié)點(官方的節(jié)點,go語言),或者parity來運(yùn)行一個輕節(jié)點,它是第三方的,Rust語言寫的。
?
你的節(jié)點需要知道從哪個區(qū)塊鏈下載數(shù)據(jù),以及與哪些節(jié)點交互,后面會說明一些常見的網(wǎng)絡(luò)。
?
你也許可以運(yùn)行下所有這些節(jié)點客戶端。如果你不想自己運(yùn)行一個這樣的節(jié)點,有第三方的網(wǎng)關(guān)服務(wù),比如Infura(https://infura.io/)可以選擇。另外還有專門用于測試和開發(fā)的,本地版本的節(jié)點,后面會提到。
?
如果你正在開發(fā)一個DApp的客戶端,你并不總是需要主動提供連接到以太坊的節(jié)點。因為DApp的瀏覽器一般會提供對應(yīng)的連接(譯者注:話說這樣,那使用這個,還得額外安裝一個DApp瀏覽器呀)。
以太坊代幣
?
現(xiàn)在你應(yīng)該知道我們可以通過寫智能合約,并將狀態(tài)存到區(qū)塊鏈上了?那如果,在狀態(tài)這塊,我們存的是一個Map類型,鍵是地址,值是整數(shù)。然后我們將這些整數(shù)值叫做余額,誰的余額呢?它就是我們要說的代幣(譯者注:代幣的數(shù)據(jù)結(jié)構(gòu)就是這樣簡單,存的就是某個用戶,它當(dāng)前的余額)。
?
是的,所有你剛才聽到的代幣,只是一些數(shù)據(jù),存儲在一個哈希表里,通過api或者所謂的協(xié)議,來進(jìn)行增刪改查。這是一個簡單的基本合約(https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/BasicToken.sol)。
?
你可以看看ethereum的創(chuàng)建一個眾籌合約的官方教程(https://www.ethereum.org/crowdsale)。你將會發(fā)現(xiàn)它僅僅是一個合約(Crowdsale)與另一個合約(MyToken)交互,和前面的基本合約類似。并沒有什么神奇的地方。
?
人們使用代幣來做各種各樣的事情,阻攔大家如何使用的只有想像力。代幣常常用來激勵用戶與某個協(xié)議進(jìn)行交互,或者證明對某個資產(chǎn)的所有權(quán),投票權(quán)等等。Coinbase的Fred有一個很好的關(guān)于代幣,為什么存在,如何使用的文章(https://www.youtube.com/watch?v=rktHO5R8Y9c)。
?
Ethereum的創(chuàng)始人Vitalik最近有一個關(guān)于代幣發(fā)售模型,也是一篇不錯的文章(http://vitalik.ca/general/2017/06/09/sales.html)。
ERC20代幣與ERC23代幣
?
每個人都開始定義自己與代幣的交互協(xié)議,但這些很快顯得陳舊,所以一些人開始集結(jié)起來,創(chuàng)建了ERC20代幣接口標(biāo)準(zhǔn)(https://github.com/ethereum/eips/issues/20)。大概意思是說,我們定義這些接口,這樣大家可以相互統(tǒng)一調(diào)用,比如轉(zhuǎn)帳定義為transfer,第一個參數(shù)為要轉(zhuǎn)去的帳戶地址address _to,第二個參數(shù)為要發(fā)送的ether的uint _value數(shù)量。
?
有些人覺得ERC20協(xié)議過于復(fù)雜了,所以他們提議了ERC197(https://github.com/ethereum/EIPs/issues/179),稍微簡單一點。
?
由于在ERC20中存在的一個小問題,有人提議了一個新的ERC23(https://github.com/ethereum/EIPs/issues/223)。ERC23是向后兼容ERC20的。如果你已經(jīng)創(chuàng)建了一個代幣合約,可以嘗試來支持ERC23。
?
看起來ERC223和ERC23是相同的概念;ERC的值是223,但是當(dāng)引用時,作者和所有的其它人誤寫成了ERC23非常多次,它現(xiàn)在也還是這樣引用的。如果一句話說清楚的話,ERC223是規(guī)范號,代幣說明時稱為ERC23代幣就好了。
協(xié)議代幣與App幣
?
協(xié)議代幣為用來激勵對某個協(xié)議的使用。比如,REP,Augur的聲譽(yù)代幣,用來鼓勵對Augur去中心化預(yù)測協(xié)議的使用。大多數(shù)的以太坊的ERC20/ERC23代幣都是協(xié)議代幣,比如Golem的GNT,ICONOMI,BAT等等。
?
App幣則是用來激勵對某個特定DApp或客戶端的使用,而不是因為其使用的協(xié)議提供的價值。其中一個例子是Status的SNT代幣,可以用來在應(yīng)用內(nèi)獲得價值(比如,進(jìn)行消息推送,投票權(quán),獲得用戶名等等)。
?
這種范式的轉(zhuǎn)變是,我們可以開始投資協(xié)議代幣而不是應(yīng)用程序代幣,因為我們可以建立在它們之上(任何人都可以在協(xié)議之上構(gòu)建一個dapp,或為實現(xiàn)該協(xié)議的Dapp構(gòu)建一個Dapp客戶端)。
?
之前,這并不可能,因為加密代幣,以及接下來的協(xié)議創(chuàng)新的時代(http://continuations.com/post/148098927445/crypto-tokens-and-the-coming-age-of-protocol),為了實現(xiàn)貨幣化,你自己可以在協(xié)議之上創(chuàng)建一個應(yīng)用,并實現(xiàn)贏利。因為你自己可以實現(xiàn)協(xié)議的貨幣化,大家可以在未來更好的協(xié)作。
?
你也許可以閱讀一下,關(guān)于0xProject的下面這篇文章,關(guān)于這兩者區(qū)別的詳細(xì)說明(https://blog.0xproject.com/the-difference-between-app-coins-and-protocol-tokens-7281a428348c)。
與智能合約交互
?
你與智能合約的交互(也稱做調(diào)用函數(shù)和讀取狀態(tài))通過連接到某個以太坊節(jié)點,并執(zhí)行操作碼。當(dāng)前有各種各樣的以太坊客戶端,可以方便進(jìn)行開發(fā)。Geth和parity都提供了控制臺或瀏覽器的方式來更好的與智能合約交互。
?
如果你想要一個程序的庫用來與智能合約交互的接口,也有這樣的客戶端實現(xiàn)。對于JS語言,可以使用web3.js。以于go語言,可以使用在go-ethereum(https://github.com/ethereum/go-ethereum)中的abigen的程序,提供了go包,用來與智能合約交互。
?
如果只是用來測試和開發(fā),可以使用ethereumjs-testrpc(https://github.com/ethereumjs/testrpc)來運(yùn)行一個本地節(jié)點(譯者注:這個節(jié)點壓短區(qū)塊時間等,可以方便打整的開發(fā)與測試)。
?
當(dāng)你部署了一個智能合約,你實際進(jìn)行的操作是向地址0x0發(fā)送了一個交易,使用當(dāng)前合約內(nèi)容作為參數(shù),一個以太坊交易詳解(https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f)。
Truffle和Embark
?
一旦你開始寫智能合約,你會重復(fù)做大量的操作,比如編譯源碼為字節(jié)碼和abi,部署到網(wǎng)絡(luò),測試然后部署合約等等。你也許希望更關(guān)注于你想要實現(xiàn)的東西。
?
Truffle和Embark框架,標(biāo)準(zhǔn)化和自動化了這些瑣碎的工作。它們提供了一個好的開發(fā),部署,以及更為重要的,測試智能合約的體驗。
?
你可以查看這個文章(http://truffleframework.com/docs/getting_started)來開啟使用Truffle的旅程。
?
這篇文章,提供了使用Truffle來部署以及與智能合約交互的文章(https://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05)。
?
Embark(https://github.com/iurimatias/embark-framework)提供了類似的,幫助開發(fā)者組織工程的稍有些不同的工具。
?
當(dāng)你一開始接觸智能合約這塊時,應(yīng)該盡量不要使用框架。直到你明白了使用框架能帶來的價值時,才應(yīng)該開始使用,正如你不應(yīng)該通過rails new來學(xué)習(xí)HTML語言一樣。
ETHPM
?
分享是關(guān)心,所以ETHPM是一個去中心化的智能合約包管理資源庫(https://www.ethpm.com/registry)。使用ETHPM,你可以關(guān)聯(lián)或連接到某個著名的合約或庫,減少代碼重復(fù),盡可能理想的為未來的開發(fā)提供好的基礎(chǔ)。
?
這里的這個規(guī)范(https://github.com/ethereum/EIPs/issues/190),詳細(xì)的說明了相關(guān)的信息以及背景。Truffle和Embark均可與之集成,并創(chuàng)造一個愉快的開發(fā)體驗。
網(wǎng)絡(luò)
?
Mainnet-以太坊主網(wǎng),通常是所有客戶端的默認(rèn)網(wǎng)絡(luò)。
?
Ropsten - 以太坊使用工作量證明的主測試網(wǎng)絡(luò)。這個網(wǎng)絡(luò),因為低的計算量,容易遭到DDOS攻擊,分片,或者其它問題。垃圾郵件攻擊后被暫時放棄,最近才恢復(fù)使用。(https://github.com/ethereum/ropsten)
?
Kovan-parity客戶端組成的測試網(wǎng)絡(luò),使用授權(quán)證明來提升對垃圾郵件攻擊的抗擾度,并且持續(xù)4秒的阻塞時間。(https://github.com/kovan-testnet/proposal)
?
Rinkeby-geth客戶端組成的測試網(wǎng)絡(luò),使用集團(tuán)共識,盡管計算量低,但是對惡意行為者更有彈性。(https://www.rinkeby.io/)
?
你可以自己搭建你自己的測試網(wǎng)絡(luò),也許使用kubernetes(https://github.com/MaximilianMeister/kuberneteth)或者docker-compose(https://capgemini.github.io/blockchain/ethereum-docker-compose/),但也許你將很快就可以不需要花什么時間。
帳戶與錢包
?
一個以太坊帳戶就是一個私鑰和公鑰地址對。它們可以用來存儲ether,創(chuàng)建時不需要花費(fèi)gas。
?
錢包則是用來管理ether的智能合約(一些代碼)。這里是使用solidity寫的一個錢包,運(yùn)行于Mist瀏覽器(https://github.com/ethereum/meteor-dapp-wallet/blob/develop/Wallet.sol)。他們可以有許多的特性,比如多用戶簽名,紙?等等。
?
這樣,我們就正確的定義了兩個名詞,前面看到其它人對這兩個術(shù)語的困惑,并把所有能存ether的都叫作Wallet。
EVM以及智能合約創(chuàng)建的狀態(tài)
?
在每個全節(jié)點網(wǎng)絡(luò)上運(yùn)行的智能合約代碼在EVM內(nèi)執(zhí)行。這是您的標(biāo)準(zhǔn)虛擬機(jī),執(zhí)行一些字節(jié)碼,除了這個vm與網(wǎng)絡(luò),文件系統(tǒng),進(jìn)程等隔離。沒有人想要編寫字節(jié)碼,所以我們有一些更高級別的語言編譯為EVM字節(jié)碼。
?
Solidity
?
Solidity(https://solidity.readthedocs.io/en/latest/)是第一批的描述智能合約的語言。當(dāng)前是最流行的語言,因此也有最多的例子,文檔,和教程。你應(yīng)該學(xué)習(xí)這個,除非你有要學(xué)習(xí)其它的理由。
?
你可以使用基于瀏覽器的Remix IDE(https://ethereum.github.io/browser-solidity/)來進(jìn)行快速驗證。
?
下面是一個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風(fēng)格的底層編程語言,就像語言名稱看到的這樣。雖然以太坊官方并沒有將它作為主要需要支持的語言,但它仍舊持續(xù)進(jìn)行著更新,且與solidity在同一個資源庫(https://github.com/ethereum/solidity)。
?
這是一個使用LLL語言寫的一個ERC20代幣的合約(https://github.com/benjaminion/LLL_erc20/blob/1c659e890e2b30408555b9467a8dfd8988211b3b/erc20.lll)
?
LLL示例如下:
?
(seq
? (def 'node-bytes? 0x00)
? (def 'owner??? 0x20) ; address
? (def 'set-node-owner??? 0x5b0fc9c3) ; setOwner(bytes32,address)
? (def 'get-owner (node)
????? (sload (+ node owner)))
//只是用來示例,不能編譯通過
?
如果你正在學(xué)習(xí),也許不是那么的容易習(xí)慣LLL語言的寫法。
Serpent
?
Serpent(https://github.com/ethereum/serpent/tree/develop)是一個類Python的高級語言,最終也會被編譯為EVM字節(jié)碼。它主要被Augur團(tuán)隊使用。
?
但最近Zeppelin Solution團(tuán)隊發(fā)現(xiàn)其編譯器有一個嚴(yán)重的bug(https://blog.zeppelin.solutions/serpent-compiler-audit-3095d1257929),在這個問題被修復(fù)之前都不建議繼續(xù)使用。
?
如果你對Augur如何解決這些漏洞感興趣,你可以閱讀Zeppelin Solution的這篇文章(https://blog.zeppelin.solutions/augur-rep-token-critical-vulnerability-disclosure-3d8bdffd79d2)。
?
Serpent的合約看起來如下:
?
def register(key, value):
??? # Key not yet claimed
??? if not self.storage[key]:
??????? self.storage[key] = value
??????? return(1)
??? else:
??????? return(0)? # Key already claimed
def ask(key):
??? return(self.storage[key])
?
其它
?
在各種可用性和發(fā)展?fàn)顟B(tài)中還有一堆其他的高級語言,而且無疑將會被開發(fā)出來。 為了廣泛采用,語言和編譯器必須經(jīng)過徹底的審查和測試,這當(dāng)然需要時間。
智能合約反編譯/Disassembly
?
可以通過prosity(https://github.com/comaeio/porosity)來反編譯以太坊智能合約的字節(jié)碼,可以使用evmdis(https://github.com/Arachnid/evmdis)來Disassembly。
智能合約的安全
?
一旦一個智能合約部署到了以太坊的網(wǎng)絡(luò)上,它將是永不可變的,且將永久存在。如果你寫了一個bug,你將不能下架這個有問題的版本,你只能在后續(xù)的版本中修復(fù)。
?
由于許多工程師開發(fā)的Ethereum和其他智能合同平臺來自于Web開發(fā),所以這個概念實在是太新,而且是瘋狂的。
?
ConsenSys有一個非常棒的資源叫智能合約的最佳實踐(https://github.com/ConsenSys/smart-contract-best-practices),你應(yīng)該深入的理解一下。
?
一個Parity的錢包被黑的解釋(https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7)。
?
在你部署你的智能合約的時候,由于你管理的是真正的資金,你應(yīng)該先開一個賞金計劃(https://blog.zeppelin.solutions/setting-up-a-bug-bounty-smart-contract-with-openzeppelin-a0e56434ad0e),并盡量保證它完整的測試過。
Whisper
?
Whisper(https://github.com/ethereum/go-ethereum/wiki/Whisper-Overview)是一個集成進(jìn)以太坊的消息系統(tǒng)。它允許DApp發(fā)布小量的信息來進(jìn)行非實時的消息通信。
?
它使用shh協(xié)議。
?
盡管它已經(jīng)有段時間沒有更新了,這是一個使用Whisper協(xié)議實現(xiàn)一個聊天客戶端的例子(https://github.com/ethereum/meteor-dapp-whisper-chat-client)。
去中心自動化組織(DAOs)
?
這是一個組織(就像,一群人),其中,使用代碼來保證最終的強(qiáng)制執(zhí)行,而不是使用傳統(tǒng)的法律文件。這群人使用智能合約來做常見組織做的所有的事情,比如在某件事上進(jìn)行投票,比如決定是否對什么進(jìn)行投資等等。
?
副作用是決策,管理,以及對什么進(jìn)行投資的結(jié)果將會不可改變的存儲在區(qū)塊鏈上。
?
之前slock.it創(chuàng)建了標(biāo)準(zhǔn)的DAO框架來說明這個理念。在這里(https://github.com/slockit/DAO/)有對DAO概念的總覽,以及如何使用框架來實現(xiàn)一個自己的DAO(譯者注:這個項目由于bug被黑客攻擊了)。
Aragon
?
Aragon(https://aragon.one/)也正在應(yīng)對挑戰(zhàn),設(shè)計一個根據(jù)智能合約邏輯運(yùn)作的公司,重點是創(chuàng)建一個可以接受投資,處理會計,支付雇員,分配股權(quán),正如我們現(xiàn)在知道的完成每天的公司的業(yè)務(wù)。他們也實現(xiàn)了漂亮的DApp客戶端來讓他們的協(xié)議使用起來更為簡單。
?
查看這里Aragon核心合約(https://github.com/aragon/aragon-core/tree/master/contracts)來更多的理解它是如何做的。
IPFS&FileCoin
?
IPFS(https://ipfs.io/)(星際文件系統(tǒng))是一個協(xié)議,用來分發(fā)文件。你可以認(rèn)為它是一個基于bittorrent和git這樣概念的一個文件系統(tǒng),文件可以定位,且是不可變的。IPFS以IPLD(http://ipld.io/)數(shù)據(jù)模型存儲信息,它非常有趣,提供了一些特別的特性,你可以通過下面的說明了解一些。
?
這是一個新的協(xié)議,它有一個http的網(wǎng)關(guān)和文件系統(tǒng)適配器,這讓你可以通過http,掛載整個互聯(lián)網(wǎng)文件系統(tǒng)到你本地的盤/ipfs。IPFS還提供了一個尋址服務(wù)IPNS(星際命名空間),它允許可變的狀態(tài)(需要注意的是在IPFS里的所有東西都是不可變的)。你甚至可以使用DNS TXT記錄來定位到你的IPNS客戶端,允許你生成用戶友好的鏈接來指向到對應(yīng)的數(shù)據(jù)。
?
FileCoin(https://filecoin.io/)是Protocol Lab為創(chuàng)建一個去中心化的基于IPFS的存儲市場的努力結(jié)果,也就是向整個網(wǎng)絡(luò)提供存儲資源的激勵層。FileCoin的共識協(xié)議沒有使用浪費(fèi)資源的工作量證明,而是使用了Proff of Replication和Proof of SpaceTime來保證每片數(shù)據(jù)被復(fù)制某個特定的拷貝數(shù)量且存儲某個特定的時間。
?
你應(yīng)該讀一下IPFS的白皮書(https://github.com/ipfs/ipfs/blob/master/papers/ipfs-cap2pfs/ipfs-p2p-file-system.pdf),FileCoin的白皮書(https://filecoin.io/filecoin.pdf),以及IPLD的規(guī)范(https://github.com/ipld/specs/tree/master/ipld)。
?
由于當(dāng)前FileCoin還沒有上線,你可以使用當(dāng)前的IPFS存儲網(wǎng)絡(luò)來運(yùn)行html/css/js,并把作為一個類似orbit-db(https://github.com/orbitdb/orbit-db)的數(shù)據(jù)庫。
Swarm
?
Swarm是一個去中心化的存儲網(wǎng)絡(luò),集成于以太坊生態(tài)系統(tǒng),作為第一陣營的項目,看看這里關(guān)于IPFS與這個項目的比較和優(yōu)劣(https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM)。但本質(zhì)上,基本上是一樣的,除了它們有不同的哲學(xué),并在底層使用稍微不同的協(xié)議。
項目
Augur
?
Augur(https://augur.net/)是一個去中心化的預(yù)測市場,讓大家對于某個現(xiàn)實世界的事件進(jìn)行對賭。一方面,用戶在某個具體可以發(fā)生的事件上投注,一旦結(jié)果成真,它們贏得的代幣有真正的價值。為了實現(xiàn)這個,你需要實現(xiàn)一個去中心化的先知協(xié)議,來輸入現(xiàn)實世界中的信息,它使用REP協(xié)議代幣來進(jìn)行經(jīng)濟(jì)激勵(http://blog.augur.net/guide-to-augurs-rep/)。
?
你可以看看Augur項目的合約代碼(https://github.com/AugurProject/augur-core),以及了解下Augur Master Plan(https://medium.com/@AugurProject/augur-master-plan-42dda65a3e3d)。
Gnosis
?
Gnosis(https://gnosis.pm/)與Augur有類似的理念,也是一個去中心化的預(yù)測市場。這是項目的白皮書(https://gnosis.pm/resources/default/pdf/gnosis_whitepaper.pdf),以及與Augur項目的對比(https://medium.com/@akhounov/hopefully-impartial-comparison-of-gnosis-and-augur-f743d11d6d37)。
Golem
?
Golem(https://golem.network/)是一個分布式的算力市場,以與IPFS一樣的方式構(gòu)建了一整套的提供算力市場。
?
你可以看看FAQ(https://github.com/golemfactory/golem/wiki/FAQ)來更好的理解。
0xProject
?
0xProject創(chuàng)建了一個交換代幣的協(xié)議,以及一個DApp來實現(xiàn)這個協(xié)議。開發(fā)者可以創(chuàng)建一個基于它們自己的分布式應(yīng)用創(chuàng)建交易所(技術(shù)上叫中繼層),而用戶也不用信任這些app就可完成交易,結(jié)算在區(qū)塊鏈上完成。0x協(xié)議旨在使用離線的第三方來廣播交易和管理訂單(可以創(chuàng)建/更新/刪除訂單,而不用直接向Ethereum發(fā)送緩慢/昂貴的交易),但最終會使用Ethereum進(jìn)行結(jié)算。
?
它們實現(xiàn)了場外交易(https://blog.0xproject.com/announcing-0x-otc-5db58dc9ba8),一個DApp使用這個協(xié)議來在用戶之間直接交換代幣。你可以在github上查看他們的合約(https://github.com/0xProject/contracts)。
?
你還可以跳過這些酷炫的概念,直接閱讀FAQ(https://0xproject.com/faq)。
Swap
?
ConsenSys的Swap(https://swap.tech/)協(xié)議也是非常類似的,但更專注于p2p的直接交易(而不是基于訂單表),這里有一個白皮書,可以看看(https://swap.tech/pdfs/SwapWhitepaper.pdf),這里有一個關(guān)于Swap協(xié)議的介紹(https://media.consensys.net/introducing-swap-a-protocol-for-decentralized-peer-to-peer-trading-on-the-ethereum-blockchain-d4058f3179cf)。
Bancor
?
代幣的流動性是相對來說在加密幣的生態(tài)中是一個非常大的問題。在用戶間的交易需要滿足買方和賣方兩邊的想法。
?
Bancor(https://www.bancor.network/)是一個協(xié)議,可以讓你的代幣1)可以根據(jù)訂單自動給予價格2)可以通過持有其它的代幣作為抵押器來即時創(chuàng)造流動性。
?
查看這里的白皮書(https://www.bancor.network/static/bancor_protocol_whitepaper_en.pdf)
Makerdao & Dai
?
以太坊區(qū)塊鏈管理的代幣價值往往會有巨大的波動。這個特性在現(xiàn)實生活中則非常不好,比如你的目標(biāo)是用來保值。
?
Maker DAO(https://makerdao.com/)是一個DAO來管理Dai穩(wěn)定幣(https://github.com/makerdao/docs/blob/master/Dai.md)。Dai現(xiàn)在還不存在,但他們已經(jīng)發(fā)布了一個alpha的版本叫Sai(https://blog.makerdao.com/2017/06/05/introducing-sai/)來展示這門技術(shù)。
?
這里是DAI的白皮書(https://github.com/makerdao/docs/blob/master/Dai.md)。
Oraclize
?
如果我們要向智能合約中輸入一些信息,比如紐約今天的天氣,我也許需要實現(xiàn)一個去中心化的先知協(xié)議詢問一批人(花費(fèi)高且慢),但如果寫一個服務(wù)以中心化的方式來提供信息,又違背了去中心化應(yīng)用的理念。
?
Oraclize(http://docs.oraclize.it/#background)嘗試用以下方式來解決問題1)從一個外部數(shù)據(jù)源向你的智能合約發(fā)送數(shù)據(jù)。2)提供一個證明,數(shù)據(jù)來自某個數(shù)據(jù)源,且沒有被修改過。由此如果你信任random.org,你可以使用Oraclize來提供一個隨機(jī)數(shù)生成合約。
?
他們的集成非常強(qiáng)大; 您可以獲取URL,解析JSON和XPATH,查詢Wolfram Alpha等。
BTCRelay
?
BTCRelay(http://btcrelay.org/)作為比特幣區(qū)塊鏈交易的先知機(jī)制,這意味著你可以在以太坊上編寫智能合約來響應(yīng)比特幣區(qū)塊鏈上的某個交易,進(jìn)行觸發(fā)后續(xù)的操作。比如,你可以讓人通過BTC為你的服務(wù)付費(fèi),使用BTCRelay在以太坊上校驗付款成功后,繼而在以太坊上提供對應(yīng)的服務(wù)。
Open Zeppelin & zeppelinOS
?
Zeppelin Solutions是一個科技公司,在這個領(lǐng)域內(nèi)正完成一些偉大,而且專業(yè)的事。它們實在做了太多事,太難一一說清了。
?
他們管理了Open Zeppelin(https://openzeppelin.org/),一系列經(jīng)過審查的,最佳的智能合約實踐,你可以繼承并應(yīng)用于你自己的DApp中。你可以查看他們的github資源來學(xué)習(xí)更多(https://github.com/OpenZeppelin/zeppelin-solidity)。你應(yīng)該讀一下里面的每一個合約。
?
他們堅持代碼復(fù)用的理念,然后進(jìn)一步創(chuàng)建了Zeppelin OS(https://blog.zeppelin.solutions/introducing-zeppelinos-the-operating-system-for-smart-contract-applications-82b042514aa8)。你可以忽略O(shè)S,它不是傳統(tǒng)意義上的操作系統(tǒng)的概念。zeppelinOS特性,工具和服務(wù)的集合,旨在提供穩(wěn)固的開發(fā)人員體驗,同時最大限度地提高智能合同安全性。
?
zeppelinOS中的其中一部分是“zeppelinOS Kernel”。其實他們不是傳統(tǒng)意義上的核心,而且是一組庫(https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736)。它們是通過庫模型實現(xiàn)的可升級的智能合約(https://blog.zeppelin.solutions/proxy-libraries-in-solidity-79fbe4b970fd),可以在出現(xiàn)安全問題時獨立的進(jìn)行更新。因為你在合約內(nèi)包含的代碼更少,部署也將花費(fèi)更少的gas,而開發(fā)者也減少了代碼的重復(fù)。
?
zeppelinOS還有一些其他整齊的規(guī)劃,比如調(diào)度程序(智能合約的異步執(zhí)行,因為默認(rèn)合同一般不會主動觸發(fā)某個行為),市場級的協(xié)議和鏈下開發(fā)者體驗工具。
ENS - 以太坊的命名服務(wù)
?
ENS(https://ens.domains/)是一個去中心化的名稱注冊服務(wù)。并有一個描述性的項目名稱。
BAT 基礎(chǔ)注意力代幣 & Brave瀏覽器
?
BAT(https://basicattentiontoken.org/)嘗試去中心化廣告系統(tǒng),通過監(jiān)控大家的注意力,并在內(nèi)容提供商,廣告商和用戶之間分發(fā)收益,切掉中間人。
?
Brave和BAT由JS創(chuàng)始人Brendan Eich創(chuàng)建,同時他也是Mozilla的聯(lián)合創(chuàng)始人。
uPort
?
uPort(https://www.uport.me/)在解決去中心化的身份識別問題。
district0x
?
district0x(https://district0x.io/)是一個更高層級的去中心化的市場和社區(qū)。核心是通過一系列的智能合約來管理用戶發(fā)布信息,搜索,過濾信息,在社區(qū)內(nèi)維護(hù)信譽(yù),管理支付等等。它可以用來建議如Ethlance(https://ethlance.com/)和NameBazaar(https://namebazaar.io/)這樣的市場。
?
他們有非常棒的視覺設(shè)計。
Steem
?
Steem(https://steemit.com/)是區(qū)塊鏈上的reddit,它使用協(xié)議代幣(STEEM)來激勵這個社交社區(qū)的參與度。
?
在這里查看白皮書(https://steem.io/SteemWhitePaper.pdf)。
?
有一些關(guān)于Steemit塊鏈如何啟動以及支持組織如何運(yùn)作的反應(yīng)(https://medium.com/m/global-identity?redirectUrl=https://decentralize.today/the-ugly-truth-behind-steemit-1a525f5e156)。
參與者與領(lǐng)域內(nèi)的玩家
ConsenSys
?
ConsenSys(有點像共識Consensus,但作為一個公司名稱;它很聰明,巧妙的把u改成了s,但我一般念為“con-SEn-SIS”,避免讀錯)是一個“風(fēng)險投資和產(chǎn)品工作室”。他們是一個(其實非常大)傘形組織,它贊助了一大堆項目(https://consensys.net/ventures/spokes/)和核心組件(https://consensys.net/ventures/core-components/)的開發(fā)。值得一提的是,它們資助了Truffle,Infura,MetaMask,Gnosis和uPort。
Zeppelin Solutions
?
Zeppelin Solutions(https://zeppelin.solutions/)在上面我們有提到過,他也審查智能合約代碼,提供咨詢服務(wù)。他們的博客質(zhì)量相當(dāng)高(https://blog.zeppelin.solutions/)。
Protocol Labs
?
Protocol Labs(https://protocol.ai/)是一群讓人印象深刻的人,致力于IPFS,FileCoin,lip2p以及IPLD等其它項目的開發(fā)。
區(qū)塊鏈資本概況
?
Etienne Brunet(https://medium.com/@etiennebr)有一篇關(guān)于代幣,ICO和VC的概況文章(https://medium.com/@etiennebr/my-token-ico-blockchain-capital-markets-landscape-617e6ff1eae1)。
社區(qū)
?
你可以加入以太坊的社區(qū)(https://medium.com/blockchannel/where-can-i-join-the-ethereum-community-3aa5c795b1e5)。
未來
?
未來展望(https://media.consensys.net/interplanetary-linked-computing-separating-merkle-computing-from-blockchain-computational-courts-1ade201ecf8a)。
?
出處:http://me.tryblockchain.org/getting-up-to-speed-on-ethereum.html
總結(jié)
以上是生活随笔為你收集整理的以太坊基础开发入门教程,完整入门【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零基础怎么学手绘?
- 下一篇: AppInventor开发环境搭建