代码拉取完成,页面将自动刷新
import { randomBytes } from 'crypto';
import { getHash, encrypt, decrypt } from './util.js';
import { BLOCKS_PATH } from './constants.js';
import fs from 'fs-extra';
const { writeFileSync, removeSync, existsSync } = fs;
/**
* 区块
*/
export class Block {
/**
* 上个节点的hash
* @type {String}
*/
prevHash = null;
/**
* 随机字节
* @type {Buffer}
*/
randomByte = null;
/**
* @type {Buffer}
*/
data = null;
/**
* 构造函数
* @param data{Buffer} 数据
* @param prevHash{string} 上个节点的Hash
*/
constructor(data, prevHash = '0'.repeat(64), randomByte = randomBytes(64)) {
this.prevHash = prevHash;
if (!(data instanceof Buffer)) {
data = Buffer.from(data);
}
this.data = data;
this.randomByte = randomByte;
}
/**
* 加密后的节点数据
*/
get encryptedContent() {
return encrypt(
Buffer.concat([
Buffer.from(this.prevHash),
Buffer.from(this.randomByte),
Buffer.from(this.data),
])
);
}
/**
* 节点hash
*/
get hash() {
return getHash(this.encryptedContent);
}
/**
* 节点存放在硬盘上的位置
*/
get filePath() {
return `${BLOCKS_PATH}/${this.hash}`;
}
/**
* 写入区块到硬盘
*/
write() {
return writeFileSync(this.filePath, this.encryptedContent);
}
/**
* 删除硬盘上的区块信息
*/
delete() {
return existsSync(this.filePath) && removeSync(this.filePath);
}
/**
* 解密函数
* @param buffer{Buffer} 解密前buffer
*/
static decrypt(buffer) {
const raw = decrypt(buffer);
const prevHash = raw.slice(0, 64).toString();
const randomByte = raw.slice(64, 128);
const data = raw.slice(128);
return new Block(data, prevHash, randomByte);
}
}
export default Block;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。