Contract-Design

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

  • March 9, 2022

當我注意到下面的程式碼時,我正在做 Ethernaut 的電梯問題:

// 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);
   }
 }
}

根據Solidity 文件,介面“不能聲明建構子”。但是在上面的程式碼中,在Elevator合約的goTo函式中,msg.sender是傳遞給Building介面的。

如果介面沒有任何建構子來接受參數,這究竟會做什麼?

根據 Solidity 文件,介面“不能聲明建構子”。但是在上面的程式碼中,在 Elevator 合約的 goTo 函式中,msg.sender 被傳遞給了 Building 介面。

不要將類型轉換Building(msg.sender)與建構子呼叫混淆new Building(msg.sender)

前者只允許處理msg.senderBuilding根據介面定義應實現功能的類型isLastFloor(uint) external returns (bool)

後者會嘗試實例化一個 new Building,但由於你所說的不可能,所以它只是一個無效的聲明。

如果介面沒有任何建構子來接受參數,這究竟會做什麼?

它只是解釋msg.sender為 type Building,不涉及建構子,它只是一個類型轉換。

我希望這能回答你的問題。

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