Error al crear un contrato - relacionado con el mapeo

Cuando creo un contrato ABC_Creator. Da el siguiente error. El código funciona bien para la intención. Me pregunto por qué aparece este error, cuál es el código de operación no válido y qué se puede hacer para deshacerse de él. Gracias,

ingrese la descripción de la imagen aquí

pragma solidity ^0.4.17;

contract ABC {

    bytes32 public name;
    uint public value;

    function ABC(bytes32 _name, uint _val) public {
        name = _name;
        value = _val;
    }
}

contract ABC_Creator {

    ABC localABC;
    mapping (bytes32 => address[]) public abcMap;
    event Log(bytes32, uint);

    function createABC(bytes32 _name, uint _val) public {
        localABC = new ABC(_name, _val);
        abcMap[_name].push(localABC);
    }

    function getABCList(bytes32 _name) public {

        uint len = abcMap[_name].length;
        for (uint i = 0; i < len; i++) {
            Log(ABC(abcMap[_name][i]).name(), ABC(abcMap[_name][i]).value());
        }

    }


}

Respuestas (2)

Jugué con él y no encontré nada obviamente malo en el contrato, por lo que creo que podría concentrarse en el método detrás de escena que está usando para llamar al contrato (no se muestra).

Su código es compacto y me encontré forzado a entender claramente qué esperar. En particular, la uint _valque ambos contratos quieren podría ser fuente de confusión.

Puede generar fácilmente el OPCODE no válido saliendo del final de una matriz. Entonces, debes tener cuidado con lo que pides.

Considerar:

 1. ABC_Creator.createABC("rob",10)
 2. ABC_Creator.abcMap("rob",10)

Invalid Opcode. 

 3. ABC_Creator.abcMap("rob",0)

address: 0xf71...

¿Qué pasó?

Tomó un localABC("rob",10)(convertible a 0xf71....) y lo empujó a la matriz en abcMap" rob", lo que significa que ahora hay una matriz de 1 fila en abcMap["rob"]. Por lo tanto, está bien pedir la primera fila abcMap["rob"]pero no está bien pedir una fila diferente. Puedes confirmarlo con una pequeña función parareturn abcMap[_name].length;

¿Qué pasó con el 10? Se pasó al ABCat 0xf71...según las instrucciones.

comida para llevar principal. Eche un vistazo de cerca a la solicitud ofensiva. ¿Es razonable?

Aquí está funcionando:

ingrese la descripción de la imagen aquí

Espero eso ayude.

Gracias @RobHitchens. Gracias por la información, fue muy útil.

ABC_Creator debe tener un constructor.

Gracias @LSong, ¿cuál sería el contenido del constructor? ¿Tenemos que inicializar el mapeo, cómo?