【劉文彬】探路以太坊

原文鏈接:醒者呆的博客園,https://www.cnblogs.com/Evsward/p/ethereum.html

關(guān)鍵字:以太坊,加密貨幣,crowdsale,geth,console,web3.js

以太坊簡介

一句話簡介:以太坊是一個基于功能齊全的編程語言構(gòu)建的眾多去中心化區(qū)塊鏈應(yīng)用的平臺。

下面來解讀一下這句話:

  • 平臺:首先以太坊是一個平臺,這個平臺上面有很多應(yīng)用。
  • 應(yīng)用:這些應(yīng)用是是去中心化的,基于區(qū)塊鏈技術(shù)。所以這些應(yīng)用可以實現(xiàn)永不停歇,因為它是分布式的,去中心化的,基于P2P網(wǎng)絡(luò)的,這些應(yīng)用被管理在以太坊錢包上面。
  • 錢包:以太坊錢包,本質(zhì)上以太坊錢包也是其中一個應(yīng)用,它是一個網(wǎng)關(guān),可以管理所有基于以太坊平臺的應(yīng)用,它可以讓你持有或者保護以太幣或其他建立在以太坊上的加密資產(chǎn)。以太坊錢包也可以實現(xiàn)直接對智能合約的寫入、部署以及使用。
  • 區(qū)塊鏈:以太坊區(qū)塊鏈是一條強大的,分享型的,全球性的基礎(chǔ)設(shè)施,用來證明財產(chǎn)的歸屬者以及財產(chǎn)的交易流向。通過這一條鏈,可以實現(xiàn)眾多應(yīng)用,開發(fā)者可以創(chuàng)建交易所、存儲債務(wù)登記以及證實各種允諾等應(yīng)用玩法。這些應(yīng)用可以對各種實體期貨進行交易,避免中間人攻擊以及交易對方欺騙。
  • 智能合約:這些應(yīng)用是使用一個功能齊全的編程語言構(gòu)建的,這個語言指的是智能合約,而智能合約無疑是采用Go語言開發(fā)的。智能合約是這些應(yīng)用的“驅(qū)動”,通過智能合約,應(yīng)用可以完全按照編程所寫去執(zhí)行,而不會涉及downtime,審查,欺騙以及第三方干擾。

關(guān)于以太坊錢包,官方有一句話是 It allows you to hold and secure other crypto-assets built on Ethereum, 以太坊允許你持有和保護基于以太坊的加密資產(chǎn),那么第一個問題這個加密資產(chǎn)是否可以自行創(chuàng)建?加密資產(chǎn)是否也可以是類似于以太幣的電子貨幣?是的是的,完全可以,下面我們將具體介紹。

加密貨幣

使用智能合約的一種新語言Solidity,設(shè)計并發(fā)行你自己的加密貨幣。

上面講到了各種實體期貨以及以太幣等資產(chǎn),那么如果我想在以太坊平臺上建立一個應(yīng)用,應(yīng)用內(nèi)部的交易使用我自己的加密貨幣呢?這個加密貨幣可以代表真實世界的商品。這種加密貨幣會調(diào)用以太坊統(tǒng)一的虛擬幣接口,從而讓基于自定義貨幣的合同均可以兼容以太坊錢包,其他合同和交易也均采用這套接口。接著,對于你發(fā)行的加密貨幣是可以設(shè)置一個固定的總數(shù)或者一個基于某寫規(guī)則而浮動的數(shù)量。在以太坊中,你可以:

  • 構(gòu)建一種貨幣可以交易,同時可設(shè)定他們的發(fā)行量。
  • 構(gòu)建一個中心化銀行來發(fā)行貨幣。
  • 設(shè)計一種基于難題的加密貨幣。

請參考詳細開發(fā)文檔

眾募

如果你已經(jīng)有想法并準備在以太坊上面做點什么,但是缺乏啟動資金。同樣可以使用以太坊,創(chuàng)建一個合同來募集貢獻者的資金直到達成某種目標。根據(jù)成果,這筆錢要么被發(fā)放到項目擁有者手里要么原路返還給貢獻者們。所有的過程不需要中間的仲裁人,票據(jù)交換所或者不確信的對他人的信任。對了,你甚至可以使用上面你自己創(chuàng)建的加密貨幣來追蹤對貢獻者的報酬。通過以太坊,你可以:

  • 通過預(yù)售一件產(chǎn)品募集到一筆資金,哪怕這個產(chǎn)品還僅是在雛形階段。
  • 通過出售一個區(qū)塊鏈組織里的虛擬分享來募集資金。
  • 拍賣有限數(shù)量的物品。

請參考詳細開發(fā)文檔

眾籌crowdfund和眾募crowdsale的區(qū)別?

Crowdfunding簡單點就是你有個想法,然后通過團購和預(yù)售(一些實際商品或者一些承諾把你名字放在電影啥的等)的方式募集項目資金。

crowdsale 也叫ICO (Initial Coin Offering)是很多區(qū)塊鏈項目, 在項目正式推出之前銷售token,旨在為這個項目的開發(fā)籌集資金,也可以拿來測試大眾對產(chǎn)品的興趣。在許多情況下,在crowdsale買了token后會被拿到公開市場上購買和出售,會獲得獨立于應(yīng)用程序自己的市場價值。這也是吸引早期adopter的一種方法,他們相信這個token的價值,有升值空間. 還有和Crowdfunding不一樣的是,crowdsale能夠讓那些投資者很快將持有的token在數(shù)字貨幣交易所中進行交易。而且token流動性極強的優(yōu)勢也會導(dǎo)致項目估值產(chǎn)生更好的溢價。區(qū)塊鏈行業(yè)中最有名的Crowdsale是2014年9月的以太坊,大概籌集了價值1800萬美元的比特幣。

引用自[知乎](https://www.zhihu.com/question/55920197/answer/147711837)

民主

實際上就是一個投票系統(tǒng)。

創(chuàng)建一個自治組織,有規(guī)則來約束如何花錢以及幫助你或者其他投資者做決定。

現(xiàn)在,你有了自己的想法和有擔(dān)保的資金,也有了自己發(fā)行的貨幣,你可能是時候需要雇傭一個可信的財務(wù)官來幫助你管理賬戶,組織董事會以及一堆的文書工作。然而,你可以將這些工作全都交給以太坊智能合約,它將收集你的支持者們的提議書,并通過一個完全透明可信的投票流程提交他們。

這相當(dāng)于你擁有了一個機器人來幫助你打理一切,這其中最重要的一個好處就是:

可以免疫外部影響,只會依照你自己編寫的程序代碼堅決執(zhí)行。而且因為以太坊網(wǎng)絡(luò)的去中心化特性,你將能夠獲得7*24小時百分百的全時線上服務(wù)保證。

通過以太坊,你可以實現(xiàn):

  • 一個虛擬的組織,組員們可以公平投票來處理問題。
  • 一個透明的協(xié)會基于股東們的投票。
  • 你自己的國家,擁有一個不變的憲法。
  • 一個更好的協(xié)商民主。

以太坊環(huán)境搭建

這里通過github下載源碼進行搭建,ethereum地址:

git clone https://github.com/ethereum/go-ethereum && cd go-ethereum

構(gòu)建geth命令:

make geth

構(gòu)建所有工具:

make all

完整工具包包括:abigen bootnode ethereumwallet evm faucet geth mist puppeth rlpdump swarm wnode

安裝工具

sudo ln -s $PWD/build/bin/* /usr/local/bin/

將編譯好的所有工具軟連接到/usr/local/bin目錄下,該目錄本身就在PATH環(huán)境變量下,所以我們可以在任意位置使用這些剛剛編譯好的工具了。

每次對工具的編譯,尤其是geth,都是調(diào)試的方式。

geth(go ethereum)

以太坊主要的命令行客戶端工具。它是以太坊網(wǎng)絡(luò)(可以是私有、公有或者測試網(wǎng)絡(luò))的一個入口點。能夠作為一個完整的節(jié)點(默認)、存檔節(jié)點(保存所有歷史狀態(tài))或一個輕型節(jié)點(檢索存活數(shù)據(jù))。它可以被其他進程通過在JSON RPC在HTTP、WebSocket或IPC傳輸協(xié)議頂端暴露端點,作為進入以太坊網(wǎng)絡(luò)的網(wǎng)關(guān)。

abigen(ABI生成器)

ABI(Application Binary Interface) 應(yīng)用二進制接口,在以太坊生態(tài)系統(tǒng)中,它是一個標準的用來與合約交互的方式。交互包括區(qū)塊鏈外部以及合約之間的交互。數(shù)據(jù)依據(jù)它的類型會被編碼,正如本規(guī)范中的描述那樣。編碼不是自我描述,因此需要一個模式來解碼。

源碼生成以太坊合約定義轉(zhuǎn)變?yōu)橐子谑褂?,編譯時類型安全的Go包。它可以操作在以太坊Solidity用于擴充功能。然而它也接受Solidity源文件,讓開發(fā)更加流水線化。記住abigen就是與Solidity相關(guān)的工具命令。Solidity上面也提到過,是設(shè)計并發(fā)行自己的加密貨幣的一種語言。

bootnode(輕型引導(dǎo)節(jié)點)

精簡版的以太坊客戶端實現(xiàn),只加入網(wǎng)絡(luò)節(jié)點發(fā)現(xiàn)協(xié)議,但不能運行其他更高級別的應(yīng)用協(xié)議了。它可以被用作一個輕型的引導(dǎo)節(jié)點,旨在私有網(wǎng)絡(luò)中尋找節(jié)點。

evm(以太坊虛擬機)

開發(fā)者工具版本的以太坊虛擬機。通過一個可配置的環(huán)境和執(zhí)行模式,能夠運行字節(jié)碼片段。它的目的在于允許完全孤立不影響其他,細粒度地調(diào)試操作碼。例如evm --code 60ff60ff --debug

gethrpctest(geth rcp test工具)

開發(fā)實用工具,支持我們的以太坊/RPC測試套件。這些套件能夠校驗基線符合以太坊JSON RPC規(guī)范。詳情請參閱測試套件的readme。

rlpdump(RLP轉(zhuǎn)儲)

轉(zhuǎn)儲請參考之前的一篇博文

開發(fā)實用工具,可將二進制RLP(遞歸長度前綴)轉(zhuǎn)儲(以太坊協(xié)議網(wǎng)絡(luò)以及共識使用的數(shù)據(jù)編碼)至用戶友好的分層表示(例如,rlpdump --hex CE0183FFFFFFC4C304050583616263)

swarm

swarm 是一個分布式存儲平臺和內(nèi)容分發(fā)服務(wù)。

swarm守護程序和工具。這是一個swarm網(wǎng)絡(luò)的入口點。通過swarm --help可以查看命令行選項以及子命令。 詳情參見swarm文檔

puppeth

一個CLI(Command Line Interface for batch scripting,命令行界面)的向?qū)С绦?,旨在?chuàng)建一個新的以太坊網(wǎng)絡(luò)。

geth詳解

geth是以太坊最主要的一個客戶端命令行交互接口,由以太坊源碼編譯而成,直接運行在客戶端終端(我們一般都會將geth命令放到PATH里,在任何位置都可以使用該命令)。

geth都可以干嘛呢?下面看一下geth都有什么子命令。

  • account: 賬戶管理
  • attach: 連接到JavaScript交互環(huán)境
  • bug: 打開一個新窗口報告geth庫的bug
  • console: 開啟一個JavaScript交互環(huán)境
  • copydb: 從一個目標蓮數(shù)據(jù)文件夾拷貝到本地的鏈上
  • dump: 從存儲中刪除掉一個指定的區(qū)塊
  • dumpconfig: 顯示配置值
  • export: 導(dǎo)出區(qū)塊鏈到文件
  • import: 從文件導(dǎo)入?yún)^(qū)塊鏈
  • init: 通過一個向?qū)С跏蓟粋€新的創(chuàng)世區(qū)塊(genesis block!)
  • js: 執(zhí)行一個指定的JavaScript文件
  • license: 展示許可信息
  • makecache: 生成ethash校驗緩存(用于測試),ethash是以太坊的計劃性的PoW(工作量證明)算法。
  • makedag: 生成ethash挖礦DAG(用于測試),DAG是一個比特幣的擴容方案
  • monitor: 監(jiān)控使節(jié)點權(quán)值可視化
  • removedb: 除去區(qū)塊鏈和狀態(tài)數(shù)據(jù)庫
  • version: 打印版本號
  • wallet: 管理以太坊預(yù)售錢包

上面提到了一個重要的信息:JavaScript交互環(huán)境。

JavaScript交互環(huán)境

console命令可以進入一個JavaScript交互環(huán)境,也可以使用geth --exec選項加入要執(zhí)行的JavaScript命令在外部執(zhí)行。

這里主要介紹直接進入JavaScript控制臺的操作,在這個控制臺中,你可以使用web3.js的方法通過JSON RPC調(diào)用所有的以太坊API

  • web3.js 是以太坊源碼中提供的一套基于JS的SDK,開發(fā)者可以在終端JavaScript控制臺亦可以在自己的瀏覽器網(wǎng)頁中調(diào)用web3.js,可以執(zhí)行以太坊所有的相關(guān)操作。
  • geth自己的管理API,是在JavaScript控制臺中可以直接使用并且自帶命令提示的一套工具。

注意:管理API實際上只是web3.js的部分成員的外露而已,這些成員包括admin,debug,miner,personal,txpool五個命令,實際上對應(yīng)的就是web3.(admin,debug,miner,personal,txpool)。

JSON-RPC

JSON-RPC是一個無狀態(tài)輕量級的RPC遠程程序調(diào)用協(xié)議。web3.js是通過該協(xié)議直接調(diào)用了源碼的api方法。

由此可知,我們不必太關(guān)心已封裝好的JSON-RPC協(xié)議的內(nèi)容(除非你想了解細節(jié)),在使用geth console的時候:

  • 如果涉及到admin,debug,miner,personal,txpool五個命令,可以查看geth管理API即可。

實際上我們只要看web3.js的文檔就足夠了,因為geth管理API也包含在其中。

除了介紹的這些子命令外,geth命令以及各種子命令都有自己的選項屬性,下面簡介一些geth命令使用的選項組合。

建立在以太坊主網(wǎng)的完整節(jié)點

目前為止,用戶希望通過一種交互手段在以太坊主網(wǎng)上面進行一些操作,例如建立賬戶,轉(zhuǎn)賬,部署與調(diào)用智能合約。對于這些個別的用法,用戶并不在意歷史數(shù)據(jù),所以我們可以快速同步到當(dāng)前網(wǎng)絡(luò)中去,命令如下:

geth --fast --cache=512 console

這條命令可以做以下三件事:

  • --fast: 使用fast模式打開geth的客戶端交互控制臺。fast模式下,只會下載與轉(zhuǎn)賬相關(guān)的區(qū)塊,而不是完全下載所有的區(qū)塊鏈歷史。
  • --cache: 將數(shù)據(jù)庫的內(nèi)存限額調(diào)到512MB,可以顯著增加同步時間,尤其是機械硬盤用戶。這個參數(shù)是可選的,512的值你也可以設(shè)定高一些或者低一些,建議在512MB - 2GB之間。
  • console: 啟動geth內(nèi)置的可交互的JavaScript控制臺,進入該控制臺,你可以調(diào)用所有的web3.js的函數(shù)(它與geth自己的API)。

通過下面的命令你可以隨時加入一個已經(jīng)在運行的geth實例:

geth attach

建立在以太坊測試網(wǎng)絡(luò)的完整節(jié)點

面向開發(fā)者,如果你想試試創(chuàng)建一個以太坊合約,你肯定需要用假的貨幣交易來測試你的代碼,直到你將你的合約真正發(fā)布到以太坊主網(wǎng)上。換句話說,你不會加入以太坊主網(wǎng),而是你想讓你的節(jié)點加入一個測試網(wǎng)絡(luò),這個測試網(wǎng)絡(luò)的環(huán)境與以太坊主網(wǎng)是完全一樣的,只是使用的是假的以太幣。加入測試網(wǎng)絡(luò)的命令如下:

geth --testnet --fast --cache=512 console

參數(shù)fast和cache,子命令console在上面主網(wǎng)絡(luò)都介紹過,這些內(nèi)容在測試網(wǎng)絡(luò)與主網(wǎng)絡(luò)完全一樣。下面仔細研究一下--testnet參數(shù),它會重新配置你的geth實例。

  • 正常主網(wǎng)絡(luò)的會使用默認地址:/.ethereum,而測試網(wǎng)絡(luò)使用的默認地址為:/.ethereum/testnet。

注意這里面在使用geth attach的時候,linux需要改為geth attach

  • 不會連接到以太坊主網(wǎng)絡(luò)上,客戶端將連接到測試網(wǎng)絡(luò),測試網(wǎng)絡(luò)使用的是不同的P2P向?qū)Ч?jié)點,不同的網(wǎng)絡(luò)ID以及不同的genesis狀態(tài)。

源碼api

經(jīng)過查看,源碼的api位置有很多,包括:

  • node/api.go
  • eth/api.go
  • eth/downloader/api.go
  • eth/filters/api.go
  • consensus/clique/api.go
  • contracts/chequebook/api.go
  • internal/debug/api.go
  • whisper/whisperv2/api.go
  • whisper/whisperv5/api.go
  • whisper/whisperv6/api.go
  • swarm/api/api.go
  • internal/ethapi/api.go

通過這些api文件,我們可以找到所有的web3.js(開放了一部分給geth管理API)調(diào)用的相關(guān)方法。

測試環(huán)境

  1. github下載相應(yīng)版本源碼,make all或者僅make geth
  2. 本地找一個位置統(tǒng)一管理本地node(例如我的是work/node/lwbtestnode目錄)
  3. geth --datadir node0(自定義節(jié)點名) account new ,通過這條命令連續(xù)創(chuàng)建兩個node
  4. 本地采用剛剛建好的node進入測試網(wǎng)絡(luò),geth --datadir node0 --testnet --fast --cache=512 console,(注意,當(dāng)你啟動第二個節(jié)點的console的時候,會提示你端口已占用,此時要再加入一個參數(shù)--port 30001指定一個其他的端口號即可)
  5. 現(xiàn)在兩個節(jié)點都在本地以太坊測試環(huán)境啟動了console,讓我們先來查看各自的一些信息并相互添加peer,admin.nodeInfo.enode命令查看當(dāng)前節(jié)點的enode信息,在另一個節(jié)點的console也查出該信息,然后使用admin.addPeer("剛查到的另一個節(jié)點的enode"),然后使用命令net來查看peer數(shù)量,為1即正確。
  6. 然后再查一下當(dāng)前節(jié)點的eth信息,以太幣余額命令為:web3.fromWei(eth.getBalance(eth.accounts[0])),wei是以太幣最小的單位,如果要轉(zhuǎn)換成以太幣,需要使用web3.fromWei函數(shù)來處理。
  7. 經(jīng)過以上操作,兩個新節(jié)點已經(jīng)互為peer,同時他們的余額都是0,下面讓其中一個進行挖礦工作:miner.start(),可以看到隨著挖礦順利進行,另一個console中也在不斷地同步(共識)區(qū)塊消息。
  8. 停止挖礦,查看當(dāng)前節(jié)點的余額,已經(jīng)不再是0了,我這邊是停在了80個以太幣(這個以太幣都是測試用的,不是真的以太幣),另一個節(jié)點由于沒有挖礦余額還是0。
  9. 下面我們來做轉(zhuǎn)賬操作,轉(zhuǎn)賬操作是在余額為80的賬戶里做:
    var sender = eth.accounts[0]
    var receiver = "另一個節(jié)點的eth.accounts[0]"
    var amount = web3.toWei(9,"ether") //轉(zhuǎn)9個以太幣,但是是通過Wei來做
    personal.unlockAccount(eth.accounts[0]) //交易前先將轉(zhuǎn)賬發(fā)送賬戶解鎖
    eth.sendTransaction({from:sender, to:receiver, value:amount})// 正式轉(zhuǎn)賬事務(wù)提交
  1. 此時轉(zhuǎn)賬事務(wù)已提交但未生效,所以我們查看兩個節(jié)點的余額仍未發(fā)生變化。
  2. 下面繼續(xù)挖礦,(注意,挖礦是記賬的機制,但挖礦不完全為了記賬,而記賬必須通過挖礦,所以挖礦是記賬的必要非充分條件)
  3. 當(dāng)前狀態(tài)下,啟動挖礦的第一個區(qū)塊就應(yīng)該包含了我們上面的轉(zhuǎn)賬記錄,所以不必挖礦太久即可停止。我們再看一下當(dāng)前余額為86。

為什么不是80-9=71呢,是因為后來挖礦又產(chǎn)生了新的以太幣報酬,所以余額反而增加了。

  1. 那么如何驗證我們的轉(zhuǎn)賬是否正確呢?我們?nèi)タ戳硪粋€原來余額是0的節(jié)點,檢查當(dāng)前余額為9,說明它作為轉(zhuǎn)賬接收者已成功接到了以太幣。

總結(jié)

本文針對以太坊進行了初步的研究,包括背景概念,環(huán)境搭建,源碼跟蹤,事務(wù)處理等。而關(guān)于挖礦源碼實現(xiàn)、共識算法,p2p網(wǎng)絡(luò)源碼以及發(fā)布自己的web3接口,都是中級篇需要研究的內(nèi)容。

參考資料

  • 文中出現(xiàn)的各種鏈接。

相關(guān)文章和視頻推薦

圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 在各大平臺都長期有優(yōu)質(zhì)免費公開課,歡迎報名收看。

公開課地址:https://ke.qq.com/course/345101

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容