Truffle部署合约到Hyperledger Besu本地链提示Wrong chainId如何解决
问题解决:Truffle部署Hyperledger Besu本地网络时报Wrong chainId错误
问题根因
该错误由@truffle/hdwallet-provider的默认规则导致:旧版本的hdwallet-provider会默认将交易的chainId设置为以太坊主网的1,即使Truffle配置中network_id设为通配符*,也不会自动同步Besu节点的实际chainId,最终导致签名交易携带的chainId和Besu创世配置的1337不匹配,触发报错。
解决方案
按以下步骤修改即可解决:
- 第一步:调整Truffle配置,显式指定匹配创世配置的
network_id和chainId,取消通配符,修改后的配置如下:
const PrivateKeyProvider = require("@truffle/hdwallet-provider"); const privateKeys = [ '0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3', '0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63', '0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f' ]; const privateKeyProvider = new PrivateKeyProvider( privateKeys, 'http://127.0.0.1:8545', 0, 3 ); module.exports = { networks: { besuKDO: { provider: privateKeyProvider, network_id: 1337, // 和创世配置的chainId保持一致,取消通配符 chainId: 1337, // 显式指定chainId,匹配Besu节点配置 gas: 16234336 // 可选,和节点返回的区块gas上限一致,避免额外报错 } } }
- 第二步:如果修改配置后仍报错,升级
@truffle/hdwallet-provider到最新版本,部分旧版本存在chainId传递异常的bug,执行命令npm update @truffle/hdwallet-provider即可完成升级。 - 第三步:确认Besu启动命令没有额外配置
--chain-id或--network-id参数,如果启动参数指定的数值和创世配置的1337不一致,也会触发该错误,移除对应参数或修改为1337即可。
验证修改
调整完成后重新执行部署命令truffle migrate --network besuKDO即可正常部署合约。
内容的提问来源于stack exchange,提问作者Stefan Iffländer
相关产品推荐
相关产品推荐

