可以直接下載程序進行安裝,也可以下載源碼自己進行編譯安裝,本文介紹源碼編譯方式。
源碼編譯
環境需求
- 正確安裝Go語言環境
- 正確安裝GCC:安裝GCC方法
從github下載源碼
go get github.com/ethereum/go-ethereum
編譯
Ubuntu和Mac下編譯
cd go-ethereum
make geth 或者 make all
Windows下編譯
- 按以下目錄結構才能正確編譯,需要下載的包請自行下載
$GOPATH$/src ├── github.com │ └── ethereum │ └── go-ethereum └── golang.org └── x └── net
- 在CMD命令行下,執行以下命令進行編譯:
go install -v github.com/ethereum/go-ethereum/cmd/geth go install -v github.com/ethereum/go-ethereum/cmd/evm
編譯成功,在$GOPATH$/bin下會出現:geth.exe和evm.exe
配置環境變量
將 geth 添加到環境變量中
# ubuntu下
vi ~/.bashrc
# mac下
vi ~/.bash_profile
# 打開配置文件後,把以下內容添加到文件中
export GETH="$GOPATH/src/github.com/ethereum/go-ethereum/build"
export PATH="$PATH:$GETH/bin"
然後執行,使配置生效。
source ~/.bashrc
windows下,直接將bin路徑添加到Path環境變量中
檢查是否安裝成功
geth --help
如果輸出一些幫助提示命令,則說明安裝成功。
搭建私有鏈
啓動私有鏈
1. 創建私有鏈數據存放目錄,例:
# ubuntu和mac
mkdir ~/privatechain
mkdir ~/privatechain/data # data用於存放賬戶和區塊數據
# windows,在D盤建立文件夾privatechain,並在其下建立data文件夾
2. 啓動私有鏈,命令行下進入privatechain目錄,執行:
geth --datadir data --nodiscover console
則進入geth控制檯(交互式的 Javascript 執行環境),默認端口爲8545和30303端口
3. 創建兩個賬戶
personal.newAccount("123456") # 123456爲密碼
# 出現的以下一串字符,則爲創建的賬戶
"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"
4. 查詢賬戶餘額
eth.getBalance(eth.accounts[0])
# 此時會顯示爲 0
創建創世區塊
1. 退出geth的控制檯
exit
1. 在privatechain目錄下,新建gensis.json,內容如下:
{
"alloc": {
"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6": {
"balance": "100000000000000000000000000"
}
},
"config":{
"chainId":10,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x2000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit":"0xffffffff"
}
創世區塊信息寫在一個 JSON 格式的配置文件中
此處我的配置,在"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"中預置了1億的幣
各個參數的含義如下:
- mixhash:與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。
- nonce: nonce就是一個64位隨機數,用於挖礦。
- difficulty: 設置當前區塊的難度,如果難度過大,cpu挖礦就很難,這裏設置較小難度
- alloc: 用來預置賬號以及賬號的以太幣數量,因爲私有鏈挖礦比較容易,所以我們也可以不預置有幣的賬號,需要的時候自己創建即可以。
- coinbase: 礦工的賬號,隨便填
- timestamp: 設置創世塊的時間戳
- parentHash: 上一個區塊的hash值,因爲是創世塊,所以這個值是0
- extraData: 附加信息,隨便填,可以填你的個性信息
- gasLimit: 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和,因爲我們是私有鏈,所以填最大。
- chainId:區塊鏈的ID,公鏈以太坊是1,我們要與其不同,以免衝突
2. 創建創世塊
geth --datadir data init genesis.json
如果出現錯誤提示,可以先刪除原來的創世塊
geth removedb --datadir data
再次執行
geth --datadir data init genesis.json
初始化成功後,會在數據目錄 data 中生成 geth 和 keystore 兩個文件夾,此時目錄結構如下:
privatechain
├── data
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore
└── genesis.json
其中 geth/chaindata
中存放的是區塊數據,keystore
中存放的是賬戶數據。
更多操作
1. 轉賬交易
-
進入geth控制檯
geth --datadir data --networkid 10 console
指定網絡id(networkid)爲上面設置的10
- 解鎖賬戶
# 123456爲密碼 personal.unlockAccount(eth.accounts[0],"123456")
- 發送交易
amount = web3.toWei(10,'ether') eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
此時查詢賬戶餘額沒發生變化,需要進行挖礦確認打包交易
2. 啓動&停止挖礦
通過 miner.start()
啓動挖礦
> miner.start(3)
其中 start 的參數表示挖礦使用的線程數。第一次啓動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢,等進度達到 100% 後,就會開始挖礦,此時屏幕會被挖礦信息刷屏。
停止挖礦,在 console 中輸入:
miner.stop()
挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,默認情況下coinbase是本地賬戶中的第一個賬戶:
> eth.coinbase
"0xfb9cc019fc650a1699d05b7fb564b83c3a72b64d"
可以通過 miner.setEtherbase()
將其他賬戶設置成 coinbase
即可
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xc6b5702b15a3794374e28f41f36e1e8dbdd564df"
重新啓動挖礦,查看 eth.accounts[1]
是否可以獲得以太幣
> miner.start(3)
//等待幾秒後
> miner.stop()
查詢賬戶餘額:
> eth.getBalance(eth.accounts[0])
280000000000000000000 # wei
> eth.getBalance(eth.accounts[1])
210000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') # wei換算成ether
210
發現賬戶0 和 賬號1 都有以太幣,說明 miner.setEtherbase()
設置成功。
getBalance()
返回值的單位是wei,wei是以太幣的最小單位,1個以太幣=10的18次方個wei。要查看有多少個以太幣,可以用web3.fromWei()將返回值換算成以太幣:
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
280
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
210
3. 查看交易信息
查看當前區塊總數:
eth.blockNumber
通過區塊號查看區塊:
eth.getBlock(6)
通過交易hash(hash 值包含在上面交易返回值中)查看交易:
eth.getTransaction("0x493e8aa2bcb6b2a362bdbd86b2c454279e14beea43b444aeb45c7f667bf572e2")
4. 控制檯操作命令介紹
控制檯內置了一些用來操作以太坊的 Javascript 對象,可以直接使用這些對象。這些對象主要包括:
- eth:包含一些跟操作區塊鏈相關的方法;
- net:包含一些查看p2p網絡狀態的方法;
- admin:包含一些與管理節點相關的方法;
- miner:包含啓動&停止挖礦的一些方法;
- personal:主要包含一些管理賬戶的方法;
- txpool:包含一些查看交易內存池的方法;
- web3:包含了以上對象,還包含一些單位換算的方法。
常用命令有:
- personal.newAccount():創建賬戶;
- personal.unlockAccount():解鎖賬戶;
- eth.accounts:枚舉系統中的賬戶;
- eth.getBalance():查看賬戶餘額,返回值的單位是 Wei(Wei 是以太坊中最小貨幣面額單位,類似比特幣中的聰,1 ether = 10^18 Wei);
- eth.blockNumber:列出區塊總數;
- eth.getTransaction():獲取交易;
- eth.getBlock():獲取區塊;
- miner.start():開始挖礦;
- miner.stop():停止挖礦;
- eth.coinbase:挖礦獎勵的賬戶
- web3.fromWei():Wei 換算成以太幣;
- web3.toWei():以太幣換算成 Wei;
- txpool.status:交易池中的狀態;
- admin.addPeer():連接到其他節點;
多節點運行
- 按同樣的方法在另一臺電腦上重新啓動一個節點,注意:genesis.json的內容必須完全相同
-
獲取第一個節點的enode信息
admin.nodeInfo.enode
結果如下:
"enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@[::]:30303?discport=0"
-
在第二個節點中執行添加第一個節點的操作
admin.addPeer("enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@192.168.137.1:30303")
注意:enode信息中的[::]替換成第一個節點的ip,問號及後面部分不需要
- 查看連接的節點
// 查看連接的節點數量,此處爲1 net.peerCount // 查看連接的節點信息 admin.peers
結果如下:
[{
caps: ["eth/63"],
id: "352c2a755ea629dba803dda4e8e2708fca746838b2c91ea329713fd2c2ccbc0d1dd34fe905c1157fafb775383cf6f4f21e94a4b2533a8282806dd4fda81a5bd7",
name: "Geth/v1.8.10-unstable-998f6564/darwin-amd64/go1.10.2",
network: {
inbound: true,
localAddress: "192.168.137.1:30303",
remoteAddress: "192.168.137.16:53022",
static: false,
trusted: false
},
protocols: {
eth: {
difficulty: 131072,
head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
version: 63
}
}
}]
此時,節點1和節點2都可以進行挖礦,並且只要有一個節點在進行挖礦,其他節點的交易也都能正常進行。在節點1可以查詢節點2中賬戶的餘額,也可以在不同節點之間進行轉賬。