Contract-Design
將 msg.sender 傳遞給介面有什麼作用?
當我注意到下面的程式碼時,我正在做 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.sender
為Building
根據介面定義應實現功能的類型isLastFloor(uint) external returns (bool)
。後者會嘗試實例化一個 new
Building
,但由於你所說的不可能,所以它只是一個無效的聲明。如果介面沒有任何建構子來接受參數,這究竟會做什麼?
它只是解釋
msg.sender
為 typeBuilding
,不涉及建構子,它只是一個類型轉換。我希望這能回答你的問題。