松露合约部署失败,发件人无效

我正在尝试使用 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 上很好用


以上是松露合约部署失败,发件人无效的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>