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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:42:10