前言
本文使用系統:centos7。
以太坊客戶端:geth
安裝
下載geth:
官方下載地址:https://geth.ethereum.org/downloads
直接下載:
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.6-bd059680.tar.gz
解壓
tar zxvf geth-linux-amd64-1.9.6-bd059680.tar.gz cd geth-linux-amd64-1.9.6-bd059680
移動
mv geth /usr/bin/
創建一個目錄用來存放區塊數據
mkdir /ethereum
常規配置
監聽端口
--port 30303 geth網絡監聽端口 默認30303
設置區塊目錄
--datadir '/ethereum' --datadir選項指定在哪里存儲區塊數據 沒有提供則默認為家目錄下的.ethereum目錄。
指定網絡
--networkid 1
--networkid指定網絡ID 1代表主網絡 2代表測試網絡 沒有提供則默認測試網絡,亂寫代表創建私有鏈
同步方式
--syncmode 'fast' --cache 1024 fast意為快速同步(同步區塊有full、fast、light三種模式,推薦fast,同步完成后geth會自動切換到full同步) --cache分配到內部緩存的內存,單位MB,1024即為1G。
RPC配置
--rpc 啟用HTTP-RPC服務 --rpcaddr '0.0.0.0' HTTP-RPC服務白名單 默認localhost --rpcport 8545 HTTP-RPC服務監聽端口 默認8545 --rpcapi 'db,eth,net,web3' 這個命令決定允許什么API能夠通過PRC進入,默認情況下geth會激活IPC上所有API以及PRC的db,eth,net,web3API。 --rpccorsdomain '*' 跨域,多個域名可用逗號分割。
搭建主鏈節點
星火節點
由於國內以太坊節點非常稀少,並且國內外網絡不通暢等原因導致國內服務器同步區塊數據非常緩慢還容易丟包,由EthFans發起的星火節點計划可以幫助我們加快同步速度。
下載節點列表:https://upyun-assets.ethfans.org/uploads/doc/file/b0c5266be42f43f1baf7207c432bede6.json?_upd=static-nodes.json
下載后將static-nodes.json文件放在區塊存儲目錄下即可。
生成配置文件
geth --datadir '/ethereum' --networkid 1 --syncmode fast --cache 1024 --rpc --rpcaddr '0.0.0.0' --rpcport 8545 --rpcapi 'db,eth,net,web3' --rpccorsdomain '*' dumpconfig > /ethereum/geth_config
后台啟動
nohup geth --config /ethereum/geth_config >> /var/log/geth.log 2>&1 &
監控區塊同步日志
tail -f /var/log/geth.log
我是4核8G帶寬10M的服務器同步了兩天半,占用硬盤190G。
當你看到日志里無窮無盡的 Imported state entries ...,不要急,你還需要繼續等待。。。
搭建私鏈環境
創世區塊
先創建幾個賬戶
geth --datadir /ethereum account new
創世區塊文件
vim /ethereum/genesis.json
內容如下:
{ "config": { "chainId": 100, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x1388", "difficulty": "0x1", "alloc": { "0xDFeDb94Ab496d6b68795dB890AcbbBdc2557860A": { "balance": "100000000000000000000000000000000" } } }
其中的 alloc 屬性是給賬戶分配余額 。切記,余額是以wei為單位的,就是balance值要除以10的18次方才等於eth的數量。
初始化創世區塊
geth --datadir /ethereum init /ethereum/genesis.json
生成配置文件
geth --datadir '/ethereum' --networkid 100 --cache 512 --rpc --rpcaddr '0.0.0.0' --rpcport 8545 --rpcapi 'db,eth,net,web3,personal' --rpccorsdomain '*' --allow-insecure-unlock dumpconfig > /ethereum/geth_config
后台啟動
nohup geth --config /ethereum/geth_config >> /var/log/geth.log 2>&1 &
JavaScript控制台
進入控制台
geth console --config /ethereum/geth_config 2>> /var/log/geth.log
如果你后台啟動了geth則不能進入,它會提示你端口已占用,這時候可以使用鏈接節點的方式進入:
geth attach /ethereum/geth.ipc
此時進入了控制台環境(退出控制台使用exit;)
查看當前同步情況
eth.syncing
如果返回的是false,證明同步完成了,可以使用當前節點。
否則會返回同步狀態
currentBlock為當前下載到的區塊高度,請注意,下載塊不等於同步數據了,下載塊是一個簡單快速的過程,只驗證相關的工作量證明,在下載塊的同時geth也在一直下載所有的區塊數據,當數據下載完成后屆時才會處理曾經發生過的所有交易,重新組裝整個鏈。
查詢區塊高度
eth.blockNumber
fast方式有個特點,在完全完成同步之前,geth無法提供有關區塊或或賬戶信息,所以會返回0。
查詢某個區塊的信息
eth.getBlock(39)
創建賬戶
personal.newAccount()
列出本地賬戶
eth.accounts
查余額
eth.getBalance('0xca3ac4f946b997db24515a7ae7779f2e587d5a26')
查到的余額除以18位小數就是真實的余額數字
我個人喜歡這么查
web3.fromWei(eth.getBalance('0x317188e4a00de2f689aEb79E9b7565DabEd360dB'), "ether");
解鎖賬戶
轉賬之前必須解鎖賬戶
personal.unlockAccount('0x317188e4a00de2f689aEb79E9b7565DabEd360dB','123456')
如果你解鎖出現這個錯
(anonymous): Line 1:24 Unexpected token ILLEGAL (and 3 more errors)
檢查一下,字符串改成用單引號試試,別用雙引號,這個是巨坑。
如果你解鎖出現這個錯
Error: account unlock with HTTP access is forbidden
那么在啟動項中添加參數 --allow-insecure-unlock
轉賬
personal.sendTransaction({from: '0xfbe8bfaef37e49a278fbe760b9517ebbbec20eb8', to: '0x68d41149e5bbe35f3fe49cdb47474bf2e2ac5a55', value: web3.toWei(1,'ether')},'123456')
注意:燃費最少是21000,這個值必須要比eth.getBlock(最新塊) 中的gasLimit值要小,否則會報燃費太低或太高錯誤,也就是說,正常情況下,最新區塊的gasLimit值必須要大於21000才會轉賬成功,否則就繼續挖礦等待。
根據hash查詢交易詳情
eth.getTransaction('0xd7f78761ddd26468700d21cefb431cda19a03d3fe11e8b1b5af6c1df2470e5fb')
挖礦
設置挖礦賬戶
miner.setEtherbase('0x317188e4a00de2f689aEb79E9b7565DabEd360dB')
挖礦所得費用會自動進入該賬戶余額
開始挖礦
miner.start()
結束挖礦
miner.stop()
查看是否在挖礦
eth.mining
API調用
各編程語言現成類庫
Java:https://github.com/web3j/web3j
Python:https://github.com/ethereum/web3.py
PHP:https://github.com/sc0Vu/web3.php
NodeJs:https://github.com/ethereum/web3.js