合约结构

在 Solidity 语言中,合约类似于其他面向对象编程语言中的**类**。

每个合约中可以包含 状态变量函数函数 事件 Event结构体、 和 枚举类型 的声明,且合约可以从其他合约继承。

还有一些特殊的合约,如: 接口.

专门的 合约 章节会比本节包含更多的内容,本节用于帮助我们合约包含哪些内容,做一个简单的入门。

状态变量

状态变量是永久地存储在合约存储中的值。

pragma solidity >=0.4.0 <0.8.0;

contract TinyStorage {
    uint storedXlbData; // 状态变量
    // ...
}

有效的状态变量类型参阅 类型 章节, 对状态变量可见性有可能的选择参阅 可见性和 getter 函数

函数

函数是代码的可执行单元。函数通常在合约内部定义,但也可以在合约外定义。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >0.7.0 <0.8.0;

contract TinyAuction {
    function Mybid() public payable { // 定义函数
        // ...
    }
}

// Helper function defined outside of a contract
function helper(uint x) pure returns (uint) {
    return x * 2;
}

函数调用 可发生在合约内部或外部,且函数对其他合约有不同程度的可见性( 可见性和 getter 函数)。

函数 可以接受 参数和返回值

函数 修改器modifier

函数 修改器modifier 可以用来以声明的方式修改函数语义(参阅合约章节中 函数修改器)。

Overloading, that is, having the same modifier name with different parameters, is not possible.

Like functions, modifiers can be overridden.

pragma solidity >=0.4.22 <0.8.0;

contract MyPurchase {
    address public seller;

    modifier onlySeller() { // 修改器
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _;
    }

    function abort() public onlySeller { // 修改器用法
        // ...
    }
}

事件 Event

事件是能方便地调用以太坊虚拟机日志功能的接口。

pragma solidity >=0.4.21 <0.8.0;
contract TinyAuction {
    event HighestBidIncreased(address bidder, uint amount); // 事件

    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
    }
}

有关如何声明事件和如何在 [DApp 中使用事件](https://learnblockchain.cn/2018/05/09/solidity-event/)的信息,参阅合约章节中的 事件 Events

结构体

结构体是可以将几个变量分组的自定义类型(参阅类型章节中的 结构体)。

pragma solidity >=0.4.0 <0.8.0;

contract TinyBallot {
    struct Voter { // 结构体
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

枚举类型

枚举可用来创建由一定数量的“常量值”构成的自定义类型(参阅类型章节中的 枚举类型)。

pragma solidity >=0.4.0 <0.8.0;

contract Upchain {
    enum State { Created, Locked, InValid } // 枚举
}