Truffle: Warum läuft mein „onlyOwner“-Modifikator nicht in Truffle?

Ich verwende eine vereinfachte Version eines Vertrags, der von der Solidity-Website bereitgestellt wird. Mein Vertrag lautet wie folgt:

pragma solidity ^0.4.4;

import "./ConvertLib.sol";
contract MetaCoin {
   address owner;
   uint val;    

   function MetaCoin() {
       owner= msg.sender;
  }

    modifier onlyOwner {
    require (msg.sender==owner);
    _;
  }
  function change() onlyOwner{
  val=55;
 }
 function get_owner() returns (address){
 return owner;
 }
}

Und mein Testvertrag ist wie folgt:

pragma solidity ^0.4.2;

 import "truffle/Assert.sol";
 import "truffle/DeployedAddresses.sol";
 import "../contracts/MetaCoin.sol";

 contract TestMetacoin {

 function test1(){
 MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
 meta.change();
 }

 function test2(){
 MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
 Assert.equal(meta.get_owner(), msg.sender, "I must be the owner");
}
}

Ich verwende testrpc. Also stelle ich zuerst den 1. Vertrag bereit: „Trüffelbereitstellung“ und dann führe ich den Testvertrag aus: „Trüffeltest“.

Problem : Test2 wird bestanden, Test1 jedoch nicht. Wenn ich "onlyOwner" aus change() entferne, kann test1 bestehen.

Frage : Warum kann test1 nicht bestehen und was ist die Lösung?


Bitte beachten Sie, dass beide Verträge fehlerfrei erstellt werden.

Mit Ihrem Beispiel stimmt etwas nicht, da MetaCoines keine testMethode hat, es sollte immer fehlschlagen. Meintest du changestatt test? Können Sie in einem solchen Fall die genaue Fehlermeldung von Trüffel eingeben?
@Ismael Danke für deinen Kommentar. Trüffel ermöglicht es Ihnen, Ihren Vertrag mit den Befehlen „bereitzustellen“ und „zu testen“: truffle deploy und truffle test. Sie müssen keine Testmethode in Ihrem Code haben. Siehe hier: truffleframework.com/docs/getting_started/testing
Ich meine, meta.test();ist falsch, weil Metacoin keine test()Methode hat.

Antworten (1)

Es schlägt fehl, weil der Anruf intern ist TestMetacoin.test1()und wenn ein Vertrag A einen anderen Vertrag B anruft, dann ist msg.sender innerhalb von B die Adresse von A.

  1. Besitzer ruft TestMetacoin.test1() auf
  2. Innerhalb von TestMetacoin.test1() ist msg.sender gleich Besitzeradresse
  3. test1() ruft MetaCoin.change() auf
  4. Innerhalb von MetaCoin.change() ist msg.sender die Adresse von TestMetacoin

Sie können den Absender nicht innerhalb eines Soliditätsvertrags ändern, daher würde ich vorschlagen, diesen Test von der Javascript-Seite aus durchzuführen, wodurch der Absender leicht geändert werden kann, indem {from: "0x...." }er der Transaktion hinzugefügt wird.

Danke für die klare Antwort! Ich kann Sie nicht positiv bewerten, da ich noch nicht genug "Reputation" habe.