Переключайтесь между учетными записями для запуска смарт-контрактов

Я использую truffle developдля тестирования своих смарт-контрактов. Я пытался переключаться между разными учетными записями с помощью, web3.eth.defaultAccount = web3.eth.accounts[1]но безуспешно. Как мне это сделать?

Ответы (2)

Из соображений стиля я предпочитаю объявлять участников заранее:

contract('MyContract', function(accounts) {

    var owner = accounts[0];
    var seller = accounts[1];
    var buyer = accounts[2];

Затем во время выполнения тестов (или пользовательского интерфейса) явно укажите, кто говорит:

it("should do something", function() {
    myContract.method(args, {from: owner}).then(...

Надеюсь, поможет.

ОБНОВЛЯТЬ

Массив accountsпредставляет собой список учетных записей из кошелька (а не сети как таковой), поэтому тестовый клиент может подписывать любой из них.

Хотя truffle использует подход «чистой комнаты» к тестам, вы можете не полагаться на него и избежать возможной путаницы, развертывая новый, свежий контракт перед каждым тестом. Этот метод игнорирует миграции и конкурирует с конфигурацией сети на основе «как есть». Это дает вам возможность контролировать процесс развертывания, в том числе учетную запись, которая развертывает контракт на уровне тестирования на стороне клиента.

var myContract; // this will be the contract instance

beforeEach("deploy new MyContract", function() {
    return MyContract.new(args, { from: owner }) // make a new one and choose the deployer
        .then(instance => myContract = instance);
});

Если собрать все вместе, то получится что-то вроде

MyContract = artifacts.require(...

contract('MyContract', function(accounts) {

    var myContract;        
    var owner = accounts[0];
    var seller = accounts[1];
    var buyer = accounts[2];

    beforeEach("deploy new MyContract", function() {
      return MyContract.new(args, { from: owner }) // control who deployed it
      .then(instance => myContract = instance);
    });

    it("should do something", function() {
      myContract.method(args, {from: owner}).then(... // control who accesses it
Не знал, что смарт-контракты могут получить доступ к адресам учетных записей в сетях. Это очень полезно. Но моя проблема на стороне клиента. Всякий раз, когда я запускаю truffle develop, по умолчанию используется первая учетная запись. Я не думаю, что смогу это изменить, truffle-config.jsпоэтому я пытаюсь переключить учетную запись клиента на консоли.

Вы можете изменить учетную запись по умолчанию, используемую контрактом, из командной строки «разработать».

> MetaCoin.defaults({ from: '0x123413413412341234' })

Это повлияет на все транзакции, выполненные для этого контракта.


Как указал Роб, другим вариантом является явное переопределение fromв каждой транзакции.

> MetaCoin.deployed().transfer(to, value,
    { from: '0x13412341234...' })

Можно указать fromв конфигурационном файле truffle-config.js.

Это сложнее, но удобно, если что-то из developне соответствует вашим требованиям.

Вы должны определить свою собственную сеть и запустить собственный экземпляр ganache.

module.exports = {
  networks: {
    myCustomConfiguration: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*",
      from: '0x11111..111'
    }
  }
};

Теперь выполните ganacheв другой консоли, и вы можете запустить truffle console --network myCustomConfiguration.