Rinkeby 智能合约

Rinkeby Smart Contract

希望为 CTF 创造挑战,我为用户提供了一件艺术品的智能合约,最低成本为 20 以太币。一旦付款被接受,他就会得到 return 标志。下面的代码可以工作并检查 remix 中帐户的余额,但如果付款正确,我如何才能将其发送到 return 标志? 任何帮助和指点将不胜感激。

// 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

您可以创建一个 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 修饰符,任何其他合约或链下应用程序都可以读取它的值(但不能重写它)。如果您不想从合同外部访问该值,您可以删除修饰符。