¿Cómo puedo comprobar si un contrato se ha autodestruido en Solidity?

Tengo un problema: tengo una fábrica de contratos que crea algunos contratos temporales. Quiero que cada contrato exista durante unos 5 días, luego se autodestruye. Sin embargo, quiero crear un directorio que almacene las direcciones de todos los contratos temporales y los enumere para usted. Registrar los contratos temporales en el directorio de contratos no es un problema, simplemente no sé cómo puedo averiguar si todavía existe un contrato para que los contratos destruidos no aparezcan más.

Gracias de antemano.

¿Entiendo correctamente que desea encontrar una forma de Solidity para determinar si un contrato ya se ha autodestruido?
si, eso es exactamente lo que quiero

Respuestas (2)

Después de que se haya llamado a un contrato selfdestruct(), todos los valores se establecen en 0. Así que si tienes un contrato como:

contrato mortal {
    dirección pública titular;

    funcion Mortal() {
        propietario = mensaje.remitente;
    }

    función matar () {
        autodestrucción(propietario);
    }

Luego desde otro contrato puedes llamar:

función comprobarMortal(dirección mortal) {
    if (Mortal(mortal).propietario() == 0) {
        // Sabes que está muerto.
    } más {
        // Sabes que está vivo.
    }
}

Actualizar:

En las versiones más nuevas de Solidity que apuntan a byzantium o posterior, es probable que esto falle. Solidity ahora verifica el tamaño de los datos de retorno para saber si la llamada falló, por lo que cuando owner()no devuelve nada, ni siquiera 0, revertirá la transacción. La mejor manera de hacer esto ahora es probablemente usar extcodesize dentro del ensamblado de solidez . Esto solo le dirá que se autodestruyó si sabe que anteriormente tenía un tamaño de código distinto de cero.

Mortal no toma parámetros... ¿cómo es Mortal(mortal)posible entonces?
Mortal(mortal)no es un constructor, es una instanciación de Mortalat address mortal.
La creación de instancias llama al constructor para Mortal. Sin embargo, el constructor no toma parámetros, entonces, ¿cómo Mortal(mortal)no puede arrojar un error?
Para la iluminación de los transeúntes: en realidad no es un constructor. Vea esta pregunta para la explicación completa.
@JossieCalderon En todo caso, es más como un elenco que como un constructor.
@Xavier Leprêtre B9lab, lo siento, Xavier, dijiste "es probable que falle", no sé a qué te refieres con "esto". Si habla de "autodestrucción", no falla, vea mi publicación en 2022: ethereum.stackexchange.com/questions/92585/…
En la pregunta que vinculaste hablas de selfdestruct. La falla de la que estoy hablando es sobre .owner(). Esta .owner()llamada fallará.

Llamar al propietario del método () en un contrato inexistente debería fallar (lanzar una excepción), no devolver 0 como se sugiere.

Puede llamar si algo se ha implementado en una dirección determinada usando:

function contractExists(address contract) public view returns (bool) {
    uint size;
    assembly {
        size := extcodesize(contract)
    }
    return size > 0;
}