Trufa "reemplazando" durante la migración

¿Qué significa "Reemplazar" en la migración?

un contrato de prueba simple C.sol:

pragma solidity ^0.4.17;

contract C{
    uint public ConstructorUint;

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

el archivo de migración 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);    
}

la trufa.js:

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

al iniciar Ganache y ejecutar en la terminal.

$ truffle migrate --network development

Encuentro que crear contratos sucedió, como se esperaba.

en la terminal en ejecución.

$ truffle networks

Solo encuentro un contrato C con el último en la dirección de los contratos C. empezar de nuevo cerrando Ganache y ejecutando

$ truffle networks --clean

esta vez lo intento

$ truffle develop

esto abre la consola de trufas donde desde la consola de trufas

truffle(develop)> migrate

Veo esto:

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...

de nuevo, reemplazando la palabra, así que uso las funciones de los contratos por "ContractName.at("ContractAddress").FunctionName(FunctionArguments)

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

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

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

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

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

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

como puede ver, los números 5, 1 y 4 existen. entonces los contratos también? sin embargo, desde una terminal separada vuelvo a verificar la red

$ truffle networks

y me sale esto:

Red: DESCONOCIDA (id: 4447) C: 0x30753e4a8aad7f8597332e813735def5dd395028 Migraciones: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0

sólo un contrato en la última dirección? Entonces, ¿qué sucede en una red que no es de prueba? ¿El contrato se implementa con migraciones muchas veces con diferentes valores de constructor como se esperaba o hace algo más inesperado? si hace lo inesperado, ¿qué es una solución alternativa para lograr una implementación múltiple del mismo contrato, como este?

Respuestas (1)

Buena observación, deployer.deploy(Cnumber0, 0);creará un contrato inteligente y lo implementará en la red. No importa cuántas veces hayas llamado.

Y cada contrato tendrá una identificación única y un almacén de datos único. Entonces, según su código de implementación

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

desea implementar 5 contratos inteligentes con diferentes argumentos. Entonces, según mi explicación anterior. Eth mantendrá un estado separado para cada contrato inteligente. De modo que una razón cuando la invoques obtendrá diferentes valores.

Una vez que se implementa el contrato, no puede modificar la lógica del contrato. Entonces, al escribir el contrato, debemos tener poco cuidado.