Solidity
松露:為什麼我的“onlyOwner”修飾符沒有在松露中執行?
我正在使用 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 的地址。
- 所有者呼叫 TestMetacoin.test1()
- 在 TestMetacoin.test1() msg.sender 內部等於所有者地址
- test1() 呼叫 MetaCoin.change()
- MetaCoin.change()裡面的msg.sender是TestMetacoin的地址
您不能從穩固性契約中更改發件人,因此我建議從 javascript 端進行該測試,這可以輕鬆更改添加
{from: "0x...." }
到交易中的發件人。