合約結構

2022-05-11 18:06 更新

Solidity 中的合約類似于面向對象語言中的類。每個合約都可以包含狀態(tài)變量、函數(shù)、  函數(shù)修飾符、事件、錯誤、結構類型枚舉類型的聲明。此外,合約可以繼承自其他合約。

還有稱為接口的特殊類型的合約。

關于合同的部分包含比本部分更多的詳細信息,用于提供快速概述。

狀態(tài)變量

狀態(tài)變量是其值永久存儲在合約存儲中的變量。

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

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

有關有效狀態(tài)變量類型 的信息,請參閱類型部分,有關可見性的可能選擇,請參閱Visibility 和 Getters。

職能

函數(shù)是代碼的可執(zhí)行單元。函數(shù)通常在合約內定義,但也可以在合約外定義。

// 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 x) pure returns (uint) {
    return x * 2;
}

函數(shù)調用可以在內部或外部發(fā)生,并且 對其他合約具有不同級別的可見性。函數(shù)接受 參數(shù)并返回變量以在它們之間傳遞參數(shù)和值。

函數(shù)修飾符

函數(shù)修飾符可用于以聲明的方式修改函數(shù)的語義(請參閱合約部分中的函數(shù)修飾符)。

重載,即具有不同參數(shù)的相同修飾符名稱是不可能的。

像函數(shù)一樣,修飾符可以被覆蓋。

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

有關如何聲明事件以及如何在 dapp 中使用事件的信息,請參閱合約中的事件部分。

錯誤

錯誤允許您為故障情況定義描述性名稱和數(shù)據(jù)。錯誤可用于還原語句。與字符串描述相比,錯誤要便宜得多,并且允許您對附加數(shù)據(jù)進行編碼。您可以使用 NatSpec 向用戶描述錯誤。

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

枚舉類型

枚舉可用于創(chuàng)建具有一組有限“常量值”的自定義類型(請參閱 類型部分中的枚舉)。

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

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號