Was sind Trüffelwanderungen?

Wie in Truffle docs geschrieben :

Migrationen sind Javascript-Dateien, die Ihnen helfen, Verträge im Ethereum-Netzwerk bereitzustellen. Diese Dateien sind für die Bereitstellung Ihrer Bereitstellungsaufgaben verantwortlich und werden unter der Annahme geschrieben, dass sich Ihre Bereitstellungsanforderungen im Laufe der Zeit ändern werden. Während sich Ihr Projekt weiterentwickelt, erstellen Sie neue Migrationsskripte, um diese Entwicklung in der Blockchain voranzutreiben. Ein Verlauf der zuvor durchgeführten Migrationen wird in der Kette durch einen speziellen Migrationsvertrag aufgezeichnet, der unten detailliert beschrieben wird.

Aber was bedeutet es wirklich? Was sind die Anwendungsfälle von Migrationen?

Ich versuche auch, die Datei Migrations.sol zu verstehen, die im Truffle - Tutorial angegeben ist:

contract Migrations {
  address public owner;
  uint public last_completed_migration;

  modifier restricted() {
    if (msg.sender == owner) _
  }

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

  function setCompleted(uint completed) restricted {
    last_completed_migration = completed;
  }

  function upgrade(address new_address) restricted {
    Migrations upgraded = Migrations(new_address);
    upgraded.setCompleted(last_completed_migration);
  }
}

Antworten (3)

Der MigrationsVertrag speichert (in last_completed_migration) eine Nummer, die dem zuletzt angewendeten „Migrations“-Skript entspricht, das sich im migrationsOrdner befindet. Die Bereitstellung dieses MigrationsVertrags ist sowieso immer der erste derartige Schritt. Die Nummerierungskonvention ist x_script_name.js, xbeginnend bei 1. Ihre Echtfleischverträge würden normalerweise in Skripten beginnend bei 2_....

Da dieser MigrationsVertrag also die Nummer des zuletzt angewendeten Bereitstellungsskripts speichert, führt Truffle diese Skripte nicht erneut aus. Andererseits muss für Ihre App in Zukunft möglicherweise ein geänderter oder neuer Vertrag bereitgestellt werden. Dazu erstellen Sie ein neues Skript mit einer erhöhten Nummer, das die auszuführenden Schritte beschreibt. Dann wiederum, nachdem sie einmal gelaufen sind, werden sie nicht noch einmal laufen.

Und ja, die letzten 2 Zeilen sind wahre Solidity. Sehen Sie sich http://solidity.readthedocs.io/en/latest/contracts.html#creating-contracts inside an contract OwnedToken {.

Warum brauchen wir Migrationen? Ich verstehe Datenbankmigrationen. Sie enthalten die im DB-Schema vorgenommenen Änderungen. Mit DB-Migrationen können Sie Ihr DB-Schema aktualisieren und zum vorherigen Schema zurückkehren. Hat es hier die gleiche Bedeutung?
Migrationen funktionieren hier ähnlich, aber rudimentärer. Es verfolgt nur den letzten Schritt und erlaubt kein Rollback. Ein Rollback ist nicht wirklich möglich, da Ethereum selbst dies nicht zulässt.
Migrationen sind Dateien, die helfen, neue Änderungen im Vertrag in der Ethereum-Blockchain bereitzustellen. Und dieser Migrationsvertrag hilft dabei, den Überblick zu behalten, welche Migrationen bereits durchgeführt wurden. Der Prozess besteht also darin, eine neue Migrationsdatei mit einer erhöhten Nummer zu erstellen und bereitzustellen, indem Sie einfach Truffle Migration ausführen. Truffle weiß anhand der Dateinummer und des last_completed_migration-Werts in der Blockchain, welche Migrationen ausgeführt werden sollen. Ist das richtig?
Ja das ist korrekt.
aber wen interessiert es? Warum sollte mich die Vertragsversion interessieren? Ich sehe keine Verbindung zwischen der Migrationsdatei und dem echten Vertrag (der von mir bereitgestellten Dapp). Darüber hinaus sehe ich keinen Versuch, den "letzten Schritt" zu aktualisieren. Das einzige, was ich sehe, ist die Bereitstellung eines neuen Migrationsvertrags für die Blockchain
Erlaubt dies den ursprünglichen Erstellern, Vertragsklauseln nach der Bereitstellung ohne Forking zu ändern?
Ist es nicht möglich, denselben Vertrag an derselben Adresse erneut bereitzustellen, wird der Vertrag bei der Migration an einer neuen Adresse bereitgestellt, sodass Benutzer des Vertrags darauf achten sollten, keinen ungültigen oder instabilen Vertrag zu verwenden. Der beste Weg, dies zu vermeiden, besteht darin, Verträge zu erstellen und die Logik vom Hauptvertrag zu trennen, sodass Sie Änderungen einfach in einem anderen Vertrag erneut bereitstellen und die Adresse des „Backend“-Vertrags im Hauptvertrag aktualisieren. Eine weitere Option ist die Verwendung von the ens, das eine Art von DNSSmart Contracts ist.
Völlig einverstanden mit @gor, es ist mir wirklich egal, was die Migrationsversion ist, und ich möchte jedes Mal völlig neue Zweigverträge bereitstellen. Ich benutze Rails seit 16 Jahren, diese Migration ist nicht notwendig und das gleiche gilt für die traditionelle Datenbankmigration. Ich weiß nicht, warum trufflekommt mit migration.
In jüngerer Zeit haben Teams Proxy-Verträge verwendet, um eine Änderung des Vertragscodes nachzuahmen. Eine Migration wäre ein sehr gutes Werkzeug, um die zu unternehmenden Schritte zu formalisieren und die Änderung des zugrunde liegenden Codes des Proxys zu verfolgen.

Hier ist ein Beispiel für einen echten Anwendungsfall von Truffle-Migrationen.

Ich habe einen Speichervertrag und einen Schnittstellenvertrag. Die Schnittstelle muss wissen, wo sich der Speicher befindet, und der Speicher muss der Schnittstelle Berechtigungen erteilen.

Also stelle ich bei der zweiten Migration (die erste ist für Truffle Housekeeping reserviert) den Speicher bereit:

var MEStorage = artifacts.require("./MEStorage.sol");

module.exports = function(deployer) {
  deployer.deploy(MEStorage);
};

Und im dritten erhalte ich die Speicheradresse und die Bereitstellungsschnittstelle mit dieser Adresse als Parameter. Und nachdem ich die Schnittstellenadresse habe, erteile ich ihr Berechtigungen im Speicher:

var MEInterface = artifacts.require("./MEInterface.sol");
var MEStorage = artifacts.require("./MEStorage.sol");

module.exports = function(deployer) {
  deployer.deploy(MEInterface, MEStorage.address).then(() => {
    MEStorage.deployed().then(storageInstance => {
        return storageInstance.setPermissions(MEInterface.address, 2);
        // 2 - is FULL access
    });
  });
};

Hier ist ein Video, das diesen Anwendungsfall erklärt, und ein Artikel über das von mir verwendete Speichermuster .

Migrationen sind eine Reihe von Boilerplates, die Truffle benötigt und die Sie kopieren und einfügen und dann vergessen, dass Sie es jemals getan haben.