手把手教你搭建以太坊私有鏈:從零開始的實(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>
- 理解以太坊私有鏈的基本概念與搭建原理。
- 掌握使用Geth客戶端初始化、啟動(dòng)私有鏈的方法。
- 學(xué)會(huì)在私有鏈上創(chuàng)建賬戶、查看賬戶信息、轉(zhuǎn)賬及部署簡單智能合約。
- 體驗(yàn)私有鏈的運(yùn)行機(jī)制與特點(diǎn)。
實(shí)驗(yàn)環(huán)境準(zhǔn)備
- 操作系統(tǒng):Linux (Ubuntu 18.04/20.04)、macOS 或 Windows (本文以Linux為例)。
- Go語言環(huán)境:Geth是Go語言編寫的,需要安裝Go (建議1.16及以上版本)。
# 安裝Go (以Ubuntu為例,具體版本請參考Go官網(wǎng))
sudo apt update
sudo apt install golang-go
- 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)證安裝
- 文本編輯器:如VS Code, Vim等,用于編寫智能合約。
- 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)
# 安裝Go (以Ubuntu為例,具體版本請參考Go官網(wǎng)) sudo apt update sudo apt install golang-go
# 下載并解壓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)證安裝
# 安裝solc (通過npm,需先安裝Node.js) sudo apt install nodejs npm npm install -g solc
私有鏈的第一個(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:禁止節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn),適用于私有鏈。r
--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)行以下操作:
-
查看賬戶信息:
// 查看當(dāng)前賬戶列表 personal.listAccounts // 應(yīng)該能看到預(yù)分配的地址(如果解鎖了)和默認(rèn)的coinbase地址 // 查看當(dāng)前使用的賬戶(默認(rèn)為coinbase) eth.coinbase
-
創(chuàng)建新賬戶:
// 創(chuàng)建一個(gè)新賬戶,并設(shè)置密碼(注意:控制臺輸入密碼不會(huì)顯示) personal.newAccount("your_password") // 記住返回的新賬戶地址 -
解鎖賬戶:
// 解鎖賬戶,以便進(jìn)行交易(如轉(zhuǎn)賬、部署合約) personal.unlockAccount(eth.coinbase, "your_coinbase_password") // 解鎖預(yù)分配的賬戶(如果需要) // personal.unlockAccount("0x1234567890123456789012345678901234567890", "alloc_password") -
轉(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ì)增加 -
查看余額:
// 查看指定地址的余額(單位:wei) web3.eth.getBalance("0x1234567890123456789012345678901234567890") // 轉(zhuǎn)換為ether顯示 web3.fromWei(web3.eth.getBalance("0x1234567890123456789012345678901234567890"), "ether") -
停止/開始挖礦:
// 停止挖礦 miner.stop() // 開始挖礦 miner.start(1) // 1為線程數(shù)
部署和調(diào)用智能合約 (可選)
- 編寫智能合約:
創(chuàng)建一個(gè)簡單存儲(chǔ)合約
SimpleStorage.sol: