使用Hardhat+Hedera+Arkhia编译Solidity合约时私钥长度报错
解决Hardhat连接Hedera网络时“私钥过短,预期32字节”的错误
出现这个错误的核心原因是Hedera原生私钥格式和Hardhat期望的EVM兼容32字节私钥格式不匹配,不管是DER编码还是原生十六进制私钥,都需要做格式转换才能被Hardhat识别。
步骤1:提取/转换出正确的32字节私钥
Hedera的Ed25519类型私钥包含额外元数据,需要提取核心的32字节部分,或用Hedera SDK直接转换:
方法A:手动提取(针对十六进制/DER私钥)
如果你的私钥是DER编码格式(类似302e020100300506032b657004220420...),找到字符串中0420之后的64个字符,这就是32字节的私钥内容,给它加上0x前缀即可。
如果是Hedera原生十六进制私钥,同样提取0420后的64位字符,加0x前缀。
方法B:用Hedera SDK自动转换
写个简单的Node.js脚本快速转换:
const { PrivateKey } = require("@hashgraph/sdk"); // 替换成你的Hedera私钥(DER字符串或十六进制字符串都可) const hederaPrivateKey = "你的Hedera私钥"; const privateKey = PrivateKey.fromString(hederaPrivateKey); // 生成带0x前缀的32字节EVM兼容私钥 const evmPrivateKey = `0x${privateKey.toStringRaw()}`; console.log("转换后的EVM兼容私钥:", evmPrivateKey);
运行脚本后,复制输出的私钥即可。
步骤2:修正Hardhat配置
- 修正Arkhia RPC URL格式:需将API Key作为查询参数拼接,而非直接拼接URL和Key:
const arkhiaJsonRpcRelayTestnet = `https://testnet.arkhia.io/json-rpc/hedera/testnet?api-key=${process.env.ARKHIA_API_KEY}`; - 把转换后的私钥存入
.env文件(禁止硬编码在代码中):ARKHIA_API_KEY=你的Arkhia API密钥 OPERATOR_PRIVATE_KEY=转换后的带0x前缀的32字节私钥 - 更新
hardhat.config.js的账户配置:require("@nomicfoundation/hardhat-toolbox"); require('dotenv').config({path: '.env'}); const arkhiaJsonRpcRelayTestnet = `https://testnet.arkhia.io/json-rpc/hedera/testnet?api-key=${process.env.ARKHIA_API_KEY}`; const operatorPrivateKey = process.env.OPERATOR_PRIVATE_KEY; module.exports = { defaultNetwork: "hedera", solidity: { version: "0.8.0", settings: { optimizer: { enabled: true, runs: 200, }, }, }, networks: { hedera: { url: arkhiaJsonRpcRelayTestnet, accounts: [operatorPrivateKey] } }, };
验证
运行npx hardhat accounts命令,若能正常输出账户地址,说明私钥配置正确,可正常编译部署合约。
内容的提问来源于stack exchange,提问作者Ogolo Prince
相关产品推荐
相关产品推荐

