如何使用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
相关产品推荐
相关产品推荐

