Error encontrado durante la ejecución del contrato [Destino de salto incorrecto]

Al llamar para start()funcionar en un contrato inteligente, la transacción falla con este mensaje:

¡Advertencia! Error encontrado durante la ejecución del contrato [Destino de salto incorrecto]

De acuerdo con Error durante la ejecución del contrato de token ... un índice de matriz no válido definitivamente genera este mensaje. Así que lo he estado pensando, tratando de averiguar cuándo mi código está usando un índice no válido, pero no puedo encontrarlo.

Este es el método solicitado:

function start(address seller, address thirdParty) returns (uint escrowId) {
    escrowId = numEscrows;
    numEscrows++;
    escrow e;
    e.thirdParty = thirdParty;
    e.seller = seller;
    e.buyer = msg.sender;
    e.amount = msg.value;
    e.recipient = seller;
    e.status = 1; // started

    escrows[escrowId] = e;

    return escrowId;
}

La única matriz allí se escrows[]declara comomapping (uint => escrow) escrows;

Después de probar diferentes cosas, llegué a la conclusión de que el problema seguramente se encuentra en la última línea:escrows[escrowId] = e;

¿No es posible hacer tal asignación escrows[0] = e;? ¿Por que no?

¿Qué estoy haciendo mal? ¿Cómo puedo depurarlo?

Respuestas (1)

start(...)y start1(...)hay dos formas en que puede reescribir su función para que funcione como se espera:

pragma solidity ^0.4.0;
contract Ballot {
    struct Escrow {
        address thirdParty;
        address seller;
        address buyer;
        uint amount;
        address recipient;
        uint status;
    }
    uint numEscrows;
    mapping (uint => Escrow) escrows;

    function start(address seller, address thirdParty) returns (uint escrowId) {
        escrowId = numEscrows;
        numEscrows++;
        Escrow memory e;
        e.thirdParty = thirdParty;
        e.seller = seller;
        e.buyer = msg.sender;
        e.amount = msg.value;
        e.recipient = seller;
        e.status = 1; // started

        escrows[escrowId] = e;

        return escrowId;
    }

    function start1(address seller, address thirdParty) returns (uint escrowId) {
        escrows[numEscrows].thirdParty = thirdParty;
        escrows[numEscrows].seller = seller;
        escrows[numEscrows].buyer = msg.sender;
        escrows[numEscrows].amount = msg.value;
        escrows[numEscrows].recipient = seller;
        escrows[numEscrows].status = 1; // started
        numEscrows++;
        return numEscrows;
    }
}

Y aquí está el compilador en tiempo real de Solidity y la pantalla de tiempo de ejecución que muestra que ambos start(...)y se start1(...)ejecutan sin generar una excepción:

ingrese la descripción de la imagen aquí

Tenga en cuenta que start1(...)cuesta menos gasolina que start(...).

En start(...), agregué la palabra clave de memoria ; consulte ¿Qué es la palabra clave de memoria? ¿Qué hace? , ¿Diferencia entre memoria y almacenamiento? y ¿Qué hace exactamente la palabra clave "memoria"? para mayor información.

En su pregunta, mencionó "La única matriz que hay escrows[] declarada como mapping (uint => escrow) escrows;". Tenga en cuenta que las matrices son diferentes de las asignaciones; consulte Matrices frente a asignaciones y Almacenar datos en asignación frente a matriz .

La memoria de la bandera parece haber resuelto todos mis problemas. ¡Gracias!