區塊鏈學習之3Windows平臺下以太坊私有鏈搭建及錢包部署和執行
在Windows下的安裝,是按著老師下發的安裝教程做的。由於前面有在Ubuntu搭建的經驗,所以感覺步驟大致相同,而且感覺Windows的簡單一些。
一、理論知識
1.區塊鏈中私鑰、公鑰和比特幣地址三者的關係
1.使用者首先會得到一個私鑰,私鑰是由程式呼叫作業系統自帶的一個演算法模組,在本地自動的生成的。
2.然後錢包這個應用會將這個私鑰通過橢圓曲線演算法這個矩陣相乘,得到使用者的公鑰。因為是與矩陣相乘,所以公鑰也是矩陣,橫向和縱向都是32位。
3.因為公鑰十分複雜、不方便使用,所以又通過雜湊函式得到了一個比特幣地址(也叫錢包地址)。
2.比特幣地址與傳統賬號的區別
1.相同點:
都是進行交易的一個支付轉賬的“憑證”。
2.不同點:
(1)比特幣地址是由區塊鏈網路自發生成,而傳統賬號地址是由第三方機構生成。
(2)通過比特幣地址查詢到的是所有的轉賬記錄,而傳統賬號查詢到的是餘額。
3.為什麼一開始只是轉賬提交成功,需要礦工挖到新的區塊才能算交易成功?
網上找了找相關的文章,我覺得下面這篇理解起來好懂一點:
https://www.zxbcc.com/ad/478
上面那篇文章講的是原理,然後用我的話總結一下結論:
我們可以把 [挖礦行為] 理解為 [爭奪記賬權] ,所以 [挖到礦] 就可以理解為 [記了一筆賬] 。
所以當我們想要轉賬的時候,一開始只是把轉賬資訊提交成功,需要挖到新的區塊,把這筆轉賬資訊記到新的區塊裡,相當於 [把這筆賬記下] 以後,才能算真正的交易成功。
4.區塊鏈交易過程
假設Alice要向Bob轉一筆賬,那麼需要解決以下問題;
1.如何證明Alice有錢?
答:公鑰,通過公鑰雜湊判斷出錢包地址是Alice的。
2.如何證明現在發起交易的是Alice?
答:數字簽名,驗證Alice的數字簽名。
3.如何防止Alice的錢被使用兩次(即“雙花”問題)?
答:打標籤(就像火車票檢票一樣)
二、實驗操作
1.環境準備
1.安裝Win10 虛擬機器
這是官方的虛擬機器下載地址:
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
然後選擇VMWare的就行:
然後直接匯入就好:
開機密碼是 Passw0rd!
。
(虛擬機器裡只有一個盤,C盤,所以接下來的實驗都是在C盤完成的;如果用物理機的話,可以放在D盤E盤裡)
2.安裝Ethereum-Wallet
1.在C盤新建資料夾 Eth
,專門放置以太坊開發環境 :
2.把下載的Ethereum-Wallet-win64-0-8-10.zip壓縮包win-unpacked解壓到 C:\Eth
目錄下:
3.安裝geth
1.geth下載:https://ethereum.github.io/go-ethereum/downloads/
2.安裝geth,安裝在 C:\Eth
目錄下
3.在 C:\Eth
目錄下建立 privatechain
檔案,用以存放區塊鏈資料。
2.以太坊私有鏈搭建
1.建立第一個節點
1.在 C:\Eth
目錄下建立創世塊檔案 genesis.json
,檔案內容如下:
{
"nonce": "0x0000000000000042","difficulty": "0x40000","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","coinbase": "0x0000000000000000000000000000000000000000","timestamp": "0x00","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa","gasLimit": "0xffffffff","alloc": {
"3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
"balance": "1337000000000000000000"
},"17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
"balance": "229427000000000000000"
}
},"config": {
"chainId": 15,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0
}
}
- Coinbase: 曠工賬戶
- Difficulty: 挖礦難度,0x400,這個是簡單。
- extraData:相當於備註 gasLimit:最小消耗 gas
- nonce :64位隨機數,用於挖礦,注意他和mixhash的設定需要滿足以太坊黃皮書中的要求
- parentHash :上一個區塊的Hash值,因為是創世塊,石頭裡蹦出來的,沒有在它前面的,所以是0
- Timestamp : 時間戳
2.建立創世塊檔案
開啟cmd,進入 C:\Eth
目錄下(該目錄下有 geth.exe
和 genesis.json
檔案,便於執行geth命令),創世塊檔案初始化命令如下:
geth -datadir "%cd%\privatechain\node1" init genesis.json
- –datadir:後面跟本節點資料存放的目錄。
- genesis.json:是init命令的引數。
執行該命令後會在 C:\Eth\privatechain
下自動新建 node1
資料夾,並在node1下生成 geth
和 keystore
兩個資料夾。
- 其中geth存放的是區塊資訊,keystore中存放的是賬戶資訊。
初始化完成以後你就擁有一條自己的私有鏈了,之後就可以啟動自己的私有鏈進行一些操作。
3.啟動私有鏈節點:
geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%\privatechain\node1" --unlock 0 --rpccorsdomain "*" console
註釋:
- –targetgaslimit:每個塊的gas上限,這裡可以暫時理解為容量
- –rpc:啟動rpc通訊,可以進行智慧合約的部署和除錯
- –rpcaddr:rpc介面的地址
- –rpcport:rpc介面的埠號
- –port:網路監聽埠,用於節點之間通訊
- –rpcapi:設定rpc的範圍,暫時開啟eth,personal足夠
- –networkid:設定當前區塊鏈的網路ID,是一個數字,可以隨便寫
- –identity:區塊鏈的標示,隨便填寫,用於標示目前網路的名字
- –nodiscover:禁止被網路中其它節點發現,需要手動新增該節點到網路
- –maxpeers:最大節點數量
- –datadir:設定當前區塊鏈網路資料存放的位置
- –unlock:解鎖某使用者(此處用使用者座標來控制,解鎖後的使用者呼叫介面發起交易時,不要需要提供密碼),0代表儲存在賬號陣列中的第一個賬號。
第一次啟動時,去掉這個引數,否則會報錯!因為一開始沒有建立賬號,找不到該賬號! - –rpccorsdomain:限制rpc訪問源的ip,代表不限制
- –mine:允許挖礦
- –console:啟動命令列模式,可以在Geth中執行命令*
出現這個頁面則代表啟動成功!
- 注意:如果之前建立了使用者,在啟動過程中會提示輸入密碼:XXXXXX(即之前建立的賬號) ,然後才會啟動區塊鏈節點並進入Javascript Console。
3.以太坊私有鏈節點操作
1.新建賬戶:
personal.newAccount("密碼")
建立成功以後將會返回賬戶的地址:
如果沒有賬號直接開始挖礦的話,會遇到如下報錯:
2.檢視礦工賬戶:
eth.coinbase
3.設定挖礦的賬號
miner.setEtherbase("賬戶地址")
4.開始挖礦:
miner.start(1)
- 括號中的1表示用一個執行緒進行挖礦,如果不配置,就會不斷消耗計算機資源,讓CPU全速執行,影響計算機的使用。
出現以下介面就表示挖礦成功(那個問號代表的是小錘錘,這裡沒顯示出來):
5.停止挖礦:
miner.stop()
返回值為true就對了。
第一次stop的時候也會初始化一次,不要慌,不要以為沒停住……好吧我承認我當時慌了,連續執行了幾次stop命令:
6.檢視賬戶餘額:
查詢的是第一個賬戶的餘額,當我們挖礦時,獎勵金儲存預設的是第一個賬戶。
eth.getBalance(eth.accounts[0])
換算成以太幣的單位來檢視餘額:
web3.fromWei(eth.getBalance(eth.accounts[0]),‘ether‘)
7.轉賬
1.轉賬的前提是有兩個賬戶,所以先新建一個賬戶:
2.轉賬前確認一下兩個賬戶的餘額:
3.解鎖錢包,否則會報錯:
personal.unlockAccount(eth.accounts[0])
4.開始轉賬:
web3.eth.sendTransaction({from:web3.eth.accounts[0],to: web3.eth.accounts[1],value: web3.toWei(1,"ether")})
現在只是轉賬提交成功,需要礦工挖到新的區塊才能算交易成功。(原因上面的理論知識第3點已經講過了)
5.再次執行挖礦命令後,檢視餘額:
轉賬成功!