Casi todos los tutoriales recomiendan un código como este para un modificador de permisos .
modifier isAdmin() {
if(msg.sender != owner) {
throw;
}
_
}
Pero, ¿no sería más simple usarlo sin una declaración de lanzamiento (AFAIU también ahorraría gasolina al usuario ):
modifier isAdmin() {
if(msg.sender == owner) _
}
Como lo describe ConsenSys en Ethereum Contract Security Techniques and Tips pero solo para estos modificadores:
modifier stopInEmergency { if (!stopped) _ }
modifier onlyInEmergency { if (stopped) _ }
Si envía algo de ether en la transacción, se devuelve al remitente cuando hay un lanzamiento (ver esto ). En su ejemplo, si envió algunos fondos (en msg.value
), y la condición del modificador no se cumple, su dinero se ha ido, pero el código después del modificador no se ejecuta (y si se suponía que la función devolvería algo, devolvería solo los valores predeterminados para los parámetros, por lo que es posible que ni siquiera sepa que sucedió algo malo).
Tienes razón sobre el gas, en caso de que haya un lanzamiento, todo el gas se consume.
Xavier Leprêtre B9lab
throw
es comoROLLBACK
en SQL.Takeshi