1. 以太坊的安裝、私有鏈創世區塊搭建、私有鏈節點的加入
1.1 geth下載與安裝
-
下載並安裝Geth:Geth官網下載地址
-
環境變量配置。
-
下載完成後,在D盤創建一個文件夾eth用於存儲數據。配置創世塊genesis.json文件如下:
{
"config": {
"chainId": 0,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
1.2 創世區塊的搭建
-
在命令行輸入
geth --datadir "D:\eth" init "D:\eth\genesis.json"
命令,指定私鏈的數據目錄並進行節點初始化。至此就建立好了一個創世區塊。
-
輸入命令
geth --datadir "D:\eth" --port 30303 --networkid 99 --nodiscover console
,進入geth控制檯。
1.3 私有鏈節點的加入
- 輸入命令
geth --datadir "/chain0" init genesis.json
創建節點。這裏創建了兩個節點。
- 輸入命令
geth --datadir "\chain0" --port 30303 --networkid 99 --nodiscover console
啓動節點。同時啓動兩個節點需要使port不同。
- 在1號節點的控制檯輸入命令
admin.nodeInfo.enode
查看節點信息;在0號控制檯使用addPeer()添加節點。
- 使用
net.peerCount``admin.peers
查看添加的節點數量和節點信息
2. getBlock()字段解釋
- Difficulty:表示當前區塊的難度。
- ExtraData:與此區塊相關的附加數據。
- gasLimit:當前區塊允許使用的最大gas。
- gasUsed:當前區塊累計使用的gas。
- Hash:區塊的哈希值。如果區塊沒有被確認,這個字段會是null值。
- LogsBloom:區塊日誌的布隆過濾器,區塊沒被確認是值爲null。 Miner:取得該區塊記賬權的礦工。
- mixHash:一個Hash值,當與nonce組合時,證明此區塊已經執行了足夠的計算。 nonce:POW生成的哈希值。
- Number:區塊號。
- parentHash:前一個區塊的哈希值。
- receiptsRoot:收據樹的根哈希值。
- Sha3Uncles:數據塊的哈希值。
- Size:當前區塊的字節大小。
- stateRoot:區塊狀態樹的根哈希。
- Timestamp:區塊打包時的unix時間戳。
- totalDifficulty:區塊鏈到當前區塊的總難度。
- Transactions:交易的對象。
- transactionsRoot:區塊的交易樹的根哈希。
- Uncles:叔哈希的數組。
3. 日誌輸出解釋
在命令中加入2>>geth.log,可以將控制檯信息輸出到日誌。其中記錄了信息類型(INFO / WARN等)、信息輸出時間、信息內容。
除控制檯信息外,日誌文件還記錄了網絡狀況以及網絡協議信息。
Started P2P networking
表示P2P服務開啓。HTTP endpoint opened
表示HTTP終端開啓。Blockchain manager stopped
表示區塊鏈管理器停止。Stopping Ethereum protocol
表示終止以太網協議。Transaction pool stopped
表示終止事務池。
4. 編寫簡單的智能合約,在 remix 下進行調試,並部署在鏈上進行調用
- 編寫一個簡單的智能合約,代碼如下
pragma solidity 0.5.11;
contract hello {
function multiply(uint a) pure public returns (uint) {
return a*3;
}
}
- 將這段代碼放入Remix(瀏覽器IDE),保存後點擊左側Compilation Details,在彈框內找到代碼段WEBDEPLOY.
var helloContract = web3.eth.contract([{"constant":true,"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"multiply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"}]);
var hello = helloContract.new(
{
from: web3.eth.accounts[0],
data: '0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c6888fa114602d575b600080fd5b605660048036036020811015604157600080fd5b8101908080359060200190929190505050606c565b6040518082815260200191505060405180910390f35b600060038202905091905056fea265627a7a72315820b6e72b6de9f4cfd60d1ccb57b3673ef8f82a583403c034a9fc97e6aa8868c32b64736f6c634300050b0032',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
- 成功部署合約
- 調用合約
Demo=eth.contract(hello.abi).at("0xb52cd969d662288f57e6a014f611bc4d25f5a89c")
5. 對交易的字段進行解釋
- 創建賬號:輸入
personal.newAccount("password")
,成功創建賬號。輸入personal.listAccounts
,可以看到創建成功的賬號地址。此時使用eth.getBalance(eth.accounts[0])
命令查看賬戶餘額爲0。
- 挖礦:
miner.start()
進行挖礦,miner.stop()
停止挖礦。一段時間後挖礦成功,再次查看賬戶0的餘額,發現多出了很多資產。
- 再次創建一個賬號。查看新賬號的餘額爲0。
- 使用
personal.unlockAccount()
爲賬戶解鎖,需要輸入密碼。
web3.fromWei(eth.getBalance(eth.accounts[0]))
:轉賬前進行餘額查詢,將單位Wei轉換爲ether。
- 進行轉賬
amount = web3.toWei(0.98)
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: amount})
- 轉賬成功
- 查看交易信息
eth.getTransaction("事務地址")
- blockHash:這個交易所在的塊的哈希值。
- blockNumber:這個交易所在的塊的編號。
- from:發起這個交易的賬戶或者用戶。
- gas:執行這個交易所需要的gas。
- gasPrice:當前gas與以太幣換算的匯率。
- hash:當前這個交易的哈希值。
- input:這裏是部署智能合約的交易,所以這裏的input是合約的16進制代碼。
- nonce:這裏的是交易下的nonce值,是賬戶發起交易所維護的nonce,一個交易對應一個nonce值,注意區分區塊中的nonce,區塊中的nonce是用於POW的nonce。
- r,v,s:交易簽名和用去決定交易的發送者的對應值。
- to:交易接收着的地址。這裏是合約的創建,合約賬戶的地址還沒有,所以是null。
- transactionIndex:這個交易在其對應區塊的序號。
- value:指交易要給交易接收着發送的以太幣數量。