如何在Deno中获取Solidity合约的初始化代码哈希?
在Deno中通过合约字节码计算初始化代码哈希
初始化代码哈希本质是对合约完整初始化代码(若带构造参数则包含字节码+ABI编码后的参数)执行Keccak-256哈希运算得到的结果。以下是在Deno环境中的具体实现步骤:
1. 依赖准备
直接导入Deno兼容的哈希与编码工具库,无需本地安装:
import { keccak_256 } from "https://esm.sh/@noble/hashes/keccak"; import { bytesToHex, hexToBytes } from "https://esm.sh/@noble/hashes/utils"; // 若需处理构造参数编码,额外导入ABI编码工具 import { encode } from "https://esm.sh/@noble/abi";
2. 核心计算函数
编写通用函数处理十六进制字节码到哈希的转换:
function calculateInitCodeHash(initCodeHex: string): string { // 移除可能存在的0x前缀 const cleanHex = initCodeHex.startsWith("0x") ? initCodeHex.slice(2) : initCodeHex; // 十六进制字符串转Uint8Array const initCodeBytes = hexToBytes(cleanHex); // 计算Keccak-256哈希 const hashBytes = keccak_256(initCodeBytes); // 转换为带0x前缀的十六进制哈希字符串 return `0x${bytesToHex(hashBytes)}`; }
3. 不同场景的使用示例
场景1:无构造参数的合约
直接传入编译后的合约字节码即可:
// 示例合约字节码(来自Solidity编译输出) const plainBytecode = "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806360fe47b11460375780636d4ce63c146062575b600080fd5b60606004803603810190605f9190602001906094565b60405160799060f4565b60405180910390f35b6000819050919050565b609e816089565b82525050565b600060208201905060b760008301846097565b9291505056fea2646970667358221220f9a32f6d45f14a40a2dce2c2a4d11a4729d30f0c7f56f67a63b9325b9259a70664736f6c63430008130033"; const hash = calculateInitCodeHash(plainBytecode); console.log("初始化代码哈希:", hash);
场景2:带构造参数的合约
需先将构造参数按ABI规则编码,再与合约字节码拼接后计算哈希:
// 合约构造函数ABI定义 const constructorAbi = [{ type: "uint256" }]; // 构造参数值 const args = [1234n]; // 编码参数为十六进制字符串 const encodedArgs = encode(constructorAbi, args); // 拼接字节码与编码后的参数(注意移除双方的0x前缀) const fullInitCode = plainBytecode.slice(2) + encodedArgs.slice(2); // 计算完整初始化代码的哈希 const hashWithArgs = calculateInitCodeHash(fullInitCode); console.log("带构造参数的初始化代码哈希:", hashWithArgs);
注意事项
- 必须确保传入的是完整初始化代码:带构造参数的合约若只传入字节码,计算出的哈希会与实际部署时的初始化代码哈希不符。
- Deno原生
crypto模块不支持Keccak-256,因此使用第三方库@noble/hashes更便捷,该库轻量且兼容ES模块。 - 处理十六进制字符串时需注意移除
0x前缀,避免转换为字节数组时出错。
内容的提问来源于stack exchange,提问作者Juan Carlos
相关产品推荐
相关产品推荐

