以太坊私链数据上传与下载实战指南
在区块链应用开发中,以太坊私链(Private Chain)因其部署灵活、无需消耗真实 gas、数据完全可控等特点,成为企业级应用和开发测试环境的理想选择,本文将系统讲解如何在以太坊私链上实现数据的上传与下载,涵盖环境搭建、三种主流实现方案以及完整的代码实战。
什么是以太坊私链
以太坊私链是由个人或组织自行搭建、不连接公共网络的区块链环境,与公链相比,它具有以下优势:
- 零成本交易:无需购买真实 ETH,挖矿出块由自己控制
- 数据隐私:数据只在自己的节点间同步,不暴露给公网
- 高性能:出块速度快,可自行调整 gas limit
- 开发友好:适合智能合约调试和 DApp 原型验证
环境搭建
安装 Geth 并初始化私链
首先编写创世区块配置文件 genesis.json:
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200",
"gasLimit": "10000000",
"alloc": {}
}
然后初始化并启动节点:
geth --datadir ./data init genesis.json
geth --datadir ./data --networkid 12345 \
--http --http.port 8545 \
--http.api db,eth,net,web3,miner \
--allow-insecure-unlock console
启动后进入控制台,创建账户并启动挖矿:
personal.newAccount("123456") // 创建账户
miner.setEtherbase(eth.accounts[0]) // 设置挖矿收益账户
miner.start(1) // 开始挖矿
安装 Web3.js
npm install web3
数据上传的三种方案
通过交易 data 字段上传(最简单)
直接把数据编码后放入交易的 data 字段,适合小体量数据的快速存证。
const Web3 = require('web3');
const web3 = new Web3('http://127.0.0.1:8545');
async function uploadData(data) {
const accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0];
const receipt = await web3.eth.sendTransaction({
from: accounts[0],
to: accounts[0], // 目标地址为自己即可
value: 0,
data: web3.utils.utf8ToHex(data),
gas: 2000000
});
console.log('上传成功,交易哈希:', receipt.transactionHash);
return receipt.transactionHash;
}
uploadData('这是一条需要上链存证的数据');
对应的数据下载方式:通过交易哈希查询交易详情,从 input 字段还原原始数据。
async function downloadData(txHash) {
const tx = await web3.eth.getTransaction(txHash);
const data = web3.utils.hexToUtf8(tx.input);
console.log('下载的数据:', data);
return data;
}
通过智能合约存储(最常用)
编写一个数据存取合约,将数据写入合约状态变量,支持按 ID 精确读取。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract DataStore {
struct DataRecord {
string content;
address uploader;
uint256 timestamp;
}
mapping(uint256 => DataRecord) private records;
uint256 public count;
event DataUploaded(uint256 indexed id, address indexed uploader);
function upload(string memory content) public {
count++;
records[count] = DataRecord(content, msg.sender, block.timestamp);
emit DataUploaded(count, msg.sender);
}
function download(uint256 id) public view
returns (string memory, address, uint256)
{
require(id <= count, "record not exist");
DataRecord memory r = records[id];
return (r.content, r.uploader, r.timestamp);
}
}
使用 Web3.js 进行交互:
const contractABI = [...]; // 编译后的 ABI const contractAddress
The End
发布于:2026-10-12,除非注明,否则均为原创文章,转载请注明出处。

