Step 1: 建立目錄和genesis.json
-
在命令行模式創建一個目錄,例如tmpPrivate
創建文件genesis.json, 並填入如下內容。
{ "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x80000000", "difficulty": "0x1", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": { }}
Atom 官網地址: https://atom.io/
創建完成後,在Atom中,本文件夾下應該只有一個genesis.json
Step 2: 執行命令,創建創世區塊
切換回命令行,執行命令,製造創世區塊
geth --datadir "./" init genesis.json
執行結果如下:
這時候可以注意一下,此時當前目錄下面會新增出兩個文件夾geth和keystore
geth中保存的是區塊鏈的相關數據
keystore中保存的是該鏈條中的用戶信息
此時從Atom中看到的目錄結構是這樣的:
Step 3:創建自己的私有鏈條
執行一條最簡單的geth命令,來創建自己的私有鏈條
geth --datadir "./" --nodiscover console 2>>geth.log
geth的參數項目很多,有興趣的可以打geth –help 來獲得詳細信息,我們也會在之後的章節中對關鍵參數項進行說明。
此時的命令行應該是這樣的:
Step 4:在自己的私有鏈條上創建用戶
輸入命令
eth.accounts
, 我們會發現返回值為[]
這是因為此時雖然以太坊的私有鏈已經被創造出來,但還沒有任何賬戶。
輸入命令
personal.newAccount("xxx")
, 該命令將創造一個新的用戶,該用戶的密碼是xxx
. 當然用戶也可以將xxx
改為123,或者123456,或者任意密碼再次輸入命令
eth.accounts
, 我們會發現一個新的用戶被創建了出來,這就代表我們已經創建了一個賬戶,重複personal.newAccount()
ð.accounts
我們可以創建若干個賬戶出來
整個命令截圖如下:
Step 5: 輸出區塊鏈的Log
在Step 3中,我們執行的代碼
geth --datadir "./" --nodiscover console 2>>geth.log
其中的代碼
console 2>> geth.log
代表將控制檯的一部分輸出,輸出到文件geth.log上去。打開另一個終端,找到geth.log的所在目錄,執行命令
tail -f geth.log
從而持續的輸出以太坊的日誌
整個過程如下圖所示:
Step 6: 最重要的一步來了,開始挖礦!
在命令行中執行命令
miner.start()
, 開始在我們的區塊鏈上進行挖礦
此時Geth.log的輸出應該是這樣的
一直等到100%。這個以太坊私有鏈就會正式啟動,並持續不斷的生成出以太坊來。
注意點:
1. 挖礦挖到的ether幣會默認保在第一個賬戶中,即eth.acccounts[0]中。
2. 挖礦是執行智能合約的基礎。如果停止挖礦的話,不僅以太幣會停止生成,所有智能合約的調用也會不起作用。
3. 如果真的要停止挖礦,可以執行命令miner.stop()
來停止挖礦
4. 按上面的命令,應該是可以實現以太坊挖礦的。如果不行的話,有可能就是之前有存在的鏈,此時應該刪除之前的數據。在Mac下即刪除~/.ethash
文件夾和裡面的文件即可
Step 7: 最終當挖礦啟動的時候的日誌是這樣的
Step 8: 挖礦啟動後,查看主賬戶的以太幣數量
acc0 = eth.accounts[0]eth.getBalance(acc0)
結果只要不為0,那就說明挖礦成功!
geth --datadir "./" --nodiscover console 2>>geth.log
進入命令行模式,其中參數
–datadir 代表文件夾地址,
–nodiscover 代表該鏈條不希望被其他節點發現,
console >> geth.log 代表將控制檯輸出到文件geth.log中去
當然從命令行模式退出,也很簡單,只要打入exit, 即可退出
Geth命令行中的Eth.accounts
我們在命令行輸入 eth.accounts
可以看到當前該區塊鏈中共有幾個賬號,以及每個賬號的公鑰地址。
這裡就要說到以太坊的賬戶體系了,
在以太坊系統中,狀態是由被稱為“賬戶”(每個賬戶由一個20字節的地址)的對象和在兩個賬戶之間轉移價值和信息的狀態轉換構成的。以太坊的賬戶包含四個部分:
隨機數,用於確定每筆交易只能被處理一次的計數器
賬戶目前的以太幣餘額
賬戶的合約代碼,如果有的話
賬戶的存儲(默認為空)
簡單地說,每一個以太坊賬戶都有一對公鑰和私鑰組成。
公鑰我們可以理解為就是賬戶地址,任何其他賬戶都可以訪問該地址
私鑰可以理解為一段加密過的密碼,這一對公鑰和私鑰共同組成一個唯一標示的以太坊賬戶。
例如在上節我們建立的第一個以太坊賬戶 eth.accounts[0] 中,地址 0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
就是公鑰,而對密碼加密而成的,就是私鑰。
如何新增賬戶
我們可以輸入命令 personal.newAccount("123")
來新建一個賬戶,(注意123可以修改為任何別的密碼)
這個時候我們可以看到除了第一個賬戶0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
之外,還新增了另一個賬戶0xb8b12a801b610176935a15321f77b48dd5c0c448
, 此時輸入eth.accounts, 就可以很輕鬆的看到有兩個賬戶的公鑰地址。
如何獲取賬戶的以太幣餘額
在上一章中我們說過,當以太坊的私鏈在挖礦時候,所挖到的以太幣都會存入第一個以太坊賬戶中,即eth.accounts[0] 中,而eth.accounts[1]默認是不會有以太幣的。這個時候我們可以用下面的命令來查看eth.accounts[0] 中的以太幣餘額。
eth.getBalance("0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f")eth.getBalance("0xb8b12a801b610176935a15321f77b48dd5c0c448")
其中
0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
是第一個賬戶的地址,0xb8b12a801b610176935a15321f77b48dd5c0c448
是第二個賬戶的地址 結果如下:
從上我們可以看得很清楚,挖礦得來的以太幣都進了第一個賬戶,同時每個賬戶的公鑰是該賬戶的核心。通過公鑰我麼可以對該賬戶的以太幣進行增刪改查各種操作
如何在兩個賬戶之間進行以太幣轉換
前面說過每個賬戶的公鑰(地址)是一切以太坊賬戶操作的核心,但地址字符串太長,我們用acc0/acc1 分別代表accounts[0]和[1],另外設置要轉移0.01個以太幣
> acc0 = eth.accounts[0]"0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f"> acc1 = eth.accounts[1]"0xb8b12a801b610176935a15321f77b48dd5c0c448"> amount = web3.toWei(0.01)"10000000000000000"
這個時候我們可以使用eth.sendTransaction來將0.01個以太幣從acc0轉移到acc1中。
> eth.sendTransaction({from: acc0, to: acc1, value: amount})
結果如下:
這個是以太坊的一個保護機制,每隔一段時間賬戶就會自動鎖定,這個時候任何以太幣在賬戶之間的轉換都會被拒絕,除非把該賬戶解鎖.
這個時候我們就需要執行 personal.unlockAccount(acc0)
並輸入密碼來解鎖acc0才可。
> personal.unlockAccount(acc0)Unlock account 0xbcf5b841303bc08026ce2d3b8f83498ffe42c12fPassphrase:true>
這個時候我們重新執行命令eth.sendTransaction({from: acc0, to: acc1, value: amount})
, 結果如下:
> eth.sendTransaction({from: acc0, to: acc1, value: amount})"0xeea74dd5ff3f1287614d52ebb674edb93e8c5e51e4296835044d3d858d3d9f10"> eth.getBalance(acc1)10000000000000000>
我們可以看到這個時候acc1有了數值10000000000000000
, 而不再是之前的0了。但我們明明要給0.01ether幣的,為何數值會如此大呢? 其實是對的,我們只要輸入命令web3.fromWei(10000000000000000,"ether")
就可以知道了。
> web3.fromWei(10000000000000000,"ether")"0.01"
閱讀更多 青峰科技 的文章