You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript Promises实现区块链区块的异步SHA256哈希计算

代码问题梳理

你现有写法的几个核心问题如下:

  • generateHash方法没有返回Promise对象,导致app.js中调用block.generateHash().then()会直接报错,因为undefined没有then方法
  • Promise内部的判断语句误用了赋值运算符=,而不是相等判断运算符,且该判断逻辑本身冗余度很高
  • 方法内部的promise.then()处理完全多余,你需要将Promise直接返回给外部调用方(也就是app.js里的逻辑)处理结果,不需要在方法内部消费
  • 计算哈希时仅对body字段加密不符合区块链的常规逻辑,正常块哈希需要覆盖块的全部字段(id、nonce、body),避免字段被篡改后哈希不变的问题
修正后的实现代码
generateHash() {
    let self = this;
    // 直接返回Promise对象给外部调用
    return new Promise(function(resolve, reject) {
        try {
            // 对整个块对象序列化后计算哈希,转字符串得到标准哈希值
            self.hash = SHA256(JSON.stringify(self)).toString();
            // 处理完成后返回整个块实例
            resolve(self);
        } catch (error) {
            // 出现序列化等异常时抛出错误
            reject(Error("哈希生成失败: " + error.message));
        }
    });
}
逻辑说明
  • 方法直接返回Promise实例,外部调用方就可以通过then和catch接收成功/失败的结果,和app.js的给定逻辑完全适配
  • 用try/catch捕获可能的异常(比如对象序列化失败),保证异常能正常通过reject抛给外部处理
  • 计算哈希时对整个self实例序列化,保证块内任意字段修改都会导致哈希变化,符合区块链的设计要求
  • 加了toString()是因为crypto-js的SHA256返回的是WordArray对象,转成字符串才是常规的64位十六进制哈希值格式
  • 修改完成后执行node app.js就能看到预期的块哈希和完整块数据输出

内容的提问来源于stack exchange,提问作者Saveer Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:24:06