一、Geth創建私鏈
1.創建一個genesis.json文件
內容如下:
{
"config": {
"chainId": 110,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x07000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
關於JSON文件參數的解釋
參數 |
描述 |
mixhash |
與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設置需要滿足以太坊的黃皮書描述條件 |
nonce |
nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設置需要滿足以太坊的黃皮書描述的條件 |
difficulty |
設置當前區塊的難度,如果難度過大,cpu挖礦就很難,這里設置較小難度 |
alloc |
用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己創建即可以。 |
coinbase |
礦工的賬號,隨便填 |
timestamp |
設置創世塊的時間戳 |
parentHash |
上一個區塊的hash值,因為是創世塊,所以這個值是0 |
extraData |
附加信息,隨便填,可以填你的個性信息 |
gasLimit |
該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和。 |
2.將genesis.json拷貝至任意目錄
創建私有鏈 | geth --datadir .\persondata\ init .\persondata\genesis.json |
登錄私有鏈 | geth --datadir .\persondata\ --networkid 110 console |
init 是初始化創世區塊的,如果已經初始化了,這個命令不需要執行,只需要執行第二條。
datadir是表示當前區塊鏈網絡存儲的位置。
networkId:表示目前私鏈網絡Id,這個ID是唯一標識,需要注意。
如上圖,當執行完以上命令后,會出現兩個目錄:
Geth目錄:用於保存該鏈上geth保存的該鏈上的區塊數據
keystore目錄:保存的該鏈上的用戶信息
二、賬戶操作
創建一個賬戶 | personal.newAccount("123456") ,輸入參數就是密碼,賬戶地址保存在keystore目錄下 。 |
注意:一定要輸入字符串,否則會報錯!
查詢賬戶信息 | personal.listAccounts ,讀取的是本地keystore目錄下的賬戶地址信息 |
三、檢查連接信息和Enode
查看連接狀態 | net.listening ,查看當前連接狀態信息 |
查看對等節點連接數量 | net.peerCount |
查看所連接的私有鏈 | net.version |
查看自己的Enode | admin.nodeInfo ,把自己的Enode暴露出去,可以讓別人添加你的節點,讓別人連入你搭建的私有鏈網絡 |
查看自己連接的節點 | admin.peers ,這個命令可以查看自己連接了那些對端節點,這里僅僅是網絡自發現的節點。 |
添加別人的節點 | admin.addPeer("enode://xxx@ip:port") , admin.nodeInfo可以看字enode信息格式 |
四、挖礦
啟動挖礦 | miner.start(x) ,x是啟動幾個核心來挖礦 |
第一次挖礦的話,時間稍微有點長,如下圖會先生成DAG文件,等DAG文件下載到百分之百后,就會開始挖礦。
停止挖礦 | miner.stop() ,另外一種方法就是直接關掉當前geth的進程 |
查看挖礦賬戶余額 | eth.getBalance(eth.accounts[0]) ,默認的挖礦賬戶是當前賬戶列表中的第一個 |
賬戶中以太幣余額默認以最小單位顯示:1個以太幣=10的18次方個wei,將wei轉為以太幣:
余額轉換 | web3.fromWei(eth.getBalance(eth.accounts[0]),'ether') |
設置挖礦賬戶 | miner.setEtherbase(eth.accounts[1]) ,設置挖礦賬戶 eth.coinbase |
成功挖到一次礦后就停止 | miner.start(1);admin.sleepBlocks(1);miner.stop() |
五、轉賬
在第四步我們已經進行了挖礦,我們在創建一個賬戶就可以進行轉賬了。
從上圖可以看到第一個賬戶通過挖礦獲得了105個以太幣,第二個賬戶沒有以太幣。那么執行轉賬交易。
上圖中在執行過程中首先第一步是解鎖轉賬人賬戶也就是第一個賬戶,然后在發送交易。發送完交易后,可以查看第二個賬戶上並沒有轉過來的5個以太幣,這是為什么呢?因為沒人挖礦,所以這筆交易並沒有計入區塊鏈,當有礦工挖礦計入區塊鏈后,第二個賬戶才真正拿到這筆交易。如下圖,說明這筆交易提交了,但是還在處理中。挖礦后,pending就為0了。
查看轉賬交易 | eth.getTransaction("xxxx"),參數為交易返回hash |
下圖是兩筆轉賬交易,第一筆是提交了,還沒有記入區塊的,第二筆是已經被礦工挖到的,所以塊是有hash的。從下圖參數中可以看到區塊號,可以通過區塊號查看這個塊信息:
查看區塊信息 | eth.getBlock(22) ,入參是區塊號 |
下圖就是一個典型的區塊的數據結構,我們可以看到transactions字段中得知看當前塊記錄了幾筆交易。
六、智能合約的部署和調用
關於轉賬和智能合約的部署以及調用,后期會通過以太坊錢包來操作,這樣可以簡化命令行操作繁雜操作,更好入門。不過命令行操作能夠更好的理解以太坊客戶端運行的流程和部分信息,后期還會在講解以太坊的過程中使用Geth。
七、配置靜態節點
Geth支持一個叫靜態節點的特征,如果你有特定的端點,你會一直想與靜態節點連接。如果斷開連接,靜態節點會再次連接。你可以配置永久性靜態節點,方法是將如下所說的放進/personData/Geth/static-nodes.json(這應該是和chaindata以及keystone在同一個文件夾),下邊的數據是demo。