我正在编写一个种子,以便在部署智能契约之后添加数据。我正在使用ropsten网络,在truffle-config中这样设置:
ropsten: {
provider: function () {
return new HDWalletProvider(MNEMONIC, INFURA_KEY)
},
network_id: 3,
gas: 8000000 //make sure this gas allocation isn't over 8M, which is the max
}部署之后,我想用truffle exec scriptName.js调用我的脚本。在我的脚本中,我基本上需要做两件事: 1)添加一个品牌(这可以节省另一个钱包的地址),2)调用另一个函数,作为我上面添加的品牌。此功能只能由品牌地址调用。
我可以添加品牌,但是我不能调用第二个功能,因为它仍然是由智能合同所有者调用,而不是由品牌调用。
这是我的代码:
const contract = artifacts.require('contract');
const brandAddress = '0x73aCAEf54005FE8499Ff1159A244617C123F1a53'
module.exports = function (done) {
console.log("Getting deployed version of the contract...")
contract.deployed().then(async (instance) => {
console.log('Adding first Brand...')
await instance.addBrandAddress(brandAddress);
console.log('Brand address added: '+ brandAddress)
//from now on act as the brand
console.log('Creating first Token...')
let tokenOne = [
'1576827018',
true,
'43.782988;11.282723',
'',
'B2529234802149001329150000E20030',
'',
'',
'Test data'
]
await instance.createToken(tokenOne, {from: brandAddress})
console.log('First token created: ', tokenOne)
}).then(() => {
console.log('Seed finished.')
done();
}).catch((err) => {
console.log(err)
done();
})
}这是我得到的错误:
Error: Unknown address - unable to sign transaction for this address: "0x73aCAEf54005FE8499Ff1159A244617C123F1a53" at PromiEvent (/home/dan/.nvm/versions/node/v13.7.0/lib/node_modules/truffle/build/webpack:/packages/contract/lib/promievent.js:9:1)
at TruffleContract.createToken (/home/dan/.nvm/versions/node/v13.7.0/lib/node_modules/truffle/build/webpack:/packages/contract/lib/execute.js:169:1)
at /var/www/html/initialContractSeed.js:26:24
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
hijackedStack: 'Error: Unknown address - unable to sign transaction for this address: "0x970355374fa0eab7ab02ca56e611144cc2e8fdf0"\n' +
' at /var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:397:1\n' +
' at cb (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:441:1)\n' +
' at h.cb [as getAccounts] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/src/index.js:99:1)\n' +
' at h.getAccounts [as validateSender] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:438:1)\n' +
' at h.validateSender [as validateTransaction] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:395:1)\n' +
' at validateTransaction (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:112:1)\n' +
' at apply (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/async/waterfall.js:16:1)\n' +
' at nextTask (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/async/waterfall.js:26:1)\n' +
' at h.waterfall [as handleRequest] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/subproviders/hooked-wallet.js:111:1)\n' +
' at handleRequest (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/index.js:119:1)\n' +
' at l.next [as _handleAsync] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/index.js:106:1)\n' +
' at Timeout._handleAsync [as _onTimeout] (/var/www/html/node_modules/truffle-hdwallet-provider/dist/webpack:/truffle-hdwallet-provider/Users/gnidan/src/work/truffle/node_modules/web3-provider-engine/index.js:90:1)\n' +
' at listOnTimeout (internal/timers.js:549:17)\n' +
' at processTimers (internal/timers.js:492:7)'
}我没有使用from: brandAddress,而是尝试使用地址的私钥(所以是from: brandAddressPK),但那个密钥仍然没有工作。
也许我可以通过使用web3.js来做到这一点,但我需要发送一个元组作为参数,而关于web3.js,我记得的最后一件事是,这是不可能的(所以我切换到了ethers.js)。
编辑:我解决这个问题的方法是创建一个js脚本(不使用块菌)。通过使用ethers.js,我首先使用所有者的私钥创建了一个提供者,然后当我需要充当一个品牌时,我创建了一个新的提供者,并使用该品牌的私钥。
这不是我想要的,但效果很好,做好了这份工作。
发布于 2020-04-16 05:42:58
可以使用自定义HDWallet提供程序解决问题。
HDWallet提供程序接受一组私钥,而不是助记符。
const contract = artifacts.require('contract');
const HDWalletProvider = require('@truffle/hdwallet-provider');
const OWNER_ADDR = '0x1234...'; // Ethereum address
const OWNER_PKEY = 'ABCD...'; // Private key (without 0x at the beginning)
const BRAND_ADDR = '0x4433...'; // Ethereum address
const BRAND_PKEY = 'B1C1...'; // Private key
module.exports = async function (done) {
const provider = new HDWalletProvider([
OWNER_PKEY,
BRAND_PKEY,
],
'http://localhost:8545',
0, // start at position 0
2, // and use 2 private keys
);
contract.setProvider(provider);
const instance = await contract.deployed();
// To call a method as owner
await instance.onwerOnlyMethod({ from: OWNER_ADDR });
// To call a method as brand
await instance.brandOnlyMethod({ from: BRAND_ADDR });
done();
};https://ethereum.stackexchange.com/questions/82384
复制相似问题