Solidity
在測試中設置 msg.sender
我有一個操縱對象的 Solidity 函式。該函式只允許呼叫者 msg.sender 的這種操作是該對象的所有者。像這樣的東西:
function Manipulate(uint i) { require(msg.sender == data[i].owner, "Sender is not owner."); <manipulate object>; }
在我正在編寫的測試中,我正在製作一個測試案例來檢查此函式是否按預期執行。我有 2 個使用者帳戶:
user1 = accounts[0]; user2 = accounts[1];
user2 是我要操作的對象的所有者。我在測試中執行以下呼叫:
await instance.Manipulate.call(10, {from: user2});
出乎我的意料,這觸發了我的solidity 函式的Require 語句。所以它聲稱 msg.sender 與所有者不同。我修改了 Require 語句中的字元串,因此它還列印了 msg.sender 和我想要操作的對象的所有者。我看到的是 user2 確實是對象的所有者。但是,msg.sender 不是 user2 而是 user1。這很奇怪,因為我用 {from: user2} 呼叫 Manipulate() 函式。所以我不明白為什麼 user1 是 msg.sender。
任何人都知道為什麼 user1 是 msg.sender 以及為什麼 {from: user2} 語句沒有使 user2 成為 msg.sender ?
在 require 語句中將“=”替換為“==”:
require(msg.sender == data[i].owner, "Sender is not owner.");