Ethernaut系列-레벨 21(상점)
레벨 21(상점):
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
interface Buyer {
function price() external view returns (uint);
}
contract Shop {
uint public price = 100;
bool public isSold;
function buy() public {
Buyer _buyer = Buyer(msg.sender);
if (_buyer.price() >= price && !isSold) {
isSold = true;
price = _buyer.price();
}
}
}
通关要求
isSold = 참
가격 < 100
要点
view방법적 限制,不能修改状态如:storage
https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=%20view%20method#view-functions
解题思路
跟 11 差不多 关思路 关思路, 但 增加 了 了 view 限制 限制 限制 限制 限制 能 能 能 能 修改 修改 스토리지, 但 需要 需要 两 次 返回 不 不 一定 的 结果 结果 结果 结果 结果 结果 通过 通过 通过 通过 通过 来 来 判断 并 返回 不 值 值 值 值 这里 可以 可以 使用 更 更 简单 的 如 如 如 如 如 调用 一样 一样 不 不 不外部shop.isSold(这个是方法是view,是可以调用的)
如
function run(address _runAddress) external payable {
ILevel(_runAddress).buy();
}
function price() external view returns (uint) {
// view不能写storage,但可以调用外部的view
// 也可以调用gasleft()来达到两次返回不一样的值,但比较麻烦
return ILevel(msg.sender).isSold() ? 0 : 100;
}
Reference
이 문제에 관하여(Ethernaut系列-레벨 21(상점)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bin2chen/ethernautxi-lie-level-21shop-1ej3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)