第一步:相關軟件的安裝
- go-ethereum客戶端安裝
- Go-ethereum客戶端通常被稱為Geth,它是個命令行界面,執行在Go上實現的完整以太坊節點。Geth得益于Go語言的多平臺特性,支持在多個平臺上使用(比如Windows、Linux、Mac)。Geth是以太坊協議的具體落地實現,通過Geth,你可以實現以太坊的各種功能,如賬戶的新建編輯刪除,開啟挖礦,ether幣的轉移,智能合約的部署和執行等等。
Geth可以使用下面三種JSON RPC協議進行連接:
- 內部進程通信(IPC):內部通訊,通常用于一臺電腦內。
- 遠程程序調用(RCP):跨計算機的通訊。通常使用TCP和HTTP協議。
- WS(Web sockets):使用sockets連接Geth。
chain ID含義:
- chain ID:1 主網公鏈
- chain ID:2 Morden網絡(僅對部分人開放)
- chain ID:3 Ropsten網絡
- chain ID:4 Rinkeby網絡
- chain ID 大于4的是私有網絡
- 使用Geth --testnet連接到Ropsten網絡,Geth --rinkeby連接到Rinkeby網絡。
安裝:
brew tap ethereum/ethereum
brew install ethereum
- 也可以使用源碼安裝的方式
- 以太坊github地址
- 首先從github上下載以太坊的go-ethereum壓縮包,zip,或者單純使用命令行代碼,代碼如下
git clone https://github.com/ethereum/go-ethereum.git
- ?如果是zip格式的需要解壓再執行命令,如果使用命令行,直接執行命令
cd go-ethereum
make geth
如果有問題?
- cd到以太坊到目錄里面后,make geth出現錯誤,vi env.sh 查看文件屬性,按下esc,同時按shift和:,輸入冒號之后,輸入set ff,顯示文件的編碼格式,如果是dos,則是支持windows的,不支持linux
- 需要將其改為支持linux的系統格式,輸入set ff=unix,保存退出
- 再次運行,make geth
默認安裝地址
/usr/local/Cellar/ethereum/版本
我的顯示界面
- 檢查是否安裝成功,輸入如下的命令
geth --help
- ?出現如下的界面,即為安裝成功
- 使用命令查看 版本號以及相關信息
geth version
?
第二步:搭建私有鏈
- 以太坊支持自定義創世區塊,要運行私有鏈,我們就需要定義自己的創世區塊,創世區塊信息寫在一個json格式的配置文件中。首先將下面的內容保存到一個json文件中,一般以genesis.json進行命名。
- 前提操作命令如下
mkdir myeth
cd myeth
vi genesis.json
- json文件內容如下:直接復制即可。
{"config": {"chainId": 666999, "homesteadBlock": 0,"eip150Block": 0,"eip155Block": 0,"eip158Block": 0},"alloc" : {},"coinbase" : "0x0000000000000000000000000000000000000000","difficulty" : "0x20000","extraData" : "","gasLimit" : "0x2fefd8","nonce" : "0x0000000000000042","mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp" : "0x00"
}
-
對于上面參數的解釋
- 注意事項,我參考好多文章都缺失eip150Block:0這一句,這會出現錯誤。
- 報錯情況為Failed to wirte genesis block:unsupported ordering
網絡初始化
- 輸入geth init命令、genesis.json文件、存儲區塊數據和keystore的文件夾,進行初始化。
geth init "/Users/chy/Desktop/myeth/genesis.json" --datadir "/Users/chy/Desktop/myeth/chaindata"
- 創世區塊已經產生了,Geth節點可以啟動了。Geth啟動時默認使用IPC協議,為了確保Geth節點可以通過PRC協議訪問,命令中需要帶上RPC參數?
- 命令操作如下
?搭建節點運行的環境
geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 666999 –allow-insecure-unlock
- 對于命令的講解
- –datadir:指定區塊鏈數據的存儲位置;這個需要大家根據實際的情況進行調整,進行自己路徑的替換
- –rpc:表示開啟 HTTP-RPC 服務;
- –rpcapi “eth,web3,miner,admin,personal,net” :這個命令指示了允許通過RPC訪問的命令。默認情況下,Geth允許web3。
- –nodiscover:關閉節點發現機制,防止加入有同樣初始配置的陌生節點;
- –identity:指定節點 ID,方便在一大群節點中識別出自己的節點;
- –rpcport:指定 HTTP-RPC 服務監聽端口號(默認為 8545);
- –rpcaddr:指定IP地址;
- –port:指定和其他節點連接所用的端口號(默認為 30303);
- –maxpeers 0 如果你不想有人連上你的測試鏈,就用maxpeers 0。或者,你可以調整參數,當你確切的知道有幾個節點要連接上來的時候。
- 使用不使用命令–allow-insecure-unlock在解鎖的時候就會報錯Error: account unlock with HTTP access is forbidden,原來是出于安全考慮,默認禁止了HTTP通道解鎖賬戶,相關問題參考
- 執行完上面的命令又發現報錯Fatal: Error starting protocol stack: datadir already used by another process這個問題是因為,需要強制關閉正在運行的geth進程。?命令如下:54148為geth進程的ID號
-
再次加上參數–allow-insecure-unlock,重新啟動私有鏈。現在執行解鎖賬戶命令即可成功了。
-
geth相關命令
geth --datadir "/Users/chy/Desktop/myeth/chaindata" --rpc --rpcapi "eth,web3,miner,admin,personal,net" --rpccorsdomain "*" --nodiscover --networkid 666999 --allow-insecure-unlock
ps aux | grep "geth"
kill -9 54148
-
enode的信息是節點在網絡上的身份標志。如果其他節點準備加入這個網絡中,就需要提供自己的enode值。RPC訪問可以通過http://127.0.0.1:8545或http://localhost:8545,IPC訪問可以通過**\.\pipe\geth.ipc**命令。命令是以服務的形式持續運行的,需要再打開一個命令行窗口,但是原先的窗口不可以關閉。輸入命令如下:
geth attach rpc:http://localhost:8545
- 也可以在啟動的時候,加入console,啟動一個端口(簡單的例子)
- 或者是第二次啟動時候,輸入如下命令
- 注意,這里 . 代表當前的文件夾,也就是上文指定的"/Users/chy/Desktop/myeth/chaindata",否則相關命令無法操作,雖然不報錯,但是得不到預期的結果。
geth --datadir . --networkid 666999 console
- 可以將輸出的Info信息重定向到 output.log?文件里面,2是指Linux里面的shell,output.log會存儲到當前的文件夾
geth --datadir . --networkid 666999 console 2>output.log
- 使用命令,如下所示,時時跟蹤輸出日志的變化?
tail -f output.log
- 注意:如果gath的版本較低,那么重新啟動區塊鏈的時候,數據丟失?
- 出現如下頁面,進入控制頁面。使用IPC協議連接到節點上,這樣即可執行其他命令。
交互式執行環境
- 這是一個交互式的 JavaScript 執行環境,在這里面可以執行 JavaScript 代碼,其中 > 是命令提示符。在這個環境里也內置了一些用來操作以太坊的 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():停止挖礦;
- web3.fromWei():Wei 換算成以太幣;
- web3.toWei():以太幣換算成 Wei;
- txpool.status:交易池中的狀態;
- admin.addPeer():連接到其他節點;
第三步:設置賬戶
- 連接到Geth節點后,接下來需要設置coinbase或etherbase賬戶。創建賬戶可以使用personal對象的newAccout方法,并設置密碼(密碼不可見)。命令如下。
personal.newAccount()
- 如果需要更改原有的coinbase賬戶地址,可以通過address.miner對象的setEtherBase函數進行操作。這個操作將使用新的賬戶替換原有的coinbase賬戶。命令如下
miner.setEtherbase("0x19b4029dad20824db6dc201437f9cac2a7e1fc5c")
- 執行查詢命令,可看到設置的地址已經生效了。此時挖礦可以啟動了。由于只有一個礦工,將獲得全部的挖礦獎勵,coinbase賬戶的以太幣會逐步增加。
eth.coinbase
- 同樣方法再創建一個賬戶
- 查看當前的用戶
eth.accounts
- 代碼執行如下
第四步:開始挖礦
- start中的參數代表了用于挖礦的線程數量。命令如下
miner.start(8)
-
這時切換到之前創建私有鏈的命令行窗口中,可以看到挖礦過程的輸出結果。這里是指我們當時創建的第一個窗口。
-
如果是第一次挖礦,需要生成DAG相關文件,這個需要花費一定的時間。第二次以后就不需要了。
- 因為我是第二次挖礦,所以沒有上面文件。
- 當使用輸入日志的方式時,可以輸入命令tail -f geth.log 來跟蹤挖礦進度
- 查看正在挖礦的賬戶0已經獲得的以太幣和未挖礦的賬戶1的以太幣余額。查看錢包的余額命令如下,將0改為1即可查看第二個賬戶的余額。
eth.getBalance(eth.accounts[0])
- 執行情況如下:
?
-
挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,默認情況下coinbase是本地賬戶中的第一個賬戶。
-
getBalance()返回值的單位是wei,wei是以太幣的最小單位,1個以太幣=10的18次方個wei。要查看有多少個以太幣,可以用web3.fromWei()將返回值換算成以太幣
-
停止挖礦,命令如下
miner.stop()
- 整體操作布局,左邊動態監視用戶的輸入,右邊窗口為以太坊 Javascript Console。頁面布局如下
第五步:進行交易
- 我們要從賬戶0到賬戶1轉賬,需要先解鎖賬戶才能轉賬,否則會報錯。
- 解鎖命令如下
personal.unlockAccount(eth.accounts[0])
-
發起交易,由賬戶0轉賬200以太幣到賬戶1,命令如下
personal.unlockAccount(eth.accounts[0])
amount = web3.toWei(200,'ether')
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
- 此時交易已經提交到區塊鏈,返回了交易的hash,但還未被處理,本地交易池中有一個待確認的交易,可以使用 eth.getBlock(“pending”, true).transactions 查看當前待確認交易。
eth.getBlock("pending", true).transactions
-
要使交易被處理,必須要挖礦。這里我們啟動挖礦,然后等待挖到一個區塊之后就停止挖礦。命令如下:
miner.start(1);admin.sleepBlocks(1);miner.stop();
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
-
此時,交易已經生效,賬戶1應該已經收到了200個以太幣了。
參考文檔
給自己的小提示
- account[0]的密碼是123456