Solidity
使用介面不需要使用已部署的合約嗎?
我一直在練習 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 類型。// 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 合約。