Comment tester les contrats intelligents Ethereum pour la restriction d’accès
La Truffle Suite nous permet d’écrire des tests en JavaScript et Solidity. Il est facile de tester le onlyOwner Le modificateur existe à l’aide de tests JavaScript car plusieurs comptes peuvent être injectés dans le lanceur de test. Envoyez le message à partir du mauvais compte et vous obtiendrez un retour.
Dans les tests Solidity, cela est plus difficile car tous les tests sont exécutés à partir d’une seule adresse: le contrat de test. Alors, comment pouvons-nous imiter cela dans les tests de Solidité?
La réponse: en utilisant un contrat proxy
En utilisant notre somethingSomethingTheOwnerCanDo() fonctionner comme la cible de notre test, nous avons besoin d’un test qui assure qu’il revient si quelqu’un d’autre que le propriétaire l’appelle.
Commençons par créer le ProxyContract, ce qui entraîne l’échec de l’appel, car ce n’est pas le propriétaire.
Dans nos tests, nous devons initialiser ce ProxyContract et appeler attemptNonOwnerCall avec l’instance de ExampleContract testé comme paramètre. Ce test doit confirmer que l’appel échouera. Nous pouvons le faire avec try–catch. Voici notre test:
Parcourons cette ligne par ligne:
-
testTargetest le contrat que nous testons, avec la fonction restreinte - Nous créons un nouveau
proxyContrat -
expectedReasonest le messageOwnablerenvoie lorsqu’un appel viole leonlyOwnermodificateur - Nous essayons d’appeler la fonction restreinte via notre
proxy, qui n’est pas le propriétaire, nous nous attendons donc à une erreur - S’il n’y a pas d’erreur, le
revertla commande est exécutée à l’intérieur dutrybloquer, provoquant l’échec de notre test - S’il y a une erreur, le
catchest invoqué, et nous affirmons que c’est l’erreur que nous attendions:expectedReason
Cela ne fonctionne que parce que le propriétaire de ExampleContract est notre contrat de test (le contrat qui a initialisé ExampleContract), et le msg.sender de l’appel à somethingSomethingTheOwnerCanDo() est le ProxyContract, qui a une adresse différente.

