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

Ethereum: 从零到一为DApp开发搭建专属的私有测试网络

作为一名开发者,在将智能合约部署到以太坊主网之前,进行充分的测试是不可或缺的一环。虽然可以使用公共测试网(如Sepolia),但它们的速度和稳定性有时并不理想。一个更高效的选择是:在本地搭建一个完全由自己掌控的私有以太坊网络。

本文将手把手带大家使用强大的以太坊官方客户端Geth(Go Ethereum)来创建我们自己的私有链。我们将学会如何定义“创世区块”,启动网络节点,并与之交互。在这里插入图片描述

为什么需要私有网络?

在深入实践之前,我们先明确为什么搭建私有网络对开发如此有价值:

  • 零成本:在私有网络中,我们可以随心所欲地“挖矿”,获取任意数量的以太币用于测试,无需支付任何真实费用。
  • 极速交易:由于网络中只有我们自己的节点,交易确认几乎是瞬时的,极大地提升了开发和调试效率。
  • 完全控制:我们可以自由设定网络的各项参数,例如Chain ID和挖矿难度,模拟不同的网络环境。
  • 保护隐私:在将商业逻辑上链之前,我们可以在一个完全隔离的环境中进行测试,不必担心敏感信息在公共网络上暴露。
准备工作:安装Geth

Geth是连接以太坊网络的门户,也是我们搭建私有网络的核心工具。 它是一个用Go语言编写的命令行界面。我们可以根据我们的操作系统,从官方网站https://geth.ethereum.org/downloads下载并安装Geth。

安装完成后,打开我们的终端或命令行工具,输入以下命令来验证Geth是否安装成功:

geth version

如果能看到版本信息,说明Geth已经准备就绪。

核心步骤一:定义创世区块

每一条区块链都始于一个特殊的区块——创世区块(Genesis Block)。 这个区块没有前序区块,它像宇宙大爆炸的奇点一样,定义了整个链的初始状态和规则。

我们需要创建一个名为 genesis.json 的文件来定义我们的创世区块。这个JSON文件包含了几个关键配置项:

  • config: 这个对象定义了链的核心配置。
    • chainId: 网络的唯一标识符。主网的ID是1,为了避免冲突,我们应该为私有网络选择一个独特的ID,例如1337。
    • homesteadBlock, eip150Block等:这些字段定义了不同协议升级(硬分叉)在哪个区块高度激活。在私有网络中,我们通常将它们设为0,表示从创世区块开始就启用所有新特性。
  • difficulty: 定义了挖矿的初始难度。为了能快速出块,建议设置一个较低的值,比如 “0x400”。
  • gasLimit: 设置了每个区块能容纳的Gas上限,决定了区块的容量。
  • alloc: 这是最有趣的部分。我们可以在这里为指定的以太坊地址预先分配任意数量的以太币。这让我们在网络启动之初就拥有充足的测试资金。

示例 genesis.json 文件:

{"config": {"chainId": 1337,"homesteadBlock": 0,"eip150Block": 0,"eip155Block": 0,"eip158Block": 0,"byzantiumBlock": 0,"constantinopleBlock": 0,"petersburgBlock": 0,"istanbulBlock": 0,"berlinBlock": 0,"clique": {"period": 5,"epoch": 30000},"terminalTotalDifficulty": 0},"difficulty": "0x1","gasLimit": "0x8000000","extradata": "0x00000000000000000000000000000000000000000000000000000000000000003F317E27Fe53Bc2803422710aEB51a259ddD092300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","alloc": {"0x3F317E27Fe53Bc2803422710aEB51a259ddD0923": {"balance": "1000000000000000000000"}}
}

实用建议:在alloc字段中,将"YOUR_ETHEREUM_ADDRESS_HERE"替换为我们自己的以太坊地址(如果没有,可以使用MetaMask等钱包工具创建一个)。balance的单位是Wei(1 Ether = 10^18 Wei),上述示例为我们预配了1000个ETH。

核心步骤二:初始化与启动网络

有了创世文件,我们就可以用它来“初始化”我们的私有链了。这个过程会根据genesis.json的配置,在指定目录中创建区块链所需的数据文件。

初始化流程

下面是整个初始化和启动过程的流程图:
在这里插入图片描述

具体命令

  1. 创建数据目录:首先,创建一个用于存放私有链数据的文件夹。

    mkdir my-private-eth
    cd my-private-eth
    
  2. 初始化节点:执行以下命令,让Geth使用我们的genesis.json文件来初始化数据目录。

    geth --datadir . init genesis.json
    

    --datadir . 表示将当前文件夹作为数据目录。执行成功后,我们会看到目录下生成了gethkeystore两个子目录。

  3. 启动私有节点:现在,万事俱备,只欠东风。使用以下命令启动我们的私有节点:

    geth --datadir . --networkid 1337 --http --http.addr "0.0.0.0" --http.api "eth,net,web3,admin,miner,txpool,debug" --allow-insecure-unlock --http.corsdomain "*" --nodiscover
    

    让我们拆解一下这些参数的含义:

    • --networkid 1337: 指定网络ID,必须与genesis.json中的chainId匹配。
    • --http: 启用HTTP-RPC服务,让DApp前端或脚本可以与之交互。
    • --http.api "eth,net,web3,personal": 允许通过RPC访问的API模块。personal模块可以让我们管理账户。
    • --http.corsdomain "*": 允许来自任何来源的跨域请求,方便本地开发。
    • --nodiscover: 禁用节点发现机制,防止我们的节点意外连接到其他公共节点。
核心步骤三:与我们的私有链互动

当节点成功启动后,我们会进入一个交互式JavaScript控制台。在这里,我们可以像操作一个JavaScript对象一样管理我们的以太坊节点。

检查账户余额
如果我们在genesis.json中预配了资金,现在就可以验证一下。在Geth控制台中输入:

// 将 YOUR_ADDRESS 替换为我们的真实地址
eth.getBalance("0x3F317E27Fe53Bc2803422710aEB51a259ddD0923")
web3.fromWei(eth.getBalance("0x3F317E27Fe53Bc2803422710aEB51a259ddD0923"), "ether")
echo eth.getBalance('0x3F317E27Fe53Bc2803422710aEB51a259ddD0923') | geth attach ipc:\\.\pipe\geth.ipc

我们会看到返回一个巨大的数字,这就是我们拥有的Wei数量。

结论

我们已经成功搭建并启动了一个功能完备的私有以太坊网络。这个安全、高效的测试环境将成为我们开发、测试和迭代智能合约的得力助手。现在,开始在这个属于我们的区块链世界里尽情探索和创造吧!

http://www.dtcms.com/a/295349.html

相关文章:

  • Compose 适配 - 键鼠模式
  • Ethereum: 从 1e+21 到千枚以太币:解密 Geth 控制台的余额查询
  • Day30| 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 风险分级响应管理分析系统
  • 基于 PIC16 系列的多功能电子烟(温控 + 电压控制 + 多模式)方案
  • 亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用
  • 【初识数据结构】CS61B 中的归并排序和选择排序
  • python学习xlsx表格导入mysql脚本 + leetcode19删除链表倒N + python与本地mysql连接不上排错
  • 每日算法-两数之和
  • Go基础教程 从零到英雄:30分钟掌握Go语言核心精髓
  • Leetcode—1035. 不相交的线【中等】
  • 独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG
  • MongoDB 和 Elasticsearch(ES)区别
  • 项目重新发布更新缓存问题,Nginx清除缓存更新网页
  • MAC包头、IP包头 、UDP包头中的长度含义是啥?三者之间有啥区别?
  • Node.js 版本兼容问题:minimatch@10.0.3和minio@7.0.28 冲突的解决
  • Node.js 全局对象
  • Ubuntu-安装Asyn教程
  • 造成服务器内存不足的原因有什么
  • Node.js 中的内置模板path
  • Node.js特训专栏-实战进阶:18.密码加密与安全传输
  • node.js中的fs与path模块
  • 04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
  • React+threejs两种3D多场景渲染方案
  • STM32 HAL库 HAL_TIM_OC_Stop函数详细解释
  • 期待更好的发展
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • 亲测有效:EPLAN导出CAD图纸,DWG文件里的图纸复制粘贴出错和无法编辑的解决方法
  • EIDE 创建基于STM32-HD的项目快速创建流程
  • 精通Python PDF裁剪:从入门到专业的三重境界