在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,web3,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.再次執行挖礦命令後,查看餘額:
轉賬成功!