认识Solidity中的合同结构

200 阅读1分钟

以太坊的智能合约主要是用Solidity编写的。它们是部署的基本单位,也用于EVM的执行。Solidity中的合约类似于面向对象语言中的类。在这里我们将了解合同的结构。

每个合同可以包含状态变量、函数、函数修饰符、事件、错误、结构类型和枚举类型的声明。此外,合同可以继承其他合同。

soliditysolidity

固有性

库和接口是 solidity 中特殊的契约类型。

让我们来看看Solidity中写的非常基本的智能合约结构。

pragma solidity ^0.4.2;
 

 contract Customer {
    string id;

    function setId(string serial) public {
          id = serial;
    }

    function getId() public constant returns (string) {
          return id;
    }
 }

一个合约由以下多个结构组成。

  • 状态变量
  • 函数定义
  • 函数修改器
  • 误差
  • 结构类型
  • 函数定义

状态变量

其值被永久地存储在合约存储中的变量被称为状态变量。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

函数

我们在合约中定义函数。函数是代码的可执行单位。

也可以在合约之外定义函数。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;

contract SimpleAuction {
    function bid() public payable { // Function
        // ...
    }
}

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

函数修饰符

函数修改器就像一个在执行主函数之前检查验证规则的函数。

重载,也就是用不同的参数拥有相同的修改器名称,是不可能的。

就像函数可以被重载一样,修改器也可以被重载。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;

contract Purchase {
    address public seller;

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

    function abort() public view onlySeller { // Modifier usage
        // ...
    }
}

事件

现在让我们来谈谈事件,事件是在编译函数执行后冒出来的函数。如果事件代码写在那里,它提供EVM日志设施。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.21 <0.9.0;

contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // Event

    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
    }
}

错误(Errors

对于失败的情况,Errors允许你定义描述性的名称和数据。

在revert语句中,我们使用Errors。

与字符串描述相比,Error要便宜得多,并且允许你对额外的数据进行编码。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

/// Not enough funds for transfer. Requested `requested`,
/// but only `available` available.
error NotEnoughFunds(uint requested, uint available);

contract Token {
    mapping(address => uint) balances;
    function transfer(address to, uint amount) public {
        uint balance = balances[msg.sender];
        if (balance < amount)
            revert NotEnoughFunds(amount, balance);
        balances[msg.sender] -= amount;
        balances[to] += amount;
        // ...
    }
}

结构类型

结构是指一种自定义定义的数据类型。结构由多个变量组成,并在其中声明。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

枚举类型

它用于创建自定义类型。而且它有固定的值集。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}

以上就是关于solidity中智能合约结构的全部内容。