前置要求
1. 注册蚂蚁开放联盟链账号
2. 开通开放联盟链服务
3. 获取必要的配置信息:
- ACCESS_ID
- access.key文件
ACCESS_ID对应的私钥文件
- BIZID(链ID)
- tenantid
- mykmsKeyId
具体实现代码
const chainSDK = require('../utils/chainSDK');
const config = require('../config/chainConfig');
const crypto = require('crypto');
class ArticleController {
async uploadToChain(article) {
try {
// 生成文章内容的哈希
const contentHash = crypto
.createHash('sha256')
.update(JSON.stringify(article))
.digest('hex');
const options = {
orderId: contentHash, // 使用内容哈希作为唯一订单号
bizid: config.bizid, // 链ID
account: "", // 账户名
content: JSON.stringify(article),// 文章内容
method: "DEPOSIT", // 存证方法
accessId: config.accessId,
token: chainSDK.token,
gas: 100000, // 燃料值
tenantid: "", // 租户ID,从AccessId中提取
mykmsKeyId: "" , // KMS密钥ID
};
return new Promise((resolve, reject) => {
chainSDK.antblc.callApi("api/contract/chainCallForBiz", options, (err, result) => {
if(err) reject(err);
resolve({
success: true,
txHash: result.data, // 交易哈希
contentHash: contentHash // 内容哈希
});
});
});
} catch (error) {
throw new Error(`上链失败: ${error.message}`);
}
}
async queryTransaction(txHash) {
try {
const options = {
bizid: config.bizid,
method: "QUERYTRANSACTION",
hash: txHash,
accessId: config.accessId,
token: chainSDK.token
};
return new Promise((resolve, reject) => {
chainSDK.antblc.callApi("api/contract/chainCall", options, (err, result) => {
if(err) reject(err);
const data = JSON.parse(result.data);
resolve({
success: true,
blockNumber: data.blockNumber,
transaction: data.transactionDO
});
});
});
} catch (error) {
throw new Error(`查询交易失败: ${error.message}`);
}
}
}
module.exports = new ArticleController();
终端测试运行
curl -X POST http://localhost:3000/api/article/upload -H "Content-Type: application/json" -d '{"title": "测试文章", "content": "这是一篇测 试文章的内容", "author": "这是标题"}'
仓库地址