微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Web3和Truffle HDWalletProvider在InfuraKovan Testnet上部署智能合约

如何解决使用Web3和Truffle HDWalletProvider在InfuraKovan Testnet上部署智能合约

不管是好是坏,我正在跟踪2018年底的教程,以帮助我了解如何在Kovan testnet上部署智能合约。我知道版本控制可能是一个问题,因此在显示deploy.js之前,这里是我的package.json

"dependencies": {
    "ganache-cli": "^6.10.2","mocha": "^4.1.0","solc": "^0.4.25","truffle-hdwallet-provider": "0.0.3","web3": "^1.0.0-beta.26"
  },

我的.env

WALLET_SEED="some 12 word seed phrase"
INFURA_ENDPOINT="https://kovan.infura.io/v3/PROJECT_ID"

deploy.js

const dotenv = require("dotenv").config();
const HDWalletProvider = require('truffle-hdwallet-provider');
const Web3 = require('web3');
const { interface,bytecode } = require('./compile');

const provider = new HDWalletProvider(
  process.env.WALLET_SEED,process.env.INFURA_ENDPOINT
);
const web3 = new Web3(provider);

const deploy = async () => {
  const accounts = await web3.eth.getAccounts();
  
  console.log('Attempting to deploy from account',accounts[0]);
  const result = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({ data: bytecode,arguments: ['Hi there!']})
    .send({ gas: '1000000',from: accounts[0] });

  console.log('Contract deployed to: ',result.options.address);
}

deploy();

编译正常,但是当我部署时,出现以下错误

UnhandledPromiseRejectionWarning: Error: Insufficient funds. The account you tried to send transaction from does not have enough funds. required 10000000000000000 and got: 0.
    at /Users/richardjarram/code/catonmat/udemy-solidity/solidity_sandBox/node_modules/web3-provider-engine/subproviders/web3.js:15:44
    at XMLHttpRequest.request.onreadystatechange (/Users/richardjarram/code/catonmat/udemy-solidity/solidity_sandBox/node_modules/truffle-hdwallet-provider/node_modules/web3/lib/web3/httpprovider.js:118:13)

我的Kovan钱包里肯定有1 ETH。有趣的是:当我在以下代码查询我的钱包时,得到以下输出

const balance = await web3.eth.getBalance('0x...............actualaccount');
console.log(balance)
// => 1000000000000 etc.

但是当我从助记词查询Web3提供程序生成accounts变量时,我得到了一个完全不同的帐户:

const provider = new HDWalletProvider(
  process.env.WALLET_SEED,process.env.INFURA_ENDPOINT
);
const web3 = new Web3(provider);

const accounts = await web3.eth.getAccounts();
console.log(accounts)
// [ '0x..............XYZ']

当我检查web3为我建立的帐户中的资金时,我确认余额确实为0:

const balance = await web3.eth.getBalance('0x...............XYZ');
console.log(balance)
// => 0

但是当我将实际的钱包地址这样硬编码到部署脚本中时,它会告诉我该帐户不存在!

const result = await new web3.eth.Contract(JSON.parse(interface))
 .deploy({ data: bytecode,arguments: ['Hi there!']})
 .send({ gas: '1000000',from: '0x.................actualaccount' });
(node:93528) UnhandledPromiseRejectionWarning: Error: UnkNown address - unable to sign transaction for this address: "0x.....................actualaddress"
    at /Users/richardjarram/code/catonmat/udemy-solidity/solidity_sandBox/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:185:35
    at /Users/richardjarram/code/catonmat/udemy-solidity/solidity_sandBox/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:207:5

解决方法

在您的truffle-config.js中,定义要使用的网络,添加'from:'0x ...',以确保合同从您知道有余额的帐户中部署。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。