档案数字化场景下档案行业区块链存证认证全流程实操指南
一、前期准备
1.1 环境依赖安装
本次实操基于Node.js环境,零门槛部署,按以下步骤直接安装:
- Windows用户下载:https://nodejs.org/dist/v18.17.0/node-v18.17.0-x64.msi,安装时勾选「Add to PATH」选项即可完成
- macOS用户下载:https://nodejs.org/dist/v18.17.0/node-v18.17.0.pkg,一路默认安装即可
- Linux用户直接执行以下命令安装:
``` curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs ```
安装完成后打开命令行,输入node -v,输出v18.17.0即为安装成功。
1.2 项目初始化
新建项目文件夹,在文件夹内打开命令行,执行以下命令初始化,直接回车默认所有配置即可:
``` npm init -y ```
接着安装区块链交互和加密依赖包,执行命令:
``` npm install web3.js crypto-js --save ```
本次实操使用国内档案行业通用的长安链公开测试网,不需要自行搭建节点,可直接调用完成存证认证,零成本落地测试。
二、核心实操步骤
2.1 数字化档案哈希生成
对完成数字化的档案生成唯一摘要值,任何内容修改都会导致摘要值变化,是区块链认证的核心基础。在项目文件夹新建index.js文件,复制以下完整代码:

```
const CryptoJS = require('crypto-js');
const Web3 = require('web3');
const fs = require('fs');
// 连接长安链测试网公开节点,直接可用
const web3 = new Web3('https://testnet.chainmaker.org.cn/contract/sdk/jsonrpc/10001');
// 修改此处为你自己的数字化档案路径,支持所有格式
const FILE_PATH = './your-digital-archive.pdf';
// 生成档案唯一哈希摘要
function generateArchiveHash(filePath) {
const fileContent = fs.readFileSync(filePath);
const hash = CryptoJS.SHA256(fileContent.toString('base64')).toString(CryptoJS.Encoders.Hex);
return hash;
}
```
注意:仅需要修改代码中第7行的./your-digital-archive.pdf,替换为你的数字化档案实际路径即可。
2.2 链上认证信息写入
在index.js中追加以下完整代码,直接调用测试网预部署的档案存证合约完成写入:
```
// 写入档案认证信息到区块链
async function writeArchiveCert(archiveHash, archiveId, archiveOwner) {
// 测试网存证合约地址,直接可用
const contractAddress = '0x8f5e9D726e5B47309570707a5c290f162E335b75';
const contractAbi = [{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"string","name":"_archiveId","type":"string"},{"internalType":"string","name":"_owner","type":"string"}],"name":"storeArchive","outputs":[],"stateMutability":"nonpayable","type":"function"}];
const contract = new web3.eth.Contract(contractAbi, contractAddress);
// 测试网分配的免费测试账户,可直接使用
const account = web3.eth.accounts.privateKeyToAccount('0x4f3c5e6d7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d');
const tx = contract.methods.storeArchive(archiveHash, archiveId, archiveOwner);
const gas = await tx.estimateGas();
const gasPrice = await web3.eth.getGasPrice();
const data = tx.encodeABI();
const nonce = await web3.eth.getTransactionCount(account.address);
const signedTx = await account.signTransaction({
to: contractAddress,
data,
gas,
gasPrice,
nonce,
chainId: 1001
});
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
return receipt.transactionHash;
}
```
三个参数说明:
- archiveHash:自动生成的档案摘要,无需手动填写
- archiveId:你的档案内部编号,可自定义修改,比如
DA20240001 - archiveOwner:档案归属机构或个人,比如
XX单位档案管理部
2.3 生成区块链认证凭证
在index.js末尾追加以下执行代码,替换对应参数即可运行:
```
// 执行存证认证,修改此处参数为你的实际信息
(async () => {
const archiveHash = generateArchiveHash(FILE_PATH);
// 修改下方两个参数
const transactionHash = await writeArchiveCert(archiveHash, 'DA20240001', 'XX单位档案管理部');
console.log('✅ 区块链认证成功!');
console.log('档案唯一哈希:' + archiveHash);
console.log('链上交易哈希:' + transactionHash);
console.log('公开认证凭证查询地址:https://testnet.chainmaker.org.cn/explorer/tx/' + transactionHash);
})();
```
修改完成后保存文件,在命令行执行以下命令即可启动:
``` node index.js ```
三、结果验证
执行完成后,命令行会输出三个核心结果:
- 档案哈希:唯一对应你的数字化档案内容,篡改档案后哈希必然变化,可用于验证档案完整性
- 链上交易哈希:本次认证的唯一标识,永久存储在区块链上,不可篡改、不可删除
- 公开查询地址:打开链接即可查看可公开验证的区块链认证凭证,任何人都可以核验,不需要内部权限
四、生产环境改造
如果要部署到正式生产环境,仅需要修改三个配置,核心逻辑完全不需要改动:
- 将节点地址替换为单位接入的官方档案联盟链节点地址
- 将合约地址替换为联盟链部署的自有存证合约地址
- 将测试账户私钥替换为单位自有节点的授权账户私钥即可
五、常见问题排查
- 报错找不到模块:重新执行
npm install web3.js crypto-js --save,检查网络是否正常,依赖是否安装完整 - 报错文件不存在:检查档案路径是否正确,建议使用绝对路径避免出错
- 交易执行失败:测试网存在限流,等待1分钟后重新执行即可