Как передать параметры конструктора в контракт с помощью Truffle?

Я использую testrpc и truffle для развертывания контрактов. Я хочу передать параметры конструктора при развертывании.

    contract User { 
          string public userName;

          function User(string _name) {
                 userName=_name;
          }

   }

Я использую contractname.deployed() для развертывания контракта.

      var user=User.deployed()

Эта команда развертывания не инициализирует параметр userName.

Как передать _name этому контракту с помощью трюфеля?

Ответы (2)

В Truffle параметры конструктора находятся в /migrations. Итак, что-то вроде:

deployer.deploy(User, "foo");

User.deployed()будет пользовательский контракт, который был развернут с _name="foo"

Должен быть способ создать контракт с разными параметрами конструктора, не так ли?
Конечно. Эта строка function User(string _name)определяет один параметр для конструктора. Параметры могут быть больше или отличаться.
Я имел в виду создание контракта с другими параметрами, а не просто изменение переменных. У меня есть контракт, который устанавливает право собственности на контракт при строительстве по адресу, переданному в аргументе. После этого только владелец контракта сможет изменить данные контракта. Если я вызову развертывание сейчас, он установит адрес владельца равным 0. Из вашего ответа я понял, что могу изменить это с помощью миграции, но установив значение для моего параметра. Но это означает, что я могу каждый раз создавать контракты с одним и тем же владельцем, я хотел бы иметь возможность изменять аргументы из консоли трюфеля.
Что-то вроде владельца обычно будет неслучайным адресом, например, другим контрактом или пользователем. Скрипты миграции — это JavaScript. Вы можете запросить функцию в несвязанном контракте, чтобы получить правильное значение, а затем передать его. Действительно, любой способ, которым вы хотите установить правильный адрес, подходит, а затем передать его. Интересно, вы после заводского шаблона. То есть разверните контракт, а затем используйте функцию в контракте, чтобы развернуть что-то еще, при этом фабрика станет владельцем. Возможно… ethereum.stackexchange.com/questions/13415/…

Рассмотрим тестовый контракт, в котором конструктор принимает два параметра:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

contract Test {
    address public owner;
    address public user1;
    address public user2;

    constructor (address _user1, address _user2)  {
        owner = msg.sender;
        user1 = _user1;
        user2 = _user2;
    }
}

Truffle-test будет использовать MyContract.new([arg1, arg2, ...], [tx params]) для передачи параметров в конструктор:

const TestContract = artifacts.require('Test');

contract('Test', function (accounts) {
    const [owner, user1, user2] = accounts;
    const txParams = { from: owner };

    beforeEach(async function () {
        this.testContract = await TestContract.new(user1, user2, txParams);
    });

    it('has an owner, user1 and user2', async function () {
        expect(await this.testContract.owner()).to.equal(owner);
        expect(await this.testContract.user1()).to.equal(user1);
        expect(await this.testContract.user2()).to.equal(user2);
    });
});

Учтите, что для доступа к state-переменной используется геттер-функция .