现在,让我们将所学的内容整合成一份完整的智能合同。
在本例中,你将使用 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);
}
}
让我们深入了解这份智能合同的主要组成部分:
- 分别是:
- 三个状态变量:
buyer
、seller
和balances
- 两个事件:
ListItem
和PurchasedItem
- 一个具有两个值的枚举:
ItemAvailable
和ItemPurchased
- 三个状态变量:
- 构造函数将卖方用户指定为
msg.sender
,并将初始状态设置为ItemAvailable
。 创建合同时,将调用此构造函数。 buy
函数有三个参数:seller
buyer
和price
。 这要求买方有足够的购买能力。 然后,它将资金从买方转移到卖方,并最终发出一条消息。
后续:
请前往 Remix IDE 了解 Solidity 中更多的智能合同示例。 Remix 是一个浏览器内的 IDE,使你可以立即开始使用,而不必创建帐户或登录。 你可以立即编写、测试、编译和部署合同。
将此智能合同复制并粘贴到名为 Marketplace.sol
的新文件中的 Remix。 然后编译并部署该合同。 虽然该合同包含用于购买在售商品的函数,但你会注意到,无法提供替换货币来购买商品。 如果想挑战更高难度,可以使用所学知识编写一个函数,为买方提供余额,提供帐户地址和帐户余额。
solidity官网https://docs.soliditylang.org/en/v0.8.26/solidity-github
https://github.com/ethereum/solidityRemix-solidity IDE
https://remix.ethereum.org/#lang=zh&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.26+commit.8a97fa7a.js