¿Cómo pasar parámetros de constructor a un contrato usando Truffle?

Estoy usando testrpc y truffle para implementar contratos. Quiero pasar los parámetros del constructor durante la implementación.

    contract User { 
          string public userName;

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

   }

Estoy usando contractname.deployed() para implementar el contrato.

      var user=User.deployed()

Este comando de implementación no inicializará el parámetro de nombre de usuario.

¿Cómo pasar _name a este contrato usando truffle?

Respuestas (2)

En Truffle, los parámetros del constructor van en /migrations. Entonces, algo como:

deployer.deploy(User, "foo");

User.deployed()será un contrato de usuario que se implementó con _name="foo"

Debería haber una forma de crear un contrato con diferentes parámetros de constructor, ¿no?
Por supuesto. Esta línea function User(string _name)define un parámetro para el constructor. Podría haber más o diferentes parámetros.
Me refería a crear el contrato con otros parámetros, no solo modificar las variables. Tengo un contrato que establece la propiedad del contrato en la construcción a una dirección pasada en el argumento. Solo el propietario del contrato podrá modificar posteriormente los datos del contrato. Si llamo a deployment ahora, establece la dirección del propietario en 0. Entendí por su respuesta que puedo cambiar eso desde las migraciones pero estableciendo un valor para mi parámetro. Pero eso significa que puedo crear contratos con el mismo propietario cada vez, me gustaría poder modificar los argumentos desde la consola de trufas
Algo así como propietario normalmente sería una dirección no aleatoria, por ejemplo, otro contrato o usuario. Los scripts de migración son JavaScript. Puede interrogar una función en un contrato no relacionado para adquirir el valor correcto y luego pasarlo. Realmente, cualquier forma en que desee establecer la dirección correcta está bien, luego pasarla. Me pregunto si está buscando un patrón de fábrica. Es decir, implemente un contrato y luego use una función en el contrato para implementar algo más con la fábrica convirtiéndose convenientemente en propietaria. Tal vez... ethereum.stackexchange.com/questions/13415/…

Consideremos el contrato de prueba en el que el constructor acepta dos parámetros:

// 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 usará MyContract.new([arg1, arg2, ...], [tx params]) para pasar parámetros al constructor:

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);
    });
});

Tenga en cuenta que para acceder a la variable de estado se utiliza la función getter .