Solidity
在 truffle 測試中部署合約的地址是什麼
我有一個名為 AccessControl 的契約,其中契約的所有者是在部署時設置的。
我想測試它的方法
setCEO
是否正確更新,但為了做到這一點,請求必須來自契約的所有者。contract AccessControl { address public ceoAddress; modifier onlyCEO() { require(msg.sender == ceoAddress); _; } function setCEO(address _newCEO) external onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } }
當我在測試中 console.log 時,目前的 ceoAddress 如下所示:
const paymentPipe = await PaymentPipe.deployed(); console.log(await paymentPipe.ceoAddress());
我看到地址是0x0000000000000000000000000000000000000000。
當我嘗試在我的測試中從該帳戶呼叫 setCEO 時,如下所示:
await paymentPipe.setCEO(bob, {from: contractAddress});
松露抱怨:
錯誤:無法辨識發件人帳戶
如果我嘗試使用 truffle 測試套件中的任何其他帳戶(即帳戶
$$ x $$) 我得到:
錯誤:處理事務時出現 VM 異常:還原
暗示該方法沒有通過 require 語句,因為呼叫地址不是設置為 CEO 的地址。
truffle 測試套件中部署的合約地址是什麼?為什麼,如果我可以在我的合約中看到一個地址為 0x0000000000000000000000000000000000000000,我不能使用這個地址來呼叫函式嗎?
我認為您的問題出現是因為
ceoAddress
沒有正確初始化,並且它將具有0x0000000000000000000000000000000000000000
.現在要更改它的契約要求
msg.sender == ceoAddress
,這意味著msg.sender
應該是0x0000000000000000000000000000000000000000
。由於您沒有生成此類地址的私鑰,因此無法執行此操作。一種選擇是使用發件人帳戶在建構子中初始化變數
contract AccessControl { address public ceoAddress; modifier onlyCEO() { require(msg.sender == ceoAddress); _; } constructor() { // ---- Initialize ceoAddress ---- ceoAddress = msg.sender; } function setCEO(address _newCEO) external onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } }
Truffle 使用返回的第一個地址
eth.accounts
來部署合約。2_deploy_contracts.js
module.exports = function(deployer, network, accounts) { // You can pass other parameters like gas or change the from deployer.deploy(AccessControl, { from: accounts[2] }); }
查看Truffle 文件以獲取更多使用選項。