Wie übergebe ich Konstruktorparameter mit Truffle an einen Vertrag?

Ich verwende testrpc und truffle für die Bereitstellung von Verträgen. Ich möchte Konstruktorparameter während der Bereitstellung übergeben.

    contract User { 
          string public userName;

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

   }

Ich verwende contractname.deployed() zum Bereitstellen von Verträgen.

      var user=User.deployed()

Dieser Bereitstellungsbefehl initialisiert den userName-Parameter nicht.

Wie übergebe ich _name mit Trüffel an diesen Vertrag?

Antworten (2)

In Truffle gehen Konstruktorparameter in /migrations. Also so etwas wie:

deployer.deploy(User, "foo");

User.deployed()wird ein Benutzervertrag sein, der mit _name="foo" bereitgestellt wurde

Es sollte eine Möglichkeit geben, einen Vertrag mit unterschiedlichen Konstruktorparametern zu erstellen, oder?
Sicher. Diese Zeile function User(string _name)definiert einen Parameter für den Konstruktor. Es können mehr oder andere Parameter vorhanden sein.
Ich meinte, den Vertrag mit anderen Parametern zu erstellen, nicht nur die Variablen zu ändern. Ich habe einen Vertrag, der das Eigentum am Vertrag beim Bau auf eine im Argument übergebene Adresse festlegt. Nur der Vertragsinhaber kann nachträglich Vertragsdaten ändern. Wenn ich jetzt deploy aufrufe, wird die Eigentümeradresse auf 0 gesetzt. Ich habe aus Ihrer Antwort verstanden, dass ich das von Migrationen ändern kann, aber einen Wert für meinen Parameter festlegen kann. Aber das bedeutet, dass ich jedes Mal Verträge mit demselben Eigentümer erstellen kann, ich möchte die Argumente von der Truffle-Konsole ändern können
So etwas wie Eigentümer wäre normalerweise eine nicht zufällige Adresse, z. B. ein anderer Vertrag oder Benutzer. Migrationsskripte sind JavaScript. Sie können eine Funktion in einem nicht verwandten Vertrag abfragen, um den richtigen Wert zu erhalten, und ihn dann weitergeben. Wirklich, jede Art und Weise, wie Sie die richtige Adresse ermitteln möchten, ist in Ordnung, und sie dann weiterzugeben. Ich frage mich, ob Sie hinter einem Fabrikmuster her sind. Das heißt, stellen Sie einen Vertrag bereit und verwenden Sie dann eine Funktion im Vertrag, um etwas anderes bereitzustellen, wobei die Factory bequem Eigentümer wird. Vielleicht ... ethereum.stackexchange.com/questions/13415/…

Betrachten wir den Testvertrag, in dem der Konstruktor zwei Parameter akzeptiert:

// 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 verwendet MyContract.new([arg1, arg2, ...], [tx params]) , um Parameter an den Konstruktor zu übergeben:

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

Beachten Sie, dass für den Zugriff auf Zustandsvariablen die Getter-Funktion verwendet wird .