编写第一份合同

现在,让我们将所学的内容整合成一份完整的智能合同。

在本例中,你将使用 Solidity 为简单的在线市场创建一个智能合同。 该合同将允许用户列出待售商品,并购买在售商品。 涉及两个角色:卖方和买方。

简单的市场示例

// 指定 Solidity 版本范围,确保兼容性。
pragma solidity >0.7.0 <0.8.0;

// 定义一个名为 Marketplace 的智能合约
contract Marketplace {
    // 定义一个公共状态变量 seller,类型为 address,用于存储卖家的地址。
    address public seller;

    // 定义一个公共状态变量 buyer,类型为 address,用于存储买家的地址。
    address public buyer;

    // 定义一个公共映射 balances,键为 address 类型的账户地址,值为 uint 类型的余额。
    // 这个映射允许我们跟踪每个账户的余额。
    mapping (address => uint) public balances;

    // 定义一个事件 ListItem,用于通知外部系统有物品被列出。
    // 包含卖家地址和物品价格。
    event ListItem(address seller, uint price);

    // 定义一个事件 PurchasedItem,用于通知外部系统物品已被购买。
    // 包含卖家地址、买家地址和物品价格。
    event PurchasedItem(address seller, address buyer, uint price);

    // 定义一个枚举 StateType,用于表示市场的状态。
    enum StateType {
        ItemAvailable,  // 物品可用
        ItemPurchased   // 物品已被购买
    }

    // 定义一个公共状态变量 State,类型为 StateType,用于表示市场当前的状态。
    StateType public State;

    // 定义一个构造函数,用于初始化合约。
    // 设置 seller 为部署合约时的调用者地址,并将 State 设置为 ItemAvailable。
    constructor() public {
        seller = msg.sender;
        State = StateType.ItemAvailable;
    }

    // 定义一个公共函数 buy,用于买家购买物品。
    // 函数接收卖家地址、买家地址和物品价格作为参数。
    // 要求调用者支付足够的 Ether。
    function buy(address seller, address buyer, uint price) public payable {
        // 确保买家有足够的余额来购买物品。
        require(price <= balances[buyer], "Insufficient balance");

        // 更新 State 为 ItemPurchased。
        State = StateType.ItemPurchased;

        // 从买家余额中扣除价格。
        balances[buyer] -= price;

        // 将价格添加到卖家余额中。
        balances[seller] += price;

        // 触发 PurchasedItem 事件,通知外部系统物品已被购买。
        emit PurchasedItem(seller, buyer, msg.value);
    }
}

让我们深入了解这份智能合同的主要组成部分:

  • 分别是:
    • 三个状态变量:buyerseller 和 balances
    • 两个事件:ListItem 和 PurchasedItem
    • 一个具有两个值的枚举:ItemAvailable 和 ItemPurchased
  • 构造函数将卖方用户指定为 msg.sender,并将初始状态设置为 ItemAvailable。 创建合同时,将调用此构造函数。
  • buy 函数有三个参数:sellerbuyer 和 price。 这要求买方有足够的购买能力。 然后,它将资金从买方转移到卖方,并最终发出一条消息。

后续:

请前往 Remix IDE 了解 Solidity 中更多的智能合同示例。 Remix 是一个浏览器内的 IDE,使你可以立即开始使用,而不必创建帐户或登录。 你可以立即编写、测试、编译和部署合同。

将此智能合同复制并粘贴到名为 Marketplace.sol 的新文件中的 Remix。 然后编译并部署该合同。 虽然该合同包含用于购买在售商品的函数,但你会注意到,无法提供替换货币来购买商品。 如果想挑战更高难度,可以使用所学知识编写一个函数,为买方提供余额,提供帐户地址和帐户余额。



solidity官网icon-default.png?t=N7T8https://docs.soliditylang.org/en/v0.8.26/solidity-githubicon-default.png?t=N7T8https://github.com/ethereum/solidityRemix-solidity IDEicon-default.png?t=N7T8https://remix.ethereum.org/#lang=zh&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.26+commit.8a97fa7a.js


 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值