-1
 enum Status{ Vacant, Occupied }
    Status currentStatus;

 event Occupy(address _occupant, uint _value);
4

1 回答 1

0

与其他一些编程语言一样,enum( docs ) 允许您将多个值聚合为一种数据类型,其中只有一个值处于活动状态。

在您的情况下,currentStatus可以是Vacant(整数值 0),也可以是Occupied(整数值 1)。但永远不能是“这些都不是”,也不是“两者”,也不是“其他任何东西”。

pragma solidity ^0.8;

contract MyContract {
    enum Status {
        Vacant,
        Occupied
    }

    Status currentStatus;

    // you can effectively pass `0` or `1` integer value here
    function setCurrentStatus(Status _currentStatus) external {
        currentStatus = _currentStatus;
    }

    function getCurrentStatusVerbose() external view returns (string memory) {
        if (currentStatus == Status.Vacant) {
            return "The current status is Vacant";
        } else if (currentStatus == Status.Occupied) {
            return "The current status is Occupied";
        }
    }
}

事件 ( docs ) 可以被链下应用程序读取,而不能被其他合约读取。通常,链下应用程序会监听这些发出的事件以在其端执行操作。

pragma solidity ^0.8;

contract MyContract {
    event Occupy(address _occupant, uint _value);

    enum Status {
        Vacant,
        Occupied
    }

    Status currentStatus;

    function setCurrentStatus(Status _currentStatus) external {
        currentStatus = _currentStatus;
        // emitting the `Occupy` event
        emit Occupy(msg.sender, uint(_currentStatus));
    }
}

链下应用:

myContract.on('Occupy', async (event) => {
    updateOccupancyInExternalDB(event);
});

一个真实的例子是Transfer()定义ERC-20 代币标准的事件。当代币合约发出此事件时,表示发生了代币转移。区块链浏览器(例如 Etherscan)监听这些事件并更新他们自己数据库中的代币余额信息(从发送者余额中减去并增加他们自己数据库中的接收者余额)。

于 2021-12-06T10:30:38.320 回答