智能合约开发从0到100(1)- 合约结构

148 阅读1分钟

合约结构

一个基本包含所有要素的合约应该是怎样的

文档 learnblockchain.cn/docs/solidi…learnblockchain.cn/docs/solidi… 写得比较清楚,这里整合下

// SPDX 版权许可标识
// SPDX-License-Identifier: MIT

//Pragma
pragma solidity ^0.8.17; // 版本标识
pragma abicoder v1; // ABI Coder Pragma

// 导入其他源文件
import * as moduleName from "modulePath"; // 等同于 import "modulePath" as moduleName;
import {symbol1 as alias, symbol2} from "modulePath";

// 合约结构
contract contractName {
    address seller; // 状态变量,永久地存储在合约存储中的值。
    
    struct Voter { // 结构体
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
    
    Voter v;
    
    // 枚举类型,可用来创建由一定数量的“常量值”构成的自定义类型
    enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
    ActionChoices choice;
    ActionChoices constant defaultChoice = ActionChoices.GoStraight;
    
    
    function Mybid() public { // 定义函数,代码的可执行单元
        // ...
    }
    
    // 定义错误,Solidity 为应对失败,允许用户定义 error 来描述错误的名称和数据。
    // 没有足够的资金用于转账, 参数 `requested` 表示需要的资金,`available` 表示仅有的资金。
    error NotEnoughFunds(uint requested, uint available);
    
    // 事件,是能方便地调用以太坊虚拟机日志功能的接口。
    event HighestBidIncreased(address bidder, uint amount); // 事件
    
    // 修改器,可以用来以声明的方式修改函数语义,这里当调用者不是合约创建者的时候,会报错
    modifier onlySeller() {
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _; // 这个是关键,可以把这里想象成slot,使用该修改器的函数代码替换这里
    }
    
    function abort() public onlySeller { // 修改器用法
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
        
        uint balance = balances[msg.sender];
        if (balance < amount)
            revert NotEnoughFunds(amount, balance); // revert 能触发错误
    }
}

function Mybid() public payable { // 合约外也可以定义函数
    // ...
}