全網最詳細的Ubuntu挖礦教程
目錄
前言
挖礦
1)安裝geth
(一)二進制安裝
(二)Ubuntu下通過PPA安裝
(三)源代碼安裝
(四)通過docker安裝
2)geth使用的前期準備
(一)創建創始域檔案(用來生成屬于我們自己的私有鏈的檔案)
(二)創建創世區塊(初始化區塊鏈)
(三)啟動私有鏈
3)挖礦指令
(一)查詢錢包串列
(二)創建賬戶
(三)查詢余額
(四)開啟挖礦
(五)停止挖礦
(六)區塊高度
(七)解鎖錢包
(八)發送交易
(九)查詢交易
(十)連接節點
總結
前言
現在流行的技術區塊鏈算一個熱門,我也在學習的路上,寫下博客旨在為了記錄一些自己遇到的問題和解決方法,希望可以多多幫助學習路上的小白,
提到區塊鏈不得不提到位元幣,但是現在熱門的開發就是go語言開發和基于以太坊的開發,我目前在學的是以太坊的一些東西,之前沒有接觸很多,所以也是從無到有的程序,
經過這些天的學習我發現中國對于這塊技術的討論還是相對較少(在遇到問題的時候通過百度很難找出答案,不知道是因為大牛的封閉,還是我們確實缺乏這方面技術的研究),
什么是Dapp?
App我們都知道是客戶端應用,是application的簡稱,再說dapp就是D+app,d是英文單詞decentralization的首字母,單詞翻譯中文是去中心化,即dapp為去中心化應用,主要強調的是一個可以被我們直觀看見的一個頁面這樣子的應用,里面集成了我們的區塊鏈技術(去中心化技術),
接上一篇的文章,上一篇我們是在Windows上實作了Dapp,那么我沒也可以在Linux上實作我們的Dapp投票合約,按理來說后者更加的適合我們的需求和環境,
本文參考基礎:
- 如果想在Windows上搭建Dapp的可以參看上文:手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Remix版本
- 如果在下面的操作遇到問題可以先安裝VMware Tools功能,就可以實作Windows和Ubuntu之間相互復制粘貼了,教程在這邊:VM 安裝VM tools實作VM和Windows之間可以互相復制粘貼
- Uabntu中的vi編譯器的基礎:Ubantu中的Vi編輯器的基本操作命令
看完這篇文章后你會學會:
- 熟悉Linux(Ubuntu)的作業系統
- 會基本的腳本語言
- 安裝環境(solc,web3,Ganache,node)下一篇文章中
- 安裝geth挖礦環境以及挖礦操作
- 熟悉Vi編輯器的使用
話不多說直接開整!


挖礦
1)安裝geth
安裝的代碼有:
(一)二進制安裝
由于官方提供了我們編譯好的二進制檔案,直接下載下來就可以使用,Linux可以講Geth所在的目錄添加到環境變數中,或者直接sudo mv Geth /user/bin
下載地址:https://geth.ethereum.org/downloads/(可以使用翻墻軟體會快一點載入界面)
選擇自己需要的下載就好了:
(二)Ubuntu下通過PPA安裝
//期間需要輸入密碼
1.yeyuheng@yeyuheng-virtual-machine: sudo apt-get install software-properties-common
2.yeyuheng@yeyuheng-virtual-machine: sudo add-apt-repository -y ppa:ethereum/ethereum
3.yeyuheng@yeyuheng-virtual-machine: sudo apt-get update
4.yeyuheng@yeyuheng-virtual-machine: sudo apt-get install ethereum
(三)源代碼安裝
通過golang編譯源代碼:
1.yeyuheng@yeyuheng-virtual-machine: sudo apt-get install -y build-essential golang
2.yeyuheng@yeyuheng-virtual-machine: cd go-ethereum
3.yeyuheng@yeyuheng-virtual-machine: make geth
編譯完成后在目錄build/bin/geth下可以看到編譯好的Geth,
(四)通過docker安裝
Geth不像Hyperledger安裝這么麻煩,不建議docker安裝,如有需要,參考:https://github.com/ethereum/go-ethereum/wiki/Running-in-Docker
我通過的是第二種安裝,有需要的可以自己選擇安裝方法
輸入geth -v 如出現下面的資訊就是安裝成功

安裝成功此刻的心情一定是如此:

2)geth使用的前期準備
通過第一步我們安裝好了geth,下面我們介紹一下真正的開始挖礦我們需要做點什么準備,就像你想寫java代碼編譯你總要有jdk吧
(一).創建創始域檔案(用來生成屬于我們自己的私有鏈的檔案)
首先我們新建一個檔案夾用來存放我們這條鏈的資料(賬號,區塊,報錯資訊)——新建ethereum檔案夾,然后在ethereum檔案夾中創建data檔案夾(存盤區塊資料)和genesis.json檔案,打開genesis.json檔案將創世區塊代碼復制到檔案中并保存
在桌面創建我們需要的檔案夾和初始化檔案(genesis.json)
yeyuheng@yeyuheng-virtual-machine:~$ cd 桌面
yeyuheng@yeyuheng-virtual-machine:~/桌面$ mkdir ethereum
yeyuheng@yeyuheng-virtual-machine:~/桌面$ cd ethereum
yeyuheng@yeyuheng-virtual-machine:~/桌面/ethereum$ mkdir data

通過上面的命令我們創建了ethereum檔案夾和data子檔案夾,我們還缺少一個genesis.json檔案(注意:genesis.json的位置是和data同級的,因為data檔案夾是用存放區塊和鏈的資料的)
//創建genesis.json并編譯
yeyuheng@yeyuheng-virtual-machine:~/桌面/ethereum$ vi genesis.json
上面用的vi其實是Ubuntu中的一個編譯器,操作和Windows上的操作天翻地覆,所以還要學習一下怎么操作我們的Vi編譯器 在前言已經給出,不會的小伙伴可以看看,或者直接點擊鏈接:Ubuntu中的Vi編輯器的基本操作命令
將下面給的代碼復制到vi編譯器然后保存退出就好了,
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00001",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { },
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
引數說明:
| 引數名 | 說明 |
|---|---|
| nonce | nonce就是一個64位亂數,用于挖礦,注意他和mixhash的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件, |
| difficulty | 設定當前區塊的難度,如果難度過大,cpu挖礦就很難,這里設定較小難度(以便后續出礦快) |
| alloc | 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己創建即可以, |
| coinbase | 礦工的賬號,任意填寫一個賬號即可, |
| imestamp | 設定創世塊的時間戳 |
| parentHash | 上一個區塊的hash值,因為是創世塊,所以這個值是0 |
| extraData | 附加資訊,隨便填,可以填你的個性資訊 |
| gasLimit | 該值設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鏈,所以填最大, |
| mixhash | 與nonce配合用于挖礦,由上一個區塊的一部分生成的hash,注意他和nonce的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件,. |
(二).創建創世區塊(初始化區塊鏈)
yeyuheng@yeyuheng-virtual-machine:~/桌面/ethereum$ geth --datadir data init genesis.json

初始化成功后剛剛新建的data檔案夾下就會多出兩個檔案夾(keystroe用來存放創建的賬戶資訊,geth放置的是一些初始化資訊):

到此我們完成了挖礦的前期準備作業,可以順利的進行下一步驟的操作,
(三).啟動私有鏈
代碼:
yeyuheng@yeyuheng-virtual-machine:~/桌面/ethereum$ geth --port 3000 --networkid 15 --datadir="data" --maxpeers=3 --rpc --rpcport 8545 --rpcaddr 127.0.0.1 --rpccorsdomain "*" --rpcapi="db,eth,web3,personal,admin,txpool" console

出現下面代碼說明啟動成功:
Welcome to the Geth JavaScript console!
instance: Geth/v1.9.25-stable-e7872729/linux-amd64/go1.15.6
at block: 0 (Thu Nov 28 2019 17:11:26 GMT+0800 (CST))
datadir: /home/yeyuheng/桌面/ethereum/data
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d
>
到此我們完成了前期的準備作業,可以進行下一步的賬戶創建、余額查詢、轉賬和賬戶交易等操作!
是不是很快樂?學習的樂趣

3)挖礦指令
(一)查詢錢包串列
>eth.accounts

可以看到當前的賬戶為空,因為我們沒有創建,
(二)創建賬戶
法一:
> personal.newAccount("123")

123為密碼,出現的是賬戶的地址:"0x06144f8e61123af6900805d9cfe671c12dcc082f"
法二:
> personal.newAccount()
Passphrase:
Repeat passphrase:

密碼輸兩遍, 出現的是賬戶的地址:"0xf42038dd008c757c0c8b3cc216622b42fbd87bc5"
注意:出現已殺死報錯并且直接退出了console,可以選擇重新進入,如果還是不行選擇重新啟動客戶端解決問題,
剛剛我們將到keystore是存放我們賬戶資訊的,現在我們創建了兩個賬戶,那么keystore檔案下會有什么變化呢?——可以看到出現了兩個賬號,并且檔案的命名是有創建時間,創建的賬號等資訊

再次查詢錢包串列:

第一個創建的錢包地址會自動作為默認錢包,挖礦得到的ETH會存入默認錢包中,查看默認錢包 :
> eth.coinbase
![]()
也可以對其默認賬戶進行修改:
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xf42038dd008c757c0c8b3cc216622b42fbd87bc5"

(三)查詢余額
可以輸入賬戶地址或者是錢包串列序號來查詢余額:
> eth.getBalance("0x06144f8e61123af6900805d9cfe671c12dcc082f")
> eth.getBalance(eth.accounts[0])

還可以查詢默認錢包:
> eth.getBalance(eth.coinbase)
0
![]()
(四)開啟挖礦
挖礦產生的受益會在默認的賬戶中(coinbase)
> miner.start(1)

一直在Looking for Peers說明一直在挖礦(第一次需要耐心等待)

由于時間有限,我用我已經挖到礦的節點來展示下面的操作,
當挖礦成功會出現:


新打開終端,用 geth attach ipc:geth.ipc(需要在同一個檔案下執行)命令連接到js控制臺再查詢默認錢包余額,發現已經有幣了

余額的單位是GWEI,要轉為ETH只要除以10的18次方即可,這里的余額為1613.99ETH
對其轉化成eth
> web3.fromWei(eth.getBalance(eth.coinbase),'ether')

(五)停止挖礦
> miner.stop()
null
回傳null表示停止挖礦成功
(六)區塊高度
區塊高度也叫區塊數量、最新區塊
> eth.blockNumber
808

(七)解鎖錢包
以太坊錢包大概每5分鐘就會被鎖住,交易和創建合約都需要先解鎖,輸入下面的命令和錢包密碼即可解鎖,出現true說明解鎖成功
> personal.unlockAccount(eth.accounts[0])

注意:如果出現了GoError: Error: account unlock with HTTP access is forbidden at web3.js:6347:37(47)就可以用下面的陳述句重新啟動,
geth --networkid 3 --datadir data --identity "mychain" --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3" --port 30303 --rpccorsdomain "*" --nodiscover console 2>>mychain.log --allow-insecure-unlock
(八)發送交易
發送交易前請先解鎖轉出地錢包并啟動挖礦,然后使用eth.sendTransaction命令發送交易,下面的命令將從eth.accounts[0]轉5個ETH到eth.accounts[1],也可以替換成具體的錢包地址:
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x3bffbaef38ce641989b6cd3da88f296b5b861a35
Passphrase:
true
> amount = web3.toWei(5,'ether')
"5000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
"0xf308c404dfcccaec2bef5aaf427ca453f6cca2d9565f4a3cab7e48133e3e5cc4"

回傳的"0xf308c404dfcccaec2bef5aaf427ca453f6cca2d9565f4a3cab7e48133e3e5cc4"就是本次交易的hash地址
查看挖礦終端也會出現相應的顯示,有交易的hash地址,

發送成功將回傳交易哈希,等待挖礦執行交易,再查看余額可以看到已經到賬
之前賬戶的余額:

轉賬完成后的賬戶余額:

(九)查詢交易
> eth.getTransaction("0xf308c404dfcccaec2bef5aaf427ca453f6cca2d9565f4a3cab7e48133e3e5cc4")
{
blockHash: "0x896f29d85a96f9c266feb5d71caa08d33c05e6656a554d9ab6c481c1c721995b",
blockNumber: 809,
from: "0x3bffbaef38ce641989b6cd3da88f296b5b861a35",
gas: 21000,
gasPrice: 1000000000,
hash: "0xf308c404dfcccaec2bef5aaf427ca453f6cca2d9565f4a3cab7e48133e3e5cc4",
input: "0x",
nonce: 5,
r: "0x1ba9225971debf478224ea1db83e993e10ba52fe4890fd559bb79775d6dcaf10",
s: "0x7e4375812e71054d965c02ee6ab6d69c5dff76a20d5a25a2023c847fb3e36183",
to: "0xfb7b36db9eb089576ec58df7f4619a4e3972192c",
transactionIndex: 0,
v: "0x558",
value: 5000000000000000000
}

可以看見我們的賬戶地址沒有問題,是從第一個賬戶到第二個賬戶中的,
(十)連接節點
如果局域網內有多個私有鏈節點,可以將這些節點連接起來組成鏈,這些節點會同步相同的區塊和交易,相當于小型的公鏈,但是要將這些節點連接起來需要滿足3個條件:
- 節點所在的機器,相互之間可以互聯互通網路
- 有相同的創世區塊
- 在啟動私有鏈的geth命令中設定相同的networkid
假設有兩個節點:節點一(Ubuntu端)和節點二(windows端),它們的geth啟動命令中的networkid都是1108,首先要知道節點二的enode資訊,啟動節點二的私有鏈,在js console中執行下面的命令查看enode資訊:
> admin.nodeInfo.enode
"enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@[::]:30304"
復制上面給出的資訊添加到admin.Peer的引數中,注意要把enode中的[::]替換成節點二的IP地址,然后在節點一的js console中執行admin.addPeer(),就可以連接到節點二,
> admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@192.168.1.111:30304")
連接成功后,節點一和節點二就會開始同步的區塊,保證區塊資料一致,使用admin.peers命令可以查看當前網路連接在一起的所有節點
> admin.peers
[{
caps: ["eth/62", "eth/63"],
id: "070b16d058df62a934bb1b9f6e216f6763d63c51011c559d0ad155ae428294c69aed1e35a46c36a6613989941b67b530ab92c7667bd63e7e8a7a5717a266751f",
name: "Geth/v1.8.12-stable/linux-amd64/go1.9.2",
network: {
inbound: true,
localAddress: "172.31.238.175:30303",
remoteAddress: "145.239.0.91:51238",
static: false,
trusted: false
},
protocols: {
eth: {
difficulty: 8.379127609415399e+21,
head: "0x7ce58e50b8bc9af80c6900729801832ec9a5f86e549930e085f1a208dacf5608",
version: 63
}
}
}, {
caps: ["eth/62", "eth/63"],
id: "19211a5d0fbcabf5184e49639839bda772080cba500a4a0e9ced1f89c3a43fea1c00d4d8de5a463d6002bfa594e46e2c03611a6514117f1bd8c7e889bfb4ec7a",
name: "Geth/v1.8.18-unstable-126dfde6/linux-amd64/go1.9.4",
network: {
inbound: true,
localAddress: "172.31.238.175:30303",
remoteAddress: "120.78.87.202:53548",
static: false,
trusted: false
},
protocols: {
eth: {
difficulty: 5.481064970682881e+21,
head: "0xdb982b1ff69083b090549c3809dd6b58f87ca50db97e0b4144aac9269ad198be",
version: 63
}
}
}]
注意:
不同節點間啟動命令:geth --datadir ./data2 --nodiscover console 2--rpc --rpcport 8001 --rpccorsdomain "*" --datadir "./" --port 30306 --rpcapi "db,eth,net,web3" --networkid 999 console 2>>2.log
連接節點參考文章: https://blog.csdn.net/C_jian/article/details/85212512
總結
這篇文章主要是針對在Ubuntu上開發以太坊的的一個記錄,主要是針對自己剛剛學做一個好開端,其實這篇文章是我做了好久才出的,畢竟學習一門新的技術是需要時間的,我也學習了好久,遇到了數不勝數的問題,但是遇到問題千萬不可以放棄自己,所有問題都可以被解決,主要是安裝環境等的操作可能會出錯,其他的都是按部就班就可以實作其功能,
本來是寫的Ubuntu上開發Dapp的,結果寫基礎的時候發現你這篇文章已經很長了,所以把Ubuntu上挖礦這一塊單獨列出來了,以便視覺疲勞,
下一篇《手把手教你一步步開發第一個Dapp(使用solidity語言實作投票合約)——Ubuntu版本》也會馬上的出版,記得關注不迷路,
打個廣告:代做Web畢設(可加區塊鏈),專業團隊值得信任,可以私聊,
好了本篇到此結束:

對了記得:

No pains No results
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/256858.html
標籤:區塊鏈
