Solidity

使用介面不需要使用已部署的合約嗎?

  • October 4, 2022

我一直在練習 Ethernaut 電梯問題。在這段程式碼中,它只是傳遞msg.sender給 Building 介面。但是,我認為它應該通過 Building 的已部署合約地址來使用接​​口。使用介面不需要使用已部署的合約嗎?

我在下面的連結中找到了關於帶有介面的 msg.sender 的答案,It's just interpreting msg.sender as a type Building, no constructor is involved, it's just a type casting.但我真的不明白為什麼將 msg.sender 解釋為 Building 類型。

將 msg.sender 傳遞給介面有什麼作用?

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

interface Building {
 function isLastFloor(uint) external returns (bool);
}


contract Elevator {
 bool public top;
 uint public floor;

 function goTo(uint _floor) public {
   Building building = Building(msg.sender);

   if (! building.isLastFloor(_floor)) {
     floor = _floor;
     top = building.isLastFloor(floor);
   }
 }
}

首先有關 msg.sender 的更多資訊

你不能msg.sender總是通過地址呼叫函式。如果另一個合約呼叫這個函式,那麼msg.sender就是那個合約,如果一個 EOA(外部擁有的賬戶,也就是一個人擁有的地址)呼叫這個函式,那麼msg.sender就是使用者的地址。如果您想檢索第一個交易發送者,那麼您應該使用tx.origin它將始終返回啟動交易的第一個 EOA。

現在我們可以分析這個合約了。

interface Building {
 function isLastFloor(uint) external returns (bool);
}

這是您所說的界面,因此這應該是已部署的契約。

Building building = Building(msg.sender);

他們假設這個契約是由建築契約呼叫的。如果 EOA 呼叫此函式,它將恢復,因為building.isLastFloor(_floor)將失敗。因此,它將作為:

EOA(使用者)呼叫 Building 合約 Building 合約對 Elevator 合約進行外部呼叫,因此 Elevator 合約中的 msg.sender 成為 Building 合約。

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