Rechazar Transferir Propiedad Smart Contract Solidity

Encontré el siguiente código para fines de propiedad de contratos inteligentes de solidez.

contract owned {
    address public owner;

    function owned() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) onlyOwner public {
        owner = newOwner;
    }
}

Me gustaría saber si es posible rechazar la propiedad de un contrato que es transferido por el propietario de ese contrato a la dirección de su contrato (o su EOA)

La razón por la que hago esta pregunta es para evitar el siguiente escenario

  • Bob es propietario del contrato C1 y Alice es propietaria del contrato C2
  • El contrato C1 puede retirar automáticamente ether (generalmente cualquier token) de la dirección del propietario y enviarlo al EOA de Bob. En otras palabras, es un contrato malicioso que puede hacer cosas malas.
  • Bob llama a la función transferOwnership of contract C1 y transfiere la propiedad a la dirección del contrato C2 o al EOA de Alice.
  • Contrato C2 o Alice se convierte en propietaria del contrato C1
  • El contrato C1 comienza a retirar el saldo de su nuevo propietario = Contrato C2 o Alice, y lo envía al EOA de Bob

Respuestas (2)

No es posible que una dirección rechace ser utilizada como titular en otro contrato.

Además, el "ataque" que describió no funcionará, ya que un contrato no puede tomar éter o tokens mágicamente de otro contrato o cuenta de propiedad externa.

En el caso de ether, un contrato nunca puede tomar ether de una cuenta de propiedad externa, a menos que la cuenta transfiera ether al contrato (lo que requiere una transacción regular). En caso de otro contrato, un contrato sólo podrá retirar ether de otro si el segundo contrato expone una función o algún método para hacerlo. En un contrato bien escrito, este método estaría protegido contra direcciones aleatorias que lo invoquen.

Para tokens, la approvefunción dentro de ERC20 (o funciones equivalentes en otras implementaciones) debe usarse para autorizar a una dirección a retirar del saldo de otra. Siempre que Alice no lo haya llamado, Bob no puede simplemente establecer a Alice como propietaria de un contrato y hacer que ese contrato comience a retirar los tokens de Alice.

Cualquier contrato inteligente no puede retirar automáticamente ETHER del EOA del usuario. Debido a que las funciones de contrato necesitan que la transacción se firme desde el EOA del usuario, de lo contrario, esa transacción no será válida en la red. Por lo tanto, nadie puede dejar de convertirlo en propietario de ningún contrato, pero no hay ninguna API que permita que el contrato inteligente retire ether de la cuenta EOA de nadie.