Solidity

松露:為什麼我的“onlyOwner”修飾符沒有在松露中執行?

  • January 17, 2019

我正在使用 Solidity 網站提供的契約的簡化版本。我的契約如下:

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;
}
}

我的測試契約如下:

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");
}
}

我正在使用testrpc。所以首先我部署第一個合約:“truffle deploy”,然後我執行測試一個:“truffle test”。

問題:test2 通過但 test1 不能。如果我從 change() 中刪除“onlyOwner”,那麼 test1 可以通過。

問題:為什麼 test1 不能通過,解決方法是什麼?


請注意,這兩個合約的編譯都沒有任何錯誤。

它失敗是因為呼叫在內部TestMetacoin.test1(),當一個合約 A 呼叫另一個合約 B 時,B 內部的 msg.sender 就是 A 的地址。

  1. 所有者呼叫 TestMetacoin.test1()
  2. 在 TestMetacoin.test1() msg​​.sender 內部等於所有者地址
  3. test1() 呼叫 MetaCoin.change()
  4. MetaCoin.change()裡面的msg.sender是TestMetacoin的地址

您不能從穩固性契約中更改發件人,因此我建議從 javascript 端進行該測試,這可以輕鬆更改添加{from: "0x...." }到交易中的發件人。

引用自:https://ethereum.stackexchange.com/questions/25088