Pelajaran 2

Niêm yết và giao dịch các mặt hàng

Trong bài học này, chúng ta sẽ mở rộng hợp đồng Mặt hàng để xử lý việc niêm yết và giao dịch các mặt hàng trên thị trường của chúng ta. Chúng ta sẽ tìm hiểu về cách thêm, liệt kê và xóa các mặt hàng cũng như những kiến thức cơ bản về mua và bán các mặt hàng. Chúng ta cũng sẽ tìm hiểu cách triển khai hợp đồng của mình và tương tác với nó trong Remix IDE.

Xây dựng hợp đồng thị trường

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:

  1. 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 đó.

  2. 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.

  3. 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.

Đây là giao diện của hợp đồ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);
    }
}

Trong hợp đồng này, chúng tôi có:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Triển khai và tương tác với Marketplace Contract

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!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 2

Niêm yết và giao dịch các mặt hàng

Trong bài học này, chúng ta sẽ mở rộng hợp đồng Mặt hàng để xử lý việc niêm yết và giao dịch các mặt hàng trên thị trường của chúng ta. Chúng ta sẽ tìm hiểu về cách thêm, liệt kê và xóa các mặt hàng cũng như những kiến thức cơ bản về mua và bán các mặt hàng. Chúng ta cũng sẽ tìm hiểu cách triển khai hợp đồng của mình và tương tác với nó trong Remix IDE.

Xây dựng hợp đồng thị trường

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:

  1. 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 đó.

  2. 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.

  3. 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.

Đây là giao diện của hợp đồ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);
    }
}

Trong hợp đồng này, chúng tôi có:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Triển khai và tương tác với Marketplace Contract

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!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.