第一行代码:以太坊(1)-创建自己的私有区块链
本文會(huì)利用以太坊客戶端(geth)搭建一個(gè)私有區(qū)塊鏈,并在這個(gè)私有區(qū)塊鏈上挖礦,通過(guò)本文的案例,讀者可以更深入理解區(qū)塊鏈、以太坊、挖礦的理論。
通過(guò)閱讀本文,您可以:
- 掌握搭建以太坊開發(fā)環(huán)境的方法
- 掌握geth的基本使用方法
- 了解如何啟動(dòng)JavaScript控制臺(tái)
- 掌握建立一個(gè)私有區(qū)塊鏈的步驟
- 掌握如何在私有區(qū)塊鏈上挖礦
1. 以太坊(Ethereum)開發(fā)環(huán)境搭建
在玩以太坊之前,首先要搭建以太坊的開發(fā)環(huán)境。第一步就是安裝geth。那么geth是什么呢?geth(或稱為go-ethereum)是以太坊節(jié)點(diǎn)的一個(gè)實(shí)現(xiàn)。也就是說(shuō),geth是一個(gè)客戶端,用于連接以太坊網(wǎng)絡(luò)。從geth的名 字可以看出,geth是用go語(yǔ)言實(shí)現(xiàn)的一個(gè)以太坊節(jié)點(diǎn)。那么為什么需要這個(gè)節(jié)點(diǎn)呢?
這是因?yàn)橐蕴痪W(wǎng)絡(luò)由多個(gè)節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可能是用不同技術(shù)實(shí)現(xiàn)的。如geth就是官方的以太坊節(jié)點(diǎn)。通過(guò)這些節(jié)點(diǎn)可以用命令行方式直接訪問區(qū)塊鏈網(wǎng)絡(luò),如廣播交易,發(fā)布智能合約等,但對(duì)于大多數(shù)用戶來(lái)說(shuō),都是非程序員出身,讓他們通過(guò)命令行方式去操作以太坊網(wǎng)絡(luò)是不可能的,所以就要求有圖形化的操作界面來(lái)操作以太坊網(wǎng)絡(luò)。但geth這樣的節(jié)點(diǎn)是做不到的,因此,就需要像web3.js,web3.py這樣的程序庫(kù),再配合JavaScript、Python實(shí)現(xiàn)可視化的以太坊客戶端,但這些庫(kù)是無(wú)法直接連接進(jìn)以太坊網(wǎng)絡(luò)的,他們只能連接像geth這樣的以太坊節(jié)點(diǎn),然后通過(guò)一塔發(fā)節(jié)點(diǎn)訪問以太坊網(wǎng)絡(luò),所以geth其實(shí)同時(shí)起到客戶端和服務(wù)端的作用。也就是說(shuō),geth是以太坊網(wǎng)絡(luò)的客戶端,是web3.js的服務(wù)端。
安裝geth也非常容易,可以直接到下面的官網(wǎng)下載不同平臺(tái)的geth安裝程序。
https://ethereum.github.io/go-ethereum/downloads
訪問上面的Url,會(huì)看到頁(yè)面上面顯示如下圖所示的下載按鈕。
目前geth的最新版本是1.8.3,支持Linux、Mac OS X和Windows平臺(tái),讀者可以根據(jù)實(shí)際情況下載相應(yīng)平臺(tái)的geth安裝程序,也可以直接下載源代碼(最后一個(gè)按鈕),然后編譯和安裝geth,不過(guò)這種方式只適合于專業(yè)人員,對(duì)于初學(xué)者,并不推薦使用這種方式。
(1)安裝Windows版geth
Windows版安裝程序是一個(gè)exe文件(geth-windows-amd64-1.8.3-329ac18e.exe或類似的文件名),直接雙擊安裝即可。雙擊該文件會(huì)顯示如下圖所示的安裝界面。
單擊“I Agree”按鈕會(huì)顯示如下圖所示的選擇組件界面。
建議讀者將Geth和Development tools都選上,否則在用到相關(guān)工具時(shí)還需要安裝。然后單擊“Next”按鈕進(jìn)入下一個(gè)安裝界面。該界面主要用于指定geth的安裝目錄,默認(rèn)安裝目錄是“C:\Program Files\Geth”,如果讀者不想將geth安裝到這個(gè)目錄,可以修改成其他目錄,如“D:\geth”效果如下圖所示。
接下來(lái)單擊“Install”按鈕開始安裝geth。安裝的過(guò)程會(huì)顯示當(dāng)前安裝進(jìn)度的百分比,直到最后顯示“Completed”,表示已經(jīng)安裝成功,如下圖所示。最后單擊“Close”按鈕關(guān)閉安裝界面。
Windows版的geth其實(shí)就是一些exe文件,如下圖所示。其中g(shù)eth.exe是本書主要使用的工具。
安裝完geth后,最好將geth.exe文件所在的目錄加到PATH環(huán)境變量中,這樣在任何目錄下就都可以使用geth.exe文件。
(2)安裝Mac OS X版geth
Mac OS X版安裝程序是一個(gè)壓縮文件(geth-darwin-amd64-1.8.3-329ac18e.tar.gz或類似的名字),將該壓縮文件解壓,會(huì)發(fā)現(xiàn)只有一個(gè)geth可執(zhí)行文件,如下圖所示。
如果要想下載Mac OS X版的geth相關(guān)工具,可以到圖2-1所示頁(yè)面下方選擇相應(yīng)的操作系統(tǒng),下載Tools壓縮包或安裝程序(點(diǎn)擊Geth&Tools 1.8.3即可下載相應(yīng)操作系統(tǒng)的Tools),如下圖所示。為了使用方便,可以將geth所在的路徑加到/etc/profile文件的PATH變量中,然后執(zhí)行source /etc/profile命令,讓配置立即生效。這樣在任何目錄下都可以使用geth。
在Mac OS X下還可以使用brew命令安裝以太坊開發(fā)環(huán)境。
brew tap ethereum/ethereum brew install ethereum讀者可以選擇自己喜歡的方式在Mac OS X下安裝以太坊開發(fā)環(huán)境。
(3)安裝Linux版geth
Linux版的geth與Mac OS X版的geth差不多,安裝程序同樣是一個(gè)壓縮文件(geth-linux-amd64-1.8.3-329ac18e.tar.gz或類似的文件名),將該壓縮文件復(fù)制到Linux的某個(gè)目錄,然后在Console中進(jìn)入該目錄,執(zhí)行如下的命令對(duì)該文件解壓。
tar zxvf geth-linux-amd64-1.8.3-329ac18e.tar.gz解壓后,仍然只有一個(gè)geth可執(zhí)行文件,這個(gè)可執(zhí)行文件是靜態(tài)編譯的,在任何Linux發(fā)行版上都可以獨(dú)立執(zhí)行。
在Linux下安裝完geth后,最好將geth文件所在的路徑添加到PATH變量中,設(shè)置的方法與Mac OS X類似。
2. 使用geth命令創(chuàng)建以太坊賬戶
安裝完geth,需要測(cè)試一下,可以在控制臺(tái)輸入geth version命令(用于查看geth的版本信息),如果輸出類似下圖所示的信息,表示geth已經(jīng)安裝成功。
在Windows下執(zhí)行g(shù)eth version命令,也會(huì)得到與圖2-9類似的版本信息,只是部分信息稍有差異,如下圖所示。
使用geth的第一步就是創(chuàng)建賬戶。以太坊的賬戶用40位十六進(jìn)制的地址表示,如下面的十六進(jìn)制數(shù)就是一個(gè)標(biāo)準(zhǔn)的以太坊賬戶地址(前面的0x表示十六進(jìn)制)。
0x24924f33a9c49d312a8d885ade76ece76b315982
第一次使用geth時(shí),geth中沒有任何賬戶,所以首先需要使用geth命令創(chuàng)建以太坊賬戶。在創(chuàng)建以太坊賬戶之前,可以使用下面的命令查看以太坊當(dāng)前的賬戶。
geth account list
執(zhí)行上面的命令,會(huì)顯示如下圖所示的信息,很明顯,沒有任何賬戶。
現(xiàn)在使用geth account new命令創(chuàng)建以太坊賬戶,在創(chuàng)建的過(guò)程中要求輸入賬戶的密碼。如果最后輸出了一個(gè)以太坊地址,就說(shuō)明賬戶創(chuàng)建成功了,如下圖所示。該地址就是以太坊賬戶。
可以使用同樣的方法多創(chuàng)建幾個(gè)以太坊賬戶。然后使用geth account list命令查看以太坊當(dāng)前的賬戶,會(huì)得到如下圖所示的查詢結(jié)果。根據(jù)查詢結(jié)果顯示,以太坊當(dāng)前有3個(gè)賬戶。
3. 刪除以太坊賬戶
geth并沒有直接提供刪除以太坊賬戶的命令,不過(guò)可以通過(guò)刪除賬戶本地文件的方式刪除以太坊賬戶(因?yàn)槊恳粋€(gè)以太坊賬戶對(duì)應(yīng)一個(gè)文件)。根據(jù)上圖所示的以太坊賬戶信息,可以得知賬戶文件的存儲(chǔ)路徑如下:
/Users/lining/Library/Ethereum/keystore
進(jìn)入該目錄,會(huì)看到如下圖所示的3個(gè)文件,分別對(duì)應(yīng)上一節(jié)建立的3個(gè)以太坊賬戶。如果要?jiǎng)h除某個(gè)以太坊賬戶,只需要?jiǎng)h除對(duì)應(yīng)的文件即可,然后再次執(zhí)行g(shù)eth account
list命令,會(huì)發(fā)現(xiàn)與文件對(duì)應(yīng)的以太坊賬戶消失了。
在Windows中的操作與Mac OS X相同,只是保存賬戶文件的路徑不同。在Windows下使用同樣的方式創(chuàng)建3個(gè)以太坊賬戶,然后使用geth account list命令列出所有的賬戶,如下圖所示。
從上圖所示的賬戶信息可知,保存賬戶文件的路徑如下:
C:\Users\androidguy\AppData\Roaming\Ethereum\keystore
其中androidguy是Windows用戶名,請(qǐng)將其改成自己機(jī)器的用戶名。
4. geth JavaScript控制臺(tái)
geth可以通過(guò)JavaScript控制臺(tái)和JavaScript代碼訪問以太坊網(wǎng)絡(luò)。只需要執(zhí)行g(shù)eth console命令,就可以啟動(dòng)JavaScript控制臺(tái),在該控制臺(tái)可以直接輸入JavaScript代碼,按Enter鍵會(huì)執(zhí)行輸入的JavaScript代碼,不過(guò)有一個(gè)問題,就是geth命令同時(shí)也負(fù)責(zé)同步區(qū)塊,以及其他工作,這樣會(huì)產(chǎn)生大量的日志信息,這些日志信息會(huì)與JavaScript代碼交替出現(xiàn),非常煩人。效果如下圖所示。
為了不讓日志信息在JavaScript控制臺(tái)輸出,可以使用下面的命令啟動(dòng)JavaScript控制臺(tái),其中2表示日志管道,也就是將日志信息直接輸出到geth.log文件。
geth console 2>>geth.log
執(zhí)行上面的命令,會(huì)進(jìn)入JavaScript控制臺(tái),在控制臺(tái)中,除了輸入的JavaScript代碼和執(zhí)行結(jié)果外,什么都不會(huì)輸出,效果如下圖所示。
在Windows下使用同樣的操作會(huì)得到與Mac OS X下完全一樣的效果,如下圖所示。
JavaScript控制臺(tái)并不是簡(jiǎn)簡(jiǎn)單單用來(lái)執(zhí)行JavaScript代碼的,其實(shí)這個(gè)控制臺(tái)可以通過(guò)web3.js API直接訪問以太坊網(wǎng)絡(luò)。web3.js就是一套API,支持Web和Node.js。可能很多讀者看到這些估計(jì)有些懵,一下拋出這么多概念,又是web3.js,又是Node.js。這些技術(shù)會(huì)在本書后面詳細(xì)介紹,本節(jié)只要知道在JavaScript控制臺(tái)可以使用JavaScript代碼訪問以太坊網(wǎng)絡(luò)就可以了。如果使用geth console命令進(jìn)入JavaScript控制臺(tái),并不需要單獨(dú)安裝web3.js,直接就可以使用web3.js的API。
在JavaScript控制臺(tái)中內(nèi)置了很多JavaScript對(duì)象,其中web3就是其中最重要的對(duì)象。當(dāng)啟動(dòng)JavaScript控制臺(tái)后,這些對(duì)象會(huì)自動(dòng)創(chuàng)建,可以直接使用。例如,可以直接在JavaScript控制臺(tái)中執(zhí)行下面的JavaScript代碼。
str = web3.fromAscii('ethereum') // 將'ethereum'按ASCII轉(zhuǎn)換為十六進(jìn)制數(shù) web3.toDecimal('0xa') // 將十六進(jìn)制數(shù)(0xa)轉(zhuǎn)換為十進(jìn)制數(shù) // 判斷地址是否有效 isAddress = web3.isAddress("0x8888f1f195afa192cfee860698584c030f4c9db1");這些命令執(zhí)行的效果如下圖所示。在Windows中的JavaScript控制臺(tái)也會(huì)得到完全相同的效果。
使用web3.js API的方式有很多,除了在JavaScript控制臺(tái)中使用web3.js API外,至少還可以在下面的環(huán)境中使用web3.js。
? 瀏覽器
? Node.js
? IPython
? Jupyter Notebook
5. 建立私有區(qū)塊鏈與挖礦
本節(jié)會(huì)利用geth命令創(chuàng)建一個(gè)私有區(qū)塊鏈,然后自己挖礦,可以通過(guò)這個(gè)操作過(guò)程更深入理解以太坊和區(qū)塊鏈的概念。
創(chuàng)建私有區(qū)塊鏈的步驟如下:
(1)建立創(chuàng)世塊
區(qū)塊鏈?zhǔn)怯扇舾蓚€(gè)區(qū)塊組成的。在私有鏈啟動(dòng)后,需要為區(qū)塊鏈創(chuàng)建第一個(gè)區(qū)塊(創(chuàng)世塊),相當(dāng)于數(shù)據(jù)結(jié)構(gòu)中鏈表的頭節(jié)點(diǎn)。不過(guò)以太坊并不知道如何創(chuàng)建這個(gè)創(chuàng)世塊,需要我們告訴以太坊如何創(chuàng)建,因此,首先需要建立一個(gè)創(chuàng)世塊的描述文件,這個(gè)描述文件是JSON格式的,本例起名為block.json,代碼如下:
block.json文件
文件位置:src/chapter2/block.json
{"config":{"chainId":15,"homesteadBlock":0 }, "difficulty":"20", "gasLimit":"2100000", "alloc":{ "7df9a875a174b3bc565e6424a0050ebc1b2d1d82":{"balance":"300000"}, "f41c74c9ae680c1aa78f42e5647a62f353b7bdde":{"balance":"400000"} } }一個(gè)完整的區(qū)塊描述文件非常復(fù)雜,本例只對(duì)區(qū)塊進(jìn)行了一些基本設(shè)置,這些設(shè)置項(xiàng)的描述如下:
? chainId:指定了獨(dú)立的區(qū)塊鏈網(wǎng)絡(luò) ID。網(wǎng)絡(luò) ID
在連接到其他節(jié)點(diǎn)的時(shí)候會(huì)用到,以太坊公網(wǎng)的網(wǎng)絡(luò) ID 是 1,為了不與公有鏈網(wǎng)絡(luò)沖突,運(yùn)行私有鏈節(jié)點(diǎn)的時(shí)候要指定自己的網(wǎng)絡(luò) ID。不同 ID 網(wǎng)絡(luò)的節(jié)點(diǎn)無(wú)法相互連接。
? homesteadBlock:以太坊推出的第2個(gè)主要的區(qū)塊發(fā)行版本,Frontier是第1個(gè)推出的區(qū)塊發(fā)行版本(也是測(cè)試版本)。建議使用homesteadBlock,這里的0表示有效。
? difficulty:挖礦的難易程度,該值越小,挖礦越容易。也就是說(shuō),該值越小,挖礦需要的算力越小,在測(cè)試時(shí),建議設(shè)置一個(gè)比較小的值,否則挖礦會(huì)需要很長(zhǎng)時(shí)間。
? gasLimit:挖每個(gè)區(qū)塊需要消耗資源的上限,gas與以太幣(ether)一樣,都是以太坊中的單位。之所以將gas與ether分開,是為了防止ether的波動(dòng)對(duì)挖每個(gè)區(qū)塊消耗資源的影響。
? alloc:為了測(cè)試挖礦,臨時(shí)分配的賬戶,其中balance表示當(dāng)前賬戶的余額,單位是Wei。
(2)初始化區(qū)塊鏈
這一步需要使用如下的命令對(duì)區(qū)塊鏈進(jìn)行初始化。
geth init block.json --datadir test
其中test表示與區(qū)塊鏈相關(guān)數(shù)據(jù)保存的目錄,本例test與block.json文件在同一個(gè)目錄下。執(zhí)行上面的命令后,會(huì)在當(dāng)前block.json文件所在的目錄生成一個(gè)test子目錄。test子目錄的結(jié)構(gòu)如下圖所示。
很明顯,在test目錄下面還有兩個(gè)子目錄:geth和keystore。其中g(shù)eth目錄保存了同步區(qū)塊鏈以及相關(guān)的數(shù)據(jù),keystore目錄保存了賬戶文件。由于私有鏈剛創(chuàng)建,還沒有創(chuàng)建賬戶,所以keystore目錄為空。
如果在Windows下執(zhí)行前面初始化區(qū)塊鏈的命令,會(huì)得到與Mac OS X下完全一樣的結(jié)果。讀者可以自己在Windows做實(shí)驗(yàn)。
(3)啟動(dòng)以太坊客戶端(geth)
在這一步使用下面的命令啟動(dòng)以太坊客戶端(進(jìn)入JavaScript控制臺(tái))。其中datadir命令行參數(shù)表示geth會(huì)使用test目錄保存相關(guān)文件。
geth --datadir test console
(4) 將賬戶與礦工綁定
負(fù)責(zé)挖礦的賬戶稱為礦工。miner是JavaScript控制臺(tái)中內(nèi)置的礦工對(duì)象,在Java可以使用下面的命令將block.json文件中的兩個(gè)地址中的一個(gè)與miner對(duì)象綁定。
miner.setEtherbase("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82")(5)開始挖礦
在開始挖礦之前,可以使用下面的命令查一下兩個(gè)臨時(shí)賬號(hào)的余額。
eth.getBalance("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82") eth.getBalance("0xf41c74c9ae680c1aa78f42e5647a62f353b7bdde")查詢結(jié)果分別是300000和400000。現(xiàn)在礦工(miner)已經(jīng)和余額為300000的賬戶綁定,接下來(lái)在JavaScript控制臺(tái)執(zhí)行如下的代碼開始挖礦。
miner.start()執(zhí)行這行代碼后,就會(huì)開始挖礦,如果要停止挖礦,需要在JavaScript控制臺(tái)執(zhí)行如下的代碼。
miner.stop()停止挖礦后,可以執(zhí)行下面的代碼查詢當(dāng)前區(qū)塊鏈中的區(qū)塊數(shù),其中eth是JavaScript控制臺(tái)內(nèi)建的對(duì)象。在本例中一共挖了36個(gè)區(qū)塊,也就是目前在網(wǎng)絡(luò)中有一條由36個(gè)區(qū)塊組成的區(qū)塊鏈。
eth.blockNumber再次使用下面的代碼查詢兩個(gè)臨時(shí)賬戶的余額。
eth.getBalance("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82") eth.getBalance("0xf41c74c9ae680c1aa78f42e5647a62f353b7bdde")我們會(huì)發(fā)現(xiàn)與礦工(miner)綁定的賬戶的余額變多了,多出的余額就是挖礦的獎(jiǎng)勵(lì)(以太幣),如下圖所示。
在Windows下執(zhí)行同樣的命令會(huì)獲得相同的結(jié)果(挖了30個(gè)區(qū)塊),如下圖所示。
(6)控制挖礦數(shù)量
有時(shí)需要控制挖礦數(shù)量,也就是說(shuō),挖到指定數(shù)量的區(qū)塊后自動(dòng)終止挖礦,要達(dá)到這個(gè)目的,需要在JavaScript控制臺(tái)執(zhí)行下面的命令。
miner.start(3); admin.sleepBlocks(10); miner.stop();其中start方法的參數(shù)表示挖礦使用的線程,默認(rèn)值是CPU內(nèi)核的數(shù)量,如CPU是雙核的,那么線程數(shù)就是2。sleepBlocks方法的參數(shù)表示要挖的區(qū)塊數(shù),本例是10個(gè)區(qū)塊。如果還沒有挖完10個(gè)區(qū)塊,那么sleepBlocks方法會(huì)處于阻塞狀態(tài),直到挖完10個(gè)區(qū)塊,會(huì)繼續(xù)執(zhí)行下面的代碼,也就是miner.stop(),這時(shí)挖礦就會(huì)結(jié)束。
轉(zhuǎn)載于:https://www.cnblogs.com/nokiaguy/p/9697725.html
總結(jié)
以上是生活随笔為你收集整理的第一行代码:以太坊(1)-创建自己的私有区块链的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变速箱维修费用明细?
- 下一篇: 起亚KX32015款为什么熄火后左转弯灯