【區塊鏈】私有鏈的搭建與簡單智能合約

1. 以太坊的安裝、私有鏈創世區塊搭建、私有鏈節點的加入

1.1 geth下載與安裝

  1. 下載並安裝Geth:Geth官網下載地址

  2. 環境變量配置。

  3. 下載完成後,在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 創世區塊的搭建

  1. 在命令行輸入geth --datadir "D:\eth" init "D:\eth\genesis.json"命令,指定私鏈的數據目錄並進行節點初始化。至此就建立好了一個創世區塊。
    在這裏插入圖片描述

  2. 輸入命令geth --datadir "D:\eth" --port 30303 --networkid 99 --nodiscover console,進入geth控制檯。
    在這裏插入圖片描述

1.3 私有鏈節點的加入

  1. 輸入命令 geth --datadir "/chain0" init genesis.json 創建節點。這裏創建了兩個節點。
    在這裏插入圖片描述
  2. 輸入命令 geth --datadir "\chain0" --port 30303 --networkid 99 --nodiscover console 啓動節點。同時啓動兩個節點需要使port不同。
    在這裏插入圖片描述
  3. 在1號節點的控制檯輸入命令admin.nodeInfo.enode查看節點信息;在0號控制檯使用addPeer()添加節點。
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 使用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 下進行調試,並部署在鏈上進行調用

  1. 編寫一個簡單的智能合約,代碼如下
pragma solidity 0.5.11;

contract hello {

  function multiply(uint a) pure public returns (uint) {
    return a*3;
  }
}
  1. 將這段代碼放入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);
    }
 })
  1. 成功部署合約在這裏插入圖片描述
    在這裏插入圖片描述
  2. 調用合約
Demo=eth.contract(hello.abi).at("0xb52cd969d662288f57e6a014f611bc4d25f5a89c") 

在這裏插入圖片描述
在這裏插入圖片描述

5. 對交易的字段進行解釋

  1. 創建賬號:輸入personal.newAccount("password"),成功創建賬號。輸入personal.listAccounts,可以看到創建成功的賬號地址。此時使用eth.getBalance(eth.accounts[0])命令查看賬戶餘額爲0。
    在這裏插入圖片描述
  2. 挖礦:miner.start()進行挖礦,miner.stop()停止挖礦。一段時間後挖礦成功,再次查看賬戶0的餘額,發現多出了很多資產。
    在這裏插入圖片描述
  3. 再次創建一個賬號。查看新賬號的餘額爲0。
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 使用personal.unlockAccount()爲賬戶解鎖,需要輸入密碼。
    在這裏插入圖片描述
  5. web3.fromWei(eth.getBalance(eth.accounts[0])):轉賬前進行餘額查詢,將單位Wei轉換爲ether。
    在這裏插入圖片描述
  6. 進行轉賬amount = web3.toWei(0.98)
    eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: amount})在這裏插入圖片描述
  7. 轉賬成功
    在這裏插入圖片描述
  8. 查看交易信息
    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:指交易要給交易接收着發送的以太幣數量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章