手把手教你搭建以太坊私有鏈:從零開始的實(shí)驗(yàn)指南**


以太坊作為全球領(lǐng)先的智能合約平臺,其公有鏈雖然功能強(qiáng)大,但在某些場景下(如企業(yè)內(nèi)部應(yīng)用、數(shù)據(jù)隱私要求高的項(xiàng)目、開發(fā)測試等),搭建一條私有鏈或聯(lián)盟鏈更為合適,私有鏈允許參與者對交易數(shù)據(jù)進(jìn)行完全控制,無需擔(dān)心公有鏈上的網(wǎng)絡(luò)擁堵和高昂Gas費(fèi)用,本文將詳細(xì)介紹如何通過Geth(Go-Ethereum)客戶端,從零開始搭建一條簡單的以太坊私有鏈,并進(jìn)行基本的交互實(shí)驗(yàn)。

實(shí)驗(yàn)?zāi)康?/h2>
  1. 理解以太坊私有鏈的基本概念與搭建原理。
  2. 掌握使用Geth客戶端初始化、啟動(dòng)私有鏈的方法。
  3. 學(xué)會(huì)在私有鏈上創(chuàng)建賬戶、查看賬戶信息、轉(zhuǎn)賬及部署簡單智能合約。
  4. 體驗(yàn)私有鏈的運(yùn)行機(jī)制與特點(diǎn)。

實(shí)驗(yàn)環(huán)境準(zhǔn)備

  1. 操作系統(tǒng):Linux (Ubuntu 18.04/20.04)、macOS 或 Windows (本文以Linux為例)。
  2. Go語言環(huán)境:Geth是Go語言編寫的,需要安裝Go (建議1.16及以上版本)。
    # 安裝Go (以Ubuntu為例,具體版本請參考Go官網(wǎng))
    sudo apt update
    sudo apt install golang-go
  3. Geth客戶端:可以從以太坊官方GitHub下載編譯好的二進(jìn)制文件或自行編譯。
    # 下載并解壓Geth (示例版本v1.10.25,請?zhí)鎿Q為最新穩(wěn)定版)
    wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.25-4167d45b.tar.gz
    tar -xzf geth-linux-amd64-1.10.25-4167d45b.tar.gz
    sudo cp geth-linux-amd64-1.10.25-4167d45b/geth /usr/local/bin/
    geth version # 驗(yàn)證安裝
  4. 文本編輯器:如VS Code, Vim等,用于編寫智能合約。
  5. Solidity編譯器 (solc):用于編譯智能合約。
    # 安裝solc (通過npm,需先安裝Node.js)
    sudo apt install nodejs npm
    npm install -g solc

實(shí)驗(yàn)步驟

設(shè)計(jì)創(chuàng)世區(qū)塊 (Genesis Block)

私有鏈的第一個(gè)區(qū)塊——?jiǎng)?chuàng)世區(qū)塊需要我們手動(dòng)定義,創(chuàng)建一個(gè)名為custom.json的文件,內(nèi)容如下:

{
  "config": {
    "chainId": 15,         // 私有鏈ID,避免與公有鏈沖突 (1-14為公有鏈保留)
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {
    // 預(yù)分配一些以太坊給指定地址,可選
    "0x1234567890123456789012345678901234567890": {
      "balance": "100000000000000000000" // 100 ETH
    }
  },
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x4000",  // 初始難度,私有鏈可以設(shè)置低一些方便挖礦
  "extraData": "",
  "gasLimit": "0xffffffff",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

說明

  • chainId:私有鏈的唯一標(biāo)識符,非常重要。
  • alloc:預(yù)分配地址和余額,方便初始測試。
  • difficulty:挖礦難度,私有鏈可以設(shè)置較低值,以便快速出塊。

初始化私有鏈

使用Geth的init命令,根據(jù)創(chuàng)世區(qū)塊文件初始化私有鏈數(shù)據(jù)目錄。

cd my_private_chain
# 使用創(chuàng)世區(qū)塊文件初始化
geth --datadir "./data" init ../custom.json

執(zhí)行成功后,會(huì)在./data目錄下生成geth、keystore、chaindata等文件夾,用于存儲(chǔ)鏈數(shù)據(jù)、賬戶信息和區(qū)塊數(shù)據(jù)。

啟動(dòng)私有鏈節(jié)點(diǎn)

初始化完成后,啟動(dòng)私有鏈節(jié)點(diǎn)。

geth --datadir "./data" --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "db,eth,net,web3,personal" --mine --minerthreads 1 --console

參數(shù)說明

  • --datadir "./data":指定數(shù)據(jù)目錄。
  • --nodiscove
    隨機(jī)配圖
    r
    :禁止節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn),適用于私有鏈。
  • --rpc:啟用HTTP-RPC服務(wù)。
  • --rpcaddr "0.0.0.0":RPC服務(wù)監(jiān)聽地址,0.0.0.0表示監(jiān)聽所有網(wǎng)絡(luò)接口。
  • --rpcport "8545":RPC服務(wù)端口,默認(rèn)8545。
  • --rpcapi "db,eth,net,web3,personal":允許通過RPC調(diào)用的API列表。
  • --mine:開啟挖礦。
  • --minerthreads 1:挖礦線程數(shù),根據(jù)CPU核心數(shù)調(diào)整。
  • --console:啟動(dòng)后自動(dòng)進(jìn)入JavaScript控制臺,方便交互。

啟動(dòng)后,節(jié)點(diǎn)會(huì)開始嘗試挖礦,由于我們設(shè)置了較低的難度,出塊會(huì)很快,如果沒有預(yù)分配地址或預(yù)分配地址沒有解鎖,節(jié)點(diǎn)會(huì)使用默認(rèn)的coinbase地址挖礦。

私有鏈交互 (通過Geth控制臺)

當(dāng)看到miner.start()返回的哈希值,并且區(qū)塊高度開始增長時(shí),表示節(jié)點(diǎn)運(yùn)行正常,我們可以在Geth控制臺進(jìn)行以下操作:

  1. 查看賬戶信息

    // 查看當(dāng)前賬戶列表
    personal.listAccounts
    // 應(yīng)該能看到預(yù)分配的地址(如果解鎖了)和默認(rèn)的coinbase地址
    // 查看當(dāng)前使用的賬戶(默認(rèn)為coinbase)
    eth.coinbase
  2. 創(chuàng)建新賬戶

    // 創(chuàng)建一個(gè)新賬戶,并設(shè)置密碼(注意:控制臺輸入密碼不會(huì)顯示)
    personal.newAccount("your_password")
    // 記住返回的新賬戶地址
  3. 解鎖賬戶

    // 解鎖賬戶,以便進(jìn)行交易(如轉(zhuǎn)賬、部署合約)
    personal.unlockAccount(eth.coinbase, "your_coinbase_password")
    // 解鎖預(yù)分配的賬戶(如果需要)
    // personal.unlockAccount("0x1234567890123456789012345678901234567890", "alloc_password")
  4. 轉(zhuǎn)賬 (發(fā)送ETH)

    // 從coinbase賬戶向新創(chuàng)建的賬戶轉(zhuǎn)賬1 ETH
    // 參數(shù):發(fā)送方,接收方,金額(單位:wei),單位
    eth.sendTransaction({from: eth.coinbase, to: "0x新創(chuàng)建的賬戶地址", value: web3.toWei(1, "ether")})
    // 查看交易狀態(tài),返回交易哈希
    // 交易被打包后,接收方余額會(huì)增加
  5. 查看余額

    // 查看指定地址的余額(單位:wei)
    web3.eth.getBalance("0x1234567890123456789012345678901234567890")
    // 轉(zhuǎn)換為ether顯示
    web3.fromWei(web3.eth.getBalance("0x1234567890123456789012345678901234567890"), "ether")
  6. 停止/開始挖礦

    // 停止挖礦
    miner.stop()
    // 開始挖礦
    miner.start(1) // 1為線程數(shù)

部署和調(diào)用智能合約 (可選)

  1. 編寫智能合約: 創(chuàng)建一個(gè)簡單存儲(chǔ)合約SimpleStorage.sol