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:
-
testTarget
est le contrat que nous testons, avec la fonction restreinte - Nous créons un nouveau
proxy
Contrat -
expectedReason
est le messageOwnable
renvoie lorsqu’un appel viole leonlyOwner
modificateur - 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
revert
la commande est exécutée à l’intérieur dutry
bloquer, provoquant l’échec de notre test - S’il y a une erreur, le
catch
est 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.