Trüffel "Ersetzen" während der Migration

Was bedeutet "Ersetzen" bei der Migration?

ein einfacher Testvertrag C.sol:

pragma solidity ^0.4.17;

contract C{
    uint public ConstructorUint;

    function C(uint SetConstructorUint)public{
        ConstructorUint = SetConstructorUint;
    }
} 

die Migrationsdatei 99_migration.js:

var Cnumber0 = artifacts.require("C"); 
var Cnumber1 = artifacts.require("C");
var Cnumber2 = artifacts.require("C"); 
var Cnumber3 = artifacts.require("C"); 
var Cnumber4 = artifacts.require("C"); 
var Cnumber5 = artifacts.require("C"); 

module.exports = function(deployer) {
    deployer.deploy(Cnumber0, 0);
    deployer.deploy(Cnumber1, 1);
    deployer.deploy(Cnumber2, 2);
    deployer.deploy(Cnumber3, 3);
    deployer.deploy(Cnumber4, 4);
    deployer.deploy(Cnumber5, 5);    
}

die truffle.js:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    }
  }
};

beim Starten von Ganache und Ausführen im Terminal.

$ truffle migrate --network development

Ich finde, dass das Erstellen von Verträgen wie erwartet passiert ist.

im Terminal läuft.

$ truffle networks

Ich finde nur einen C-Vertrag mit der letzten Adresse der C-Verträge. Beginnen Sie von vorne, indem Sie Ganache schließen und ausführen

$ truffle networks --clean

Diesmal versuche ich es

$ truffle develop

Dies öffnet die Trüffelkonsole, wo von der Trüffelkonsole

truffle(develop)> migrate

Ich sehe es:

Saving artifacts... Running migration: 99_migration.js Deploying C... ... 0xf56571c947f71fa8d3220ce2707accdf97a00a3ac2042d18dcff0410e26bf476
C: 0x345ca3e014aaf5dca488057592ee47305d9b3e10 Replacing C... ... 0x17acd2015ea93445bca90c4f207073a7f86eb3556de00936e78f6fd4fe67c7a3
C: 0xf25186b5081ff5ce73482ad761db0eb0d25abfbf Replacing C... ... 0xcc2a645db6d4c32405ab3c771069262370512689de895a6374b78b72d73b12c8
C: 0x8f0483125fcb9aaaefa9209d8e9d7b9c8b9fb90f Replacing C. .. ... 0xac0d4f51c458e28fc3ecc871994e03e3aed86032dd881cf7dd57f2dffb58d378
C: 0x9fbda871d559710256a2502a2517b794b482db40 Replacing C... ... 0xf6cded7c4228a00cc2f12287417b0c697dec09635c013e28440d10dea7fc0565
C: 0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4 Replacing C... ... 0x539e27630c8881957a07ded94f9f2fb60963e505991eec1a588893e96d80b654
C: 0x30753e4a8aad7f8597332e813735def5dd395028 Saving successful migration to network... ... 0x68e7f2440f71ec0386d4214eb0c3e2346112dd1073495fc2ef1c8244691e5684 Saving artifacts...

wieder das Wort ersetzen damit ich die Funktionen der Verträge verwende durch "ContractName.at("ContractAddress").FunctionName(FunctionArguments)

truffle(develop)> C.at("0x30753e4a8aad7f8597332e813735def5dd395028").ConstructorUint()

{ [String: '5'] s: 1, e: 0, c: [ 5 ] }

truffle(develop)> C.at("0xf25186b5081ff5ce73482ad761db0eb0d25abfbf").ConstructorUint()

{ [String: '1'] s: 1, e: 0, c: [ 1 ] }

truffle(develop)> C.at("0x2c2b9c9a4a25e24b174f26114e8926a9f2128fe4").ConstructorUint()

{ [String: '4'] s: 1, e: 0, c: [ 4 ] }

wie Sie sehen können, existieren die Nummern 5, 1 und 4. Also die Verträge auch? aber von einem separaten Endgerät prüfe ich nochmal das Netz durch

$ truffle networks

und ich bekomme das:

Netzwerk: UNBEKANNT (ID: 4447) C: 0x30753e4a8aad7f8597332e813735def5dd395028 Migrationen: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0

nur ein Vertrag an der letzten Adresse? Was also in einem Nicht-Testnetz passiert, wird der Vertrag wie erwartet viele Male mit Migrationen mit unterschiedlichen Konstruktorwerten bereitgestellt oder tut er etwas anderes Unerwartetes. Wenn es das Unerwartete tut, was ist eine Problemumgehung, um eine mehrfache Bereitstellung desselben Vertrags wie diesen zu erreichen.

Antworten (1)

Schöne Beobachtung, deployer.deploy(Cnumber0, 0);wird Smart Contract erstellen und im Netzwerk bereitstellen. Es spielt keine Rolle, wie oft Sie angerufen haben.

Und jeder Vertrag hat eine eindeutige ID und einen eindeutigen Datenspeicher. Also gemäß Ihrem Bereitstellungscode

var Cnumber0 = artifacts.require("C"); 
var Cnumber1 = artifacts.require("C");
var Cnumber2 = artifacts.require("C"); 
var Cnumber3 = artifacts.require("C"); 
var Cnumber4 = artifacts.require("C"); 
var Cnumber5 = artifacts.require("C");



module.exports = function(deployer) {
    deployer.deploy(Cnumber0, 0);
    deployer.deploy(Cnumber1, 1);
    deployer.deploy(Cnumber2, 2);
    deployer.deploy(Cnumber3, 3);
    deployer.deploy(Cnumber4, 4);
    deployer.deploy(Cnumber5, 5);    
}

Sie möchten 5 Smart Contracts mit unterschiedlichen Argumenten bereitstellen. Also nach meiner obigen Erklärung. Eth behält für jeden Smart Contract einen separaten Zustand bei. Damit ein Grund beim Aufrufen unterschiedliche Werte erhält.

Sobald der Vertrag bereitgestellt ist, können Sie die Vertragslogik nicht mehr ändern. Beim Schreiben von Verträgen müssen wir also etwas vorsichtig sein.