Truffle Migration: So stellen Sie einen Vertrag bereit, dessen Konstruktor einen Parameter akzeptiert

Ich verwende Truffle Version 4, um einen einfachen Smart Contract zu entwickeln, und stecke bei etwas fest, von dem ich denke, dass es ein sehr grundlegendes Missverständnis widerspiegelt, das ich einfach nicht verstehen kann.

Hier ist mein einfacher Vertrag, incontracts/BaconSupplier.sol

contract BaconMaker {
    address public pig;
    address public owner;

    function BaconMaker(address _pig) public {
        require(_pig != 0x0);
        owner = msg.sender;
        pig = _pig;
    }
}

Und meine Bereitstellungsmigration, inmigrations/2_deploy_contracts.js

const BaconMaker = artifacts.require('./BaconMaker.sol')

module.exports = (deployer) => {
  deployer.deploy(BaconMaker)
}

Ich laufe truffle developdann, um in die Standard-Entwicklungsumgebung von Truffle zu gelangen

compile

=> lässt sich gut kompilieren

Compiling ./contracts/BaconMaker.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts

dann

migrate

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x9e8257089a048815b4593a87ae5ae22af7dab80f74c07a98a0cf0a2ba08234a1
  Migrations: 0xee08e5e6643952b3cb22642d2a04a2992141eddd
Saving successful migration to network...
  ... 0x9845c22c3db695912cb4958c9f8071b9a2ac8853b226367c3f969a0f54510fe9
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying BaconMaker...
  ... 0xdcb442cda2621bbcd648813a567f70761746fb583a502746670f63a558a9a5e8
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: invalid opcode

Wenn ich die Zeile require(_pig != 0x0);jedoch entferne, läuft die Migration einwandfrei, was für mich impliziert, dass der Migrationsprozess tatsächlich versucht, eine Instanz des BaconMakerVertrags zu erstellen.

Ich glaube, ich verstehe nicht wirklich, was die Migrationen hier machen oder was tatsächlich mit der Bereitstellung passiert.

Das längerfristige Ziel ist, dass es einen FarmVertrag gibt, der eine eigene Aufzeichnung führt, pigsund für jedes Schwein gibt es eine zugehörige BaconMaker(ignorieren Sie die Logik vorerst, ich verwende hier nur Schweine und BaconMakers anstelle der eigentlichen Verträge entwickelt werden.)

So Farmwürde der Vertrag aussehen

import './BaconMaker.sol';

contract Farm {
    address public owner;
    mapping(address => bool) public pigs;
    BaconMaker[] public baconMakers;

    function Farm() {
        owner = msg.sender;
    }

    function addPig(address pig) external {
        require(pig != 0x0);
        require(msg.sender == owner);
        pigs[pig] = true;
        BaconMaker baconMaker = new BaconMaker(pig);
        baconMakers.push(baconMaker);
    }

}

Benötige ich in diesem Fall deployden BaconMakerVertrag tatsächlich während der Migration oder wird er bei Aufruf für mich bereitgestellt addPig?

Wenn nicht, wie stelle ich den BaconMakerVertrag in der Migrationsphase bereit?

Antworten (1)

Sie können die Konstruktorparameter als zusätzliche Argumente zum deploy()Aufruf hinzufügen

const BaconMaker = artifacts.require('./BaconMaker.sol')

module.exports = (deployer, network, accounts) => {
  const userAddress = accounts[3];
  deployer.deploy(BaconMaker, userAddress)
}

Da Farm BaconMaker in Ihrem Fall bei Bedarf erstellt, müssen Sie BaconMaker nicht über die Bereitstellungsskripts bereitstellen.

Es gibt keine allgemeine Lösung, die für alle Situationen geeignet ist. Manchmal erstellen Sie einen einzelnen Vertrag, der untergeordnete Verträge bereitstellt. Sie können auch mehrere Verträge bereitstellen und sie nach der Bereitstellung zu einem Register hinzufügen, damit sie miteinander kommunizieren können.

Ein Einzelvertrag ist am einfachsten, aber Sie sind an das Blockgaslimit gebunden. Mehrere Verträge zu haben ist komplexer, weil es nicht einfach ist, zwischen ihnen zu kommunizieren, und Sie müssen sorgfältiger mit der Organisation umgehen.