Solidity

在 truffle 測試中部署合約的地址是什麼

  • August 10, 2018

我有一個名為 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 文件以獲取更多使用選項。

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