1. 程式人生 > WINDOWS開發 >區塊鏈學習之3Windows平臺下以太坊私有鏈搭建及錢包部署和執行

區塊鏈學習之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.exegenesis.json 檔案,便於執行geth命令),創世塊檔案初始化命令如下:

geth -datadir "%cd%\privatechain\node1" init genesis.json
  • –datadir:後面跟本節點資料存放的目錄。
  • genesis.json:是init命令的引數。

執行該命令後會在 C:\Eth\privatechain下自動新建 node1 資料夾,並在node1下生成 gethkeystore 兩個資料夾。

  • 其中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.再次執行挖礦命令後,檢視餘額:
技術分享圖片
轉賬成功!