档案区块链存证全流程实操指南 零门槛完成存证核验上链操作
前置准备:提前完成开发环境与链账户配置
1. 基础开发环境安装
本教程基于Node.js 16.x版本开发,低版本会出现依赖兼容问题,直接通过以下地址安装对应版本:
- Windows系统:https://nodejs.org/dist/v16.20.2/node-v16.20.2-x64.msi,一路默认安装即可
- Mac系统:执行命令
brew install node@16
安装完成后执行以下命令验证,返回版本号即为安装成功:
``` node -v 输出v16.20.2 npm -v 输出8.19.4 ```2. 免费链账户申请
本教程使用BSN文昌链测试网,完全免费无需付费,直接访问地址注册:https://testnet.bianjie.ai/
注册完成后完成实名认证,依次点击「链账户管理」-「创建账户」,选择文昌链测试网,创建完成后记下链账户地址、操作私钥、API密钥三个参数,私钥请勿泄露给他人。随后进入「资产中心」领取100uirita测试gas费,可支持至少500次存证操作。
步骤1:搭建存证后端服务,完成上链逻辑开发
首先创建项目文件夹并安装依赖,所有命令可直接复制执行:
``` mkdir archive-blockchain-demo && cd archive-blockchain-demo npm init -y npm install axios crypto-js @irita/irita-sdk express cors ```在项目根目录创建config.js配置文件,直接替换为你自己的三个链账户参数即可:
``` // config.js 完整可直接复制配置 module.exports = { // 文昌链测试网固定参数,无需修改 rpcUrl: "https://testnet.bianjie.ai:26657", chainId: "wenchangchain-testnet-1", // 替换为自己的链账户参数 accountAddr: "iaa1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", privateKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ```创建存证核心逻辑文件archiveDeposit.js,实现哈希计算和上链存证功能:
``` // archiveDeposit.js const CryptoJS = require('crypto-js'); const { Client } = require('@irita/irita-sdk'); const config = require('./config'); // 计算档案SHA256哈希,仅存哈希不上传原文件,保护隐私降低成本 const calcArchiveHash = (fileBuffer) => { return CryptoJS.SHA256(CryptoJS.lib.WordArray.create(fileBuffer)).toString(); } // 上链存证核心方法 const depositArchive = async (fileName, fileHash, archiveDesc) => { const client = new Client({ url: config.rpcUrl, chainId: config.chainId, }); const account = client.newAccountFromPrivateKey(config.privateKey); // 构造存证交易 const msg = client.nft.newMsgIssueDenom({ id: `archive_${Date.now()}`, name: fileName, schema: JSON.stringify({ fileHash, archiveDesc, uploadTime: new Date().toISOString() }), sender: account.address }); // 发送交易上链 const res = await client.sendTx(msg, account, { gas: '200000', fee: [{ denom: 'uirita', amount: '20000' }] }); return { txHash: res.transactionHash, blockHeight: res.height, depositTime: new Date().toISOString() } } module.exports = { calcArchiveHash, depositArchive } ```创建后端接口文件server.js,提供前端调用的存证接口:
``` // server.js const express = require('express'); const cors = require('cors'); const { depositArchive } = require('./archiveDeposit'); const app = express(); app.use(cors()); app.use(express.json()); // 存证接口 app.post('/deposit', async (req, res) => { const { fileName, fileHash, archiveDesc } = req.body; try { const result = await depositArchive(fileName, fileHash, archiveDesc); res.json(result); } catch (e) { res.status(500).json({ error: e.message }); } }); app.listen(3000, () => { console.log('服务运行地址:http://localhost:3000'); }); ```执行命令node server.js启动后端服务,无报错即为启动成功。
步骤2:前端对接实现用户端存证操作
直接创建index.html文件,无需额外搭建前端框架,打开即可使用:
```
选择档案文件:
档案备注:
```双击打开index.html,选择文件点击存证,等待3-5秒即可返回存证结果,交易哈希即为存证凭证。
步骤3:档案核验操作,验证档案是否被篡改
提供两种核验方式,可按需选择:
方式1:链上浏览器直接核验
访问文昌链测试网浏览器:https://testnet.bianjie.ai/explorer,输入存证返回的交易哈希,即可查看到链上存储的档案哈希、存证时间、上传人地址等信息,不可篡改。
方式2:代码自动核验
在archiveDeposit.js中添加以下核验逻辑,调用时传入交易哈希和待核验文件的哈希即可自动返回核验结果:
``` // 新增到archiveDeposit.js的核验方法 const verifyArchive = async (txHash, targetFileHash) => { const client = new Client({ url: config.rpcUrl, chainId: config.chainId, }); const tx = await client.getTx(txHash); if(!tx) return { pass: false, msg: '交易不存在,该档案未上链存证' }; const depositInfo = JSON.parse(tx.tx.body.messages[0].schema); if(depositInfo.fileHash === targetFileHash) { return { pass: true, msg: '核验通过,档案未被篡改', depositInfo, blockTime: tx.timestamp } } else { return { pass: false, msg: '核验失败,档案已被篡改' } } } module.exports = { calcArchiveHash, depositArchive, verifyArchive } ```常见踩坑问题排查
- 交易发送失败提示gas不足:去文昌链测试网后台领取更多测试币,或者将config里的gas参数调大到300000即可
- 哈希比对不通过:确认待核验文件没有任何修改,包括文件名、元信息修改都会导致哈希变化,存证后不要修改原文件任何内容
- 跨域报错:确认server.js已经引入cors中间件,或者将前端页面放在同域名服务下运行
- 商用上线切换:仅需要将config.js里的rpcUrl、chainId替换为文昌链主网参数,私钥替换为主网账户即可,所有业务代码无需修改