希望为CTF创造一个挑战,在这里,我给用户一个智能的合同,一件艺术品,要求最低成本为20醚。一旦付款被接受,他就会得到旗。下面的代码工作,并检查余额与帐户的混合,但我如何让它返回标志,如果付款是正确的?任何帮助和指示都将不胜感激。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract payment_for_art {
function invest() external payable {
if(msg.value < 20 ether) {
revert();
}
}
function balance_of() external view returns(uint) {
return address(this).balance;
}
}问候
K
发布于 2021-07-18 16:30:13
您可以创建一个bool属性,该属性标记是否已完成支付。
contract payment_for_art {
// default value is `false`, don't need to explicitly state it
bool public isPaid;
function invest() external payable {
// to prevent multiple payments
// reverts if the condition is not met
require(isPaid == false);
if(msg.value < 20 ether) {
revert();
}
isPaid = true; // flag that the payment has been done
}
// ... rest of your code
}由于它有public修饰符,任何其他契约或离链应用程序都可以读取它的值(但不能重写它)。如果不希望从契约外部访问该值,则可以删除该修饰符。
https://stackoverflow.com/questions/68430512
复制相似问题