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.
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(mortal)
posible entonces?Mortal(mortal)
no es un constructor, es una instanciación de Mortal
at address mortal
.Mortal
. Sin embargo, el constructor no toma parámetros, entonces, ¿cómo Mortal(mortal)
no puede arrojar un error?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;
}
Xavier Leprêtre B9lab
Robot X