Bây giờ chúng ta sẽ chuyển hợp đồng Item
đơn giản của mình thành hợp đồng Marketplace
phức tạp hơn. Hợp đồng Marketplace
sẽ duy trì danh sách các mặt hàng để bán, cung cấp cách để người dùng liệt kê các mặt hàng mới để bán và cung cấp cách để người dùng mua các mặt hàng.
Để làm điều này, chúng tôi sẽ thêm một số tính năng mới vào hợp đồng của mình:
Mỗi mặt hàng bây giờ sẽ có một địa chỉ seller
, đại diện cho chủ sở hữu của mặt hàng đó.
Chúng tôi sẽ giới thiệu một chức năng mới listItemForSale
cho phép người dùng liệt kê các mặt hàng mới để bán.
Chúng tôi sẽ giới thiệu một chức năng mới buyItem
cho phép người dùng mua một mặt hàng.
Marketplace
:Độ rắn
// SPDX-Mã định danh giấy phép: MIT
độ rắn pragma ^0.8.6;
Contract Marketplace {
// Xác định cấu trúc mới cho Item
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Mảng chứa tất cả các item
Item[] public items;
// Sự kiện sẽ được phát ra khi một mặt hàng mới được tạo
sự kiện NewItem(uint itemId, string itemName, uint itemPrice, địa chỉ người bán);
// Sự kiện sẽ được phát ra khi một mặt hàng được rao bán
sự kiện ItemListed(uint itemId, string itemName, uint itemPrice, địa chỉ người bán);
// Sự kiện sẽ được phát ra khi một mặt hàng được mua
sự kiện ItemBought(uint itemId, string itemName, uint itemPrice, địa chỉ người bán, địa chỉ người mua);
// Hàm tạo một mặt hàng mới nhưng không đăng bán ngay
hàm createItem(string bộ nhớ _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Hàm liệt kê một mặt hàng để bán
hàm listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Hàm mua một mặt hàng
hàm buyItem(uint _itemId) thanh toán công khai {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Cấu trúc Item
hiện bao gồm địa chỉ seller
và boolean forSale
. seller
là chủ sở hữu của mặt hàng và forSale
cho biết liệu mặt hàng đó hiện có được rao bán hay không.
Hàm createItem
tạo một mặt hàng mới và chỉ định msg.sender
là người bán. msg.sender
là một biến toàn cục trong Solidity đại diện cho địa chỉ của người (hoặc hợp đồng thông minh) được gọi là hàm hiện tại. Tuy nhiên, mặt hàng này không được rao bán ngay lập tức.
Hàm listItemForSale
cho phép người bán một mặt hàng niêm yết mặt hàng đó để bán. Chúng tôi sử dụng chức năng require
để đảm bảo rằng chỉ người bán mới có thể liệt kê mặt hàng để bán.
Hàm buyItem
cho phép ai đó mua một mặt hàng. Hàm này kiểm tra xem mặt hàng đó có được bán không, người mua không phải là người bán và đã gửi đúng giá. Nếu những điều kiện này được đáp ứng, chức năng sẽ gửi tiền cho người bán và đánh dấu mặt hàng đó là không bán.
Sau khi viết hợp đồng Marketplace
, bước tiếp theo là biên dịch và triển khai nó. Bạn có thể sử dụng plugin Solidity Compiler trong Remix để biên dịch hợp đồng, giống như chúng ta đã làm trong Bài 1.
Để triển khai hợp đồng, hãy đi tới plugin Triển khai & Chạy giao dịch (plugin có biểu tượng hình khối) ở bảng bên phải. Chọn môi trường thích hợp (JavaScript VM để mô phỏng), chọn hợp đồng Marketplace
từ menu thả xuống Hợp đồng và nhấp vào nút Triển khai.
Sau khi hợp đồng được triển khai, nó sẽ xuất hiện trong phần Hợp đồng đã triển khai. Bạn có thể mở rộng nó để xem các biến và hàm trạng thái công khai của nó. Bạn có thể tạo, liệt kê và mua các mặt hàng bằng cách gọi các hàm này.
Để tạo một mặt hàng, hãy nhập tên và giá rồi nhấp vào nút createItem
. Để liệt kê một mặt hàng để bán, hãy nhập ID mặt hàng và nhấp vào nút listItemForSale
. Để mua một mặt hàng, hãy nhập ID mặt hàng, gửi số lượng Ether chính xác và nhấp vào nút buyItem
.
Chúc mừng! Bây giờ bạn đã biết cách tạo một thị trường phi tập trung cơ bản trên chuỗi khối Ethereum.
Trong bài học tiếp theo, chúng ta sẽ cải thiện thị trường của mình bằng cách thêm chức năng xóa các mặt hàng đang bán và cập nhật giá của một mặt hàng. Giữ nguyên!
Bây giờ chúng ta sẽ chuyển hợp đồng Item
đơn giản của mình thành hợp đồng Marketplace
phức tạp hơn. Hợp đồng Marketplace
sẽ duy trì danh sách các mặt hàng để bán, cung cấp cách để người dùng liệt kê các mặt hàng mới để bán và cung cấp cách để người dùng mua các mặt hàng.
Để làm điều này, chúng tôi sẽ thêm một số tính năng mới vào hợp đồng của mình:
Mỗi mặt hàng bây giờ sẽ có một địa chỉ seller
, đại diện cho chủ sở hữu của mặt hàng đó.
Chúng tôi sẽ giới thiệu một chức năng mới listItemForSale
cho phép người dùng liệt kê các mặt hàng mới để bán.
Chúng tôi sẽ giới thiệu một chức năng mới buyItem
cho phép người dùng mua một mặt hàng.
Marketplace
:Độ rắn
// SPDX-Mã định danh giấy phép: MIT
độ rắn pragma ^0.8.6;
Contract Marketplace {
// Xác định cấu trúc mới cho Item
struct Item {
string name;
uint price;
address payable seller;
bool forSale;
}
// Mảng chứa tất cả các item
Item[] public items;
// Sự kiện sẽ được phát ra khi một mặt hàng mới được tạo
sự kiện NewItem(uint itemId, string itemName, uint itemPrice, địa chỉ người bán);
// Sự kiện sẽ được phát ra khi một mặt hàng được rao bán
sự kiện ItemListed(uint itemId, string itemName, uint itemPrice, địa chỉ người bán);
// Sự kiện sẽ được phát ra khi một mặt hàng được mua
sự kiện ItemBought(uint itemId, string itemName, uint itemPrice, địa chỉ người bán, địa chỉ người mua);
// Hàm tạo một mặt hàng mới nhưng không đăng bán ngay
hàm createItem(string bộ nhớ _name, uint _price) public {
items.push(Item(_name, _price, payable(msg.sender), false)); // We need to explicitly convert msg.sender to 'address payable'
emit NewItem(items.length - 1, _name, _price, msg.sender);
}
// Hàm liệt kê một mặt hàng để bán
hàm listItemForSale(uint _itemId) public {
Item storage item = items[_itemId];
require(msg.sender == item.seller, "Only the owner can list the item for sale");
item.forSale = true;
emit ItemListed(_itemId, item.name, item.price, item.seller);
}
// Hàm mua một mặt hàng
hàm buyItem(uint _itemId) thanh toán công khai {
Item storage item = items[_itemId];
require(msg.sender != item.seller, "Seller cannot buy their own item");
require(item.forSale, "Item is not for sale");
require(msg.value == item.price, "Incorrect price sent");
item.seller.transfer(msg.value);
item.forSale = false;
emit ItemBought(_itemId, item.name, item.price, item.seller, msg.sender);
}
}
Cấu trúc Item
hiện bao gồm địa chỉ seller
và boolean forSale
. seller
là chủ sở hữu của mặt hàng và forSale
cho biết liệu mặt hàng đó hiện có được rao bán hay không.
Hàm createItem
tạo một mặt hàng mới và chỉ định msg.sender
là người bán. msg.sender
là một biến toàn cục trong Solidity đại diện cho địa chỉ của người (hoặc hợp đồng thông minh) được gọi là hàm hiện tại. Tuy nhiên, mặt hàng này không được rao bán ngay lập tức.
Hàm listItemForSale
cho phép người bán một mặt hàng niêm yết mặt hàng đó để bán. Chúng tôi sử dụng chức năng require
để đảm bảo rằng chỉ người bán mới có thể liệt kê mặt hàng để bán.
Hàm buyItem
cho phép ai đó mua một mặt hàng. Hàm này kiểm tra xem mặt hàng đó có được bán không, người mua không phải là người bán và đã gửi đúng giá. Nếu những điều kiện này được đáp ứng, chức năng sẽ gửi tiền cho người bán và đánh dấu mặt hàng đó là không bán.
Sau khi viết hợp đồng Marketplace
, bước tiếp theo là biên dịch và triển khai nó. Bạn có thể sử dụng plugin Solidity Compiler trong Remix để biên dịch hợp đồng, giống như chúng ta đã làm trong Bài 1.
Để triển khai hợp đồng, hãy đi tới plugin Triển khai & Chạy giao dịch (plugin có biểu tượng hình khối) ở bảng bên phải. Chọn môi trường thích hợp (JavaScript VM để mô phỏng), chọn hợp đồng Marketplace
từ menu thả xuống Hợp đồng và nhấp vào nút Triển khai.
Sau khi hợp đồng được triển khai, nó sẽ xuất hiện trong phần Hợp đồng đã triển khai. Bạn có thể mở rộng nó để xem các biến và hàm trạng thái công khai của nó. Bạn có thể tạo, liệt kê và mua các mặt hàng bằng cách gọi các hàm này.
Để tạo một mặt hàng, hãy nhập tên và giá rồi nhấp vào nút createItem
. Để liệt kê một mặt hàng để bán, hãy nhập ID mặt hàng và nhấp vào nút listItemForSale
. Để mua một mặt hàng, hãy nhập ID mặt hàng, gửi số lượng Ether chính xác và nhấp vào nút buyItem
.
Chúc mừng! Bây giờ bạn đã biết cách tạo một thị trường phi tập trung cơ bản trên chuỗi khối Ethereum.
Trong bài học tiếp theo, chúng ta sẽ cải thiện thị trường của mình bằng cách thêm chức năng xóa các mặt hàng đang bán và cập nhật giá của một mặt hàng. Giữ nguyên!