一个模拟以太坊主网 RPC 接口的服务,用于开发和测试。可以将主流钱包(如 MetaMask)的 RPC 节点配置为该服务,模拟以太坊网络的功能。
- 🔗 完整的以太坊 JSON-RPC 接口支持
- 💰 预置测试账户,每个账户有 100 ETH
- ⛏️ 自动挖矿功能
- 📦 使用 SQLite + Prisma 持久化数据
- 🔧 兼容 Hardhat/Ganache 调试方法
- 🦊 支持 MetaMask 等主流钱包连接
web3_clientVersion- 获取客户端版本web3_sha3- 计算 Keccak-256 哈希
net_version- 获取网络 IDnet_listening- 是否正在监听net_peerCount- 连接节点数
eth_chainId- 获取链 IDeth_blockNumber- 获取当前区块号eth_getBalance- 获取账户余额eth_getTransactionCount- 获取账户 nonceeth_getCode- 获取合约代码eth_getStorageAt- 获取存储数据eth_gasPrice- 获取 Gas 价格eth_estimateGas- 估算 Gaseth_sendTransaction- 发送交易eth_sendRawTransaction- 发送原始交易eth_call- 调用合约(不修改状态)eth_getBlockByNumber- 根据区块号获取区块eth_getBlockByHash- 根据哈希获取区块eth_getTransactionByHash- 获取交易详情eth_getTransactionReceipt- 获取交易收据eth_getLogs- 获取事件日志eth_feeHistory- 获取费用历史eth_maxPriorityFeePerGas- 获取最大优先费用- 更多方法...
evm_mine- 手动挖矿evm_increaseTime- 增加时间hardhat_setBalance- 设置账户余额hardhat_setCode- 设置合约代码hardhat_impersonateAccount- 模拟账户
npm install复制 .env.example 到 .env 并按需修改:
cp .env.example .env环境变量说明:
# 服务器配置
PORT=8545 # RPC 端口
HOST=0.0.0.0 # 监听地址
# 数据库配置
DATABASE_URL="file:./dev.db" # SQLite 数据库路径
# 以太坊网络配置
CHAIN_ID=1337 # 链 ID
NETWORK_NAME="Ethereum Virtual Net"
BLOCK_TIME=12000 # 区块时间(毫秒)
# 初始账户私钥(逗号分隔)
INITIAL_ACCOUNTS="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80,..."
# 初始余额(wei)
INITIAL_BALANCE="100000000000000000000" # 100 ETHnpm run prisma:generate
npm run prisma:migrate开发模式:
npm run dev生产模式:
npm run build
npm start启动服务后,在 MetaMask 或其他钱包中添加自定义网络:
| 设置项 | 值 |
|---|---|
| 网络名称 | Ethereum Virtual Net |
| RPC URL | http://localhost:8545 |
| 链 ID | 1337 |
| 货币符号 | ETH |
服务启动时会自动创建以下测试账户,每个账户初始余额为 100 ETH:
| # | 地址 | 私钥 |
|---|---|---|
| 0 | 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 | 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 |
| 1 | 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 | 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d |
| 2 | 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC | 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a |
| 3 | 0x90F79bf6EB2c4f870365E785982E1f101E93b906 | 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6 |
| 4 | 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 | 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a |
etherum-virtual-net/
├── prisma/
│ └── schema.prisma # 数据库模型
├── src/
│ ├── config/
│ │ └── index.ts # 配置文件
│ ├── rpc/
│ │ └── handlers.ts # RPC 方法处理器
│ ├── services/
│ │ ├── database.ts # 数据库连接
│ │ ├── accountService.ts # 账户服务
│ │ ├── blockService.ts # 区块服务
│ │ ├── transactionService.ts # 交易服务
│ │ └── logService.ts # 日志服务
│ ├── types/
│ │ └── index.ts # 类型定义
│ ├── utils/
│ │ └── helpers.ts # 工具函数
│ ├── app.ts # Express 应用
│ └── index.ts # 入口文件
├── package.json
├── tsconfig.json
└── README.md
# 安装依赖
npm install
# 开发模式运行
npm run dev
# 构建
npm run build
# 生产模式运行
npm start
# 生成 Prisma 客户端
npm run prisma:generate
# 执行数据库迁移
npm run prisma:migrate
# 打开 Prisma Studio(数据库管理界面)
npm run prisma:studiocurl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'响应:
{"jsonrpc":"2.0","id":1,"result":"0x539"}curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266","latest"],"id":1}'curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"method":"eth_sendTransaction",
"params":[{
"from":"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"to":"0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"value":"0xDE0B6B3A7640000"
}],
"id":1
}'curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"evm_mine","params":[],"id":1}'MIT