当前位置: 首页 > article >正文

区块链实战:手把手教你搭建私有链网络

搭建一个区块链私有链网络是一个非常有趣且实用的练习。私有链(Private Blockchain)通常用于企业内部数据管理、测试和开发环境中,具备较高的隐私性和控制性。

在本教程中,我们将使用 Go-Ethereum (Geth) 来搭建一个私有以太坊链,并展示如何启动一个基础的区块链网络,连接多个节点,进行简单的交易。

环境要求:
  • 操作系统:Linux/MacOS/Windows(本文基于Linux环境)
  • 开发工具:Go-Ethereum(Geth)
  • 编程语言:Golang(用于与区块链交互)

一、准备工作

首先,需要确保以下工具已安装:

  1. Go-Ethereum (Geth):Go-Ethereum是以太坊的官方客户端,支持搭建私有链、部署智能合约等功能。

    安装方式(以Linux为例):

    sudo add-apt-repository -y ppa:ethereum/ethereum
    sudo apt-get update
    sudo apt-get install geth
    
  2. Node.js 和 npm(用于前端开发,如果需要交互的Web界面时会用到)

  3. 一个文本编辑器(如 VSCode 或 Sublime Text)

二、创建私有链

1. 创建创世区块配置文件

以太坊私有链的配置需要一个创世区块(Genesis Block)。创世区块定义了区块链的起始状态,包括网络ID、区块奖励、链的难度等。

在你的本地机器上创建一个目录来存放区块链配置文件:

mkdir myPrivateChain
cd myPrivateChain

然后创建一个名为 genesis.json 的文件,作为创世区块的配置。一个典型的创世区块配置如下:

{
  "config": {
    "chainId": 2021,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "difficulty": "0x20000",
  "gasLimit": "0x8000000"
}
  • chainId: 这是链的唯一标识符,我们在这里设为 2021
  • alloc: 可以在这里指定一些初始账户余额。
  • difficulty: 设定挖矿的难度,这里设置一个低难度,便于快速挖矿。
  • gasLimit: 设置每个区块的最大Gas限制。
2. 使用 Geth 初始化创世区块

使用 geth 命令来初始化你的私有链:

geth init genesis.json

这条命令会初始化你的私有链,并根据 genesis.json 中的设置生成区块链的状态。

3. 启动私有链节点

接下来,我们使用 geth 启动一个私有链节点。可以通过以下命令启动节点:

geth --networkid 2021 --http --http.addr 0.0.0.0 --http.port 8545 --http.corsdomain "*" --datadir ./data --nodiscover console

解释:

  • --networkid 2021:指定网络ID,必须与创世区块中的ID一致。
  • --http:启用HTTP-RPC接口,允许外部应用与节点进行交互。
  • --http.addr 0.0.0.0:监听所有IP地址上的请求(可以设置为127.0.0.1限制仅本机访问)。
  • --http.port 8545:指定HTTP-RPC端口,8545是默认端口。
  • --http.corsdomain "*":允许所有的跨域请求。
  • --datadir ./data:指定数据目录。
  • --nodiscover:禁用节点自动发现功能,因为我们要搭建的是私有链,网络中没有节点自动发现。

启动后,您将进入 Geth 的交互式控制台。

4. 创建帐户

在 Geth 控制台中,创建一个帐户来管理你的以太币(ETH):

personal.newAccount("yourStrongPassword")

记住生成的密码,这个密码将用于解锁帐户。

5. 启动挖矿

启动挖矿以生成区块。由于难度较低,挖矿速度会非常快:

miner.start(1) // 启动一个矿工

这里 1 是矿工的数量,即启动一个矿工。矿工将自动开始挖掘新区块。

6. 连接钱包账户

为了进行交易,你可以使用 Geth 创建一个账户,并在账户之间转账。你可以在控制台解锁账户:

personal.unlockAccount(eth.accounts[0], "yourStrongPassword", 15000)

这将解锁第一个账户并使其有效。账户解锁后,你可以开始进行转账操作。

三、添加更多节点

1. 创建第二个节点的 genesis.json 配置

如果你想添加第二个节点,可以复制并编辑原始的 genesis.json 文件,保持一致的 chainId

2. 启动第二个节点

在第二个节点的机器上运行以下命令:

geth --networkid 2021 --datadir ./data --bootnodes "enode://<bootnode-enode-id>" --http --http.addr 0.0.0.0 --http.port 8546 --http.corsdomain "*" console

这里的 --bootnodes 参数指的是第一个节点的 enode 地址。你可以通过第一个节点的控制台获取该地址:

admin.nodeInfo.enode
3. 连接两个节点

如果两个节点已成功启动,并且能相互发现,则它们会开始同步彼此的区块。你可以在任一节点的控制台中输入以下命令来查看节点是否已连接:

admin.peers

四、在私有链上进行交易

一旦私有链节点启动并且两个节点已连接,你可以通过以下步骤在区块链上进行交易:

  1. 解锁两个账户:

    personal.unlockAccount(eth.accounts[0], "yourStrongPassword", 15000)
    personal.unlockAccount(eth.accounts[1], "yourStrongPassword", 15000)
    
  2. 转账:假设 eth.accounts[0] 有足够的以太币,且你想将一定数量的ETH转账到 eth.accounts[1]

    eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
    
  3. 查看交易:

    eth.getTransactionReceipt("yourTransactionHash")
    
  4. 查看账户余额:

    web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
    web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
    

五、使用 Web3.js 进行私有链交互

私有链搭建好之后,你可以通过 Web3.js 库与其进行交互,前端应用可以通过 HTTP RPC 接口与区块链进行交互。

1. 安装 Web3.js
npm install web3
2. 配置 Web3.js
const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');

// 获取账户余额
web3.eth.getBalance('0x...').then(console.log);
3. 使用 Web3.js 创建和发送交易
web3.eth.sendTransaction({
    from: '0x...',
    to: '0x...',
    value: web3.utils.toWei('1', 'ether')
});

六、总结

通过本教程,你已经成功搭建了一个 私有以太坊链。搭建私有链可以帮助你更好地理解区块链的工作原理,并能在没有矿工参与的环境下测试和部署智能合约。

关键点总结:

  1. 创世区块配置:定义私有链的起始状态,包括 chainIddifficulty 等参数。
  2. 启动节点:通过 geth 启动节点,开启区块链网络。
  3. 多节点连接:通过设置 bootnodes 启动多个节点并使它们连接。
  4. Web3.js 交互:通过 HTTP-RPC 接口使用 JavaScript 进行交易和查询。

通过这个私有链,你可以进行各种测试,如交易验证、智能合约部署等,模拟真实区块链网络的工作方式。


http://www.kler.cn/a/585038.html

相关文章:

  • 【HarmonyOS Next】鸿蒙应用常规面试题和答辩思路参考
  • kotlin中的行为组件
  • Win11+WSL2安装cuda11.8,Anaconda配置Pytorch2.4-GPU版本
  • 2025移动端软件供应链安全开源治理方案最佳实践
  • ‌HTTP 401错误
  • 【附JS、Python、C++题解】Leetcode面试150题(9)——三数之和
  • 攻防世界 file_include【php://filter详解】
  • zerotier搭建免费moon服务器
  • 【C++】list(上):list类的常用接口介绍
  • FFmpeg处理流程
  • 力扣——随机链表的复制
  • Spring Boot + MyBatis-Plus 项目目录结构
  • 【网络】什么是 IHL(Internet Header Length,首部长度)TTL(Time To Live,生存时间)?
  • TypeScript泛型深度剖析:对比JavaScript的灵活与严谨
  • Linux上位机开发实战(按钮响应)
  • Redis 6.2.7安装配置
  • Apache Tomcat漏洞,对其进行升级
  • 【大模型学习】第十九章 什么是迁移学习
  • Flutter_学习记录_实现列表上下拉加载 +实现加载html的数据
  • 贪心算法简介(greed)