Pruebe automáticamente quién puede retirar Ether de un contrato inteligente

¿Hay alguna manera de probar automáticamente quién puede retirar ether de un contrato inteligente? Necesito realizar esta prueba automáticamente. Así que no puedo inspeccionar manualmente las instrucciones.

¿Puedo diseñar un contrato inteligente de tal manera que sea fácil de probar? Quiero asegurarme de que solo el creador del contrato inteligente pueda retirar ether a través de una función específica. Puedo probar fácilmente que esta función existe, pero ¿cómo pruebo automáticamente que no existe ninguna otra función a través de la cual el creador (o cualquier otra persona) del contrato inteligente pueda retirar ether?

Actualizar :

Sé cómo diseñar un contrato inteligente de modo que solo el creador pueda retirar ether. Sin embargo, necesito probar automáticamente quién puede retirar ether de un contrato inteligente que se me ha otorgado.

Respuestas (2)

Un contrato inteligente puede tener muchas funciones, por lo que para lograr lo que desea, debe probar cada una de ellas de forma independiente. Tendría que pensar en todas las entradas posibles que se pueden dar a las funciones.

Ejemplo básico de TypeScript en un conjunto de pruebas de mocha:

describe("my exhaustive test suite", function() {
  it("checks that foo doesn't change the contract balance", async function() {
    const currentBalance: BigNumber = ...
    await myContract.foo();
    const balanceAfterContractCall: BigNumber = ... 
    expect(currentBalance).to.equal(balanceAfterContractCall);
  });
});

Tenga en cuenta que en el ejemplo anterior, la prueba no verifica específicamente que foono permita retiros, solo verifica la igualdad de saldos. A la persona que llama del contrato se le podría permitir retirarse, pero devolver inmediatamente una cantidad equivalente. Para verificar esto a fondo, tendría que escuchar a escondidas las transacciones internas .

En cualquier caso, lo que probablemente esté buscando es verificación formal y ejecución simbólica, no formas automatizadas de comprobar que una función hace o no hace algo. Esta es una tecnología de seguridad avanzada que puede demostrar matemáticamente que un programa hace lo que dice que hace. Consulte Awesome-Ethereum-Security para obtener más detalles.

Cree un propietario de variable de dirección privada. En tu constructor asigna tu dirección como propietario. Cree un modificador llamado isOwner. Use este modificador en la función de retiro, esto verificará automáticamente si la persona que retira el monto es propietario o no.

Esto debería ser fácil de probar en trufa.

¿Cómo pruebo automáticamente que no existe ninguna otra función a través de la cual el creador (o cualquier otra persona) del contrato inteligente pueda retirar ether?

Simplemente no hagas ninguna función de este tipo. Si es así, utilice el modificador.

Espero eso ayude.

Gracias. Para aclarar: no siempre soy el creador del contrato. Así que debo probar si existen otros métodos de retiro. Simplemente no crear tal función no resuelve el problema. Por lo tanto, su respuesta lamentablemente no responde a mi pregunta.