松露合约部署失败,发件人无效
Posted
技术标签:
【中文标题】松露合约部署失败,发件人无效【英文标题】:Truffle contract deployment failed, invalid sender 【发布时间】:2021-06-18 11:07:54 【问题描述】:我正在尝试使用 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:
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,
,
,
,
;
1_initial_migration.js:
const Migrations = artifacts.require("Migrations");
module.exports = function (deployer)
deployer.deploy(Migrations);
;
2_deploy.js:
const Token = artifacts.require("Token");
module.exports = (deployer) =>
deployer.deploy(Token);
;
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);
托管.sol:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0 ;
contract Escrow
address agent;
mapping(address => uint256) public deposits;
modifier onlyAgent()
require(msg.sender == agent);
_; // return void
constructor() public
// solidity heeft globale var msg
agent = msg.sender;
function deposit(address payee) payable public onlyAgent
uint256 amount = msg.value;
deposits[payee] = deposits[payee] + amount;
function withdras(address payable payee) public onlyAgent
uint256 payment = deposits[payee];
deposits[payee] = 0;
payee.transfer(payment);
【问题讨论】:
【参考方案1】:尝试不同的版本@truffle/hdwallet-provider 为我工作 1.2.3
npm 卸载 @truffle/hdwallet-provider npm install @truffle/hdwallet-provider@1.2.3
使用最新版本 (1.2.4) 时出现同样的错误(发件人无效)。
【讨论】:
你救了我的命!谢谢! 你救了另一个人。 你还救了一条命。 第四条生命获救! 第五个。谢谢【参考方案2】:根据我的观察,仅当您尝试在 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 上效果很好
【讨论】:
我刚刚检查了 hdwallet-provider 1.3.0,这确实解决了根本问题。我想很多人更喜欢快速简便的解决方案:) 感谢您的解决方案。不幸的是,它不适用于 BSC,当我尝试更新我的HDWalletProvider
并提供 chainId
时,我收到以下错误:Error: Chain with ID 97 not supported
。回滚到 1.2.3 确实可以修复它。
救命!谢谢!【参考方案3】:
看看这个: https://github.com/trufflesuite/truffle/issues/3935
似乎松露可能不符合 eip 155 标准。已合并 PR 以提供帮助,但我认为 HDWallet 端尚未解决此问题。
https://github.com/trufflesuite/truffle/issues/3913 https://github.com/trufflesuite/truffle/pull/3923
【讨论】:
谢谢!这似乎是最有可能的情况。我将尝试使用 --rpc.allow-unprotected-txs 参数设置和部署 geth。如果它有效,我会告诉你。【参考方案4】:我正在使用@truffle/hdwallet-provider 1.3.0,但仍然遇到同样的错误。
通过更改 HDWalletProvider 的初始化来修复它。
ropsten:
provider: function ()
return new HDWalletProvider(
privateKeys: ["YourPrivateKey"],
providerOrUrl: "https://ropsten.infura.io/v3/InfuraKey",
chainId: 3,
)
,
network_id: '3',
(将 YourPrivateKey 和 InfuraKey 替换为您的私钥和 infura api 密钥)
【讨论】:
【参考方案5】:作为替代解决方案,在 truffle-config.js
内部使用:
const HDWalletProvider = require('truffle-hdwallet-provider');
而不是
const HDWalletProvider = require('@truffle/hdwallet-provider');
这只是降级@truffle/hdwallet-provider
的另一种方式,而您的package.json
仍然可以:
"dependencies":
"@truffle/hdwallet-provider": "^1.3.1"
【讨论】:
以上是关于松露合约部署失败,发件人无效的主要内容,如果未能解决你的问题,请参考以下文章