松露合约部署失败,发件人无效
我正在尝试使用 truffle 将合约部署到 ropsten 测试网,但出现以下错误:
Deploying 'Migrations'
----------------------
Error: *** Deployment Failed ***
"Migrations" -- invalid sender.
at /home/usr/.npm/lib/node_modules/truffle/build/webpack:/packages/deployer/src/deployment.js:365:1
at process._tickCallback (internal/process/next_tick.js:68:7)
Truffle v5.2.5 (core: 5.2.5)
Node v10.19.0
在本地部署到 ganache 时,它工作正常。此外,我很确定我的 truffle-config.js 是正确的,它与所有在线教程相同,但既然我在这里,我想我并不完全确定 :)。hd-wallet 使用的地址也是正确的(通过 truffle-config.js 中的 console.log 语句验证),并且它有 5 个 ETH 余额,足够了。我有 2 个迁移脚本,每个脚本都给出了完全相同的错误。
松露-config.js:
Deploying 'Migrations'
----------------------
Error: *** Deployment Failed ***
"Migrations" -- invalid sender.
at /home/usr/.npm/lib/node_modules/truffle/build/webpack:/packages/deployer/src/deployment.js:365:1
at process._tickCallback (internal/process/next_tick.js:68:7)
Truffle v5.2.5 (core: 5.2.5)
Node v10.19.0
1_initial_migration.js:
require("dotenv").config();
const HDWalletProvider = require("@truffle/hdwallet-provider");
module.exports = {
networks: {
ropsten: {
provider: () => {
var provider = new HDWalletProvider({
mnemonic: process.env.MNEMONIC,
providerOrUrl: `https://ropsten.infura.io/v3/${process.env.INFURA_KEY}`,
derivationPath: "m/44'/60'/0'/0/",
addressIndex: 0,
});
console.log(provider.getAddress());
return provider;
},
network_id: 3,
gas: 5500000,
confirmations: 2,
timeoutBlocks: 200,
skipDryRun: true,
},
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*",
},
},
compilers: {
solc: {
version: "0.6.0",
optimizer: {
enabled: true,
runs: 200,
},
},
},
};
2_deploy.js:
const Migrations = artifacts.require("Migrations");
module.exports = function (deployer) {
deployer.deploy(Migrations);
};
令牌.sol:
const Token = artifacts.require("Token");
module.exports = (deployer) => {
deployer.deploy(Token);
};
托管.sol:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
address minter;
// minterChanged event
event minterChanged(address indexed from, address to);
constructor() public payable ERC20("Decentralized Bank Currency", "DCB") {
minter = msg.sender;
}
function transferMinterRole(address bank) public returns(bool) {
require(msg.sender == minter);
minter = bank;
emit minterChanged(msg.sender, minter);
return true;
}
function mint(address account, uint256 amount) public {
require(msg.sender == minter);
_mint(account, amount);
}
}
回答
尝试不同的版本@truffle/hdwallet-provider 1.2.3 对我有用
npm 卸载 @truffle/hdwallet-provider npm install @truffle/hdwallet-provider@1.2.3
使用最新版本 (1.2.4) 时存在相同的错误(无效的发件人)。
回答
根据我的观察,只有当您尝试在 ropsten 测试网上部署任何合约时才会出现此问题。如果您使用本地节点进行部署,例如使用 运行ganache-cli,即使使用最新版本 (>1.2.3),它也能正常运行
这里的原因是他们更改了构造函数方法以将chainId参数添加到指定您正在使用交易签名的链。
解决方案:更新初始化 HDWalletProvider 的代码。
ropsten: {
provider: () =>
new HDWalletProvider({
mnemonic,
providerOrUrl:
'wss://ropsten.infura.io/ws/v3/.....',
chainId: 3,
}),
network_id: 3, // Ropsten's id
gas: 5500000, // Ropsten has a lower block limit than mainnet
confirmations: 0, // # of confs to wait between deployments. (default: 0)
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true, // Skip dry run before migrations? (default: false for public nets )
},
这对我来说在 ropsten 上很好用