首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用信托执行脚本时充当另一个钱包?

如何在使用信托执行脚本时充当另一个钱包?
EN

Ethereum用户
提问于 2020-04-11 18:12:21
回答 1查看 842关注 0票数 1

我正在编写一个种子,以便在部署智能契约之后添加数据。我正在使用ropsten网络,在truffle-config中这样设置:

代码语言:javascript
复制
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)调用另一个函数,作为我上面添加的品牌。此功能只能由品牌地址调用。

我可以添加品牌,但是我不能调用第二个功能,因为它仍然是由智能合同所有者调用,而不是由品牌调用。

这是我的代码:

代码语言:javascript
复制
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();
    })
}

这是我得到的错误:

代码语言:javascript
复制
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,我首先使用所有者的私钥创建了一个提供者,然后当我需要充当一个品牌时,我创建了一个新的提供者,并使用该品牌的私钥。

这不是我想要的,但效果很好,做好了这份工作。

EN

回答 1

Ethereum用户

发布于 2020-04-16 05:42:58

可以使用自定义HDWallet提供程序解决问题。

HDWallet提供程序接受一组私钥,而不是助记符。

代码语言:javascript
复制
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();
};
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/82384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档