Comment tester les contrats intelligents Ethereum pour la restriction d’accès

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é?

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 trycatch. 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 message Ownable renvoie lorsqu’un appel viole le onlyOwner 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 du try 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.