Cách triển khai thị trường ERC-721
Trong bài viết này, tôi sẽ hướng dẫn bạn cách viết mã Craigslist cho chuỗi khối Ethereum.
Trước khi có Gumtree, Ebay và Craigslist, các bảng rao vặt chủ yếu được làm bằng nút chai hoặc giấy. Có các bảng rao vặt trong hành lang trường học, trên báo, cột đèn đường, và mặt tiền cửa hàng.
Tất cả đã thay đổi với sự ra đời của internet. Số lượng người có thể xem một bảng rao vặt cụ thể đã tăng lên gấp nhiều lần. Cùng với đó, các thị trường mà chúng đại diện đã trở nên hiệu quả hơn nhiều và mở rộng quy mô ra toàn cầu. Ebay là một doanh nghiệp khổng lồ có nguồn gốc từ những bảng rao vặt vật lý này.
Với chuỗi khối, các thị trường này sẽ một lần nữa thay đổi, hãy để tôi chỉ cho bạn cách thức hoạt động.
Kiếm tiền
Mô hình kinh doanh của một bảng rao vặt chuỗi khối công khai sẽ cần phải khác với mô hình của Ebay và các công ty tương tự.
Đầu tiên, có khía cạnh phi tập trung hóa. Các nền tảng hiện có cần phải duy trì máy chủ của riêng họ. Một nền tảng phi tập trung được duy trì bởi người dùng của nó, vì vậy chi phí vận hành nền tảng cốt lõi giảm xuống bằng không đối với chủ sở hữu nền tảng.
Sau đó là giao diện người dùng, trang web hoặc giao diện cung cấp quyền truy cập vào nền tảng. Ở đây có nhiều lựa chọn. Chủ sở hữu nền tảng có thể hạn chế quyền truy cập và buộc mọi người sử dụng giao diện của họ, đồng thời tính phí. Chủ sở hữu nền tảng cũng có thể quyết định mở quyền truy cập (Quyền lực về tay nhân dân!) và cho phép bất kỳ ai xây dựng giao diện cho nền tảng. Hoặc chủ sở hữu có thể quyết định bất kỳ cách tiếp cận nào nằm giữa hai thái cực đó.
Các nhà lãnh đạo doanh nghiệp có tầm nhìn xa hơn tôi sẽ biết cách kiếm tiền từ việc này. Tất cả những gì tôi thấy là điều này khác với hiện trạng và có thể có lãi.
Hơn nữa, có khía cạnh tự động hóa và thanh toán. Một số thứ có thể được mã hóa rất hiệu quả (opens in a new tab) và được giao dịch trên một bảng rao vặt. Tài sản được mã hóa dễ dàng được chuyển giao trên chuỗi khối. Các phương thức thanh toán rất phức tạp có thể được triển khai dễ dàng trên chuỗi khối.
Tôi chỉ đang ngửi thấy một cơ hội kinh doanh ở đây. Một bảng rao vặt không có chi phí vận hành có thể dễ dàng được triển khai, với các đường thanh toán phức tạp được bao gồm trong mỗi giao dịch. Tôi chắc chắn ai đó sẽ nảy ra ý tưởng về việc sử dụng nó để làm gì.
Tôi chỉ vui vì đã xây dựng nó. Hãy xem qua mã.
Triển khai
Cách đây một thời gian, chúng tôi đã bắt đầu một kho lưu trữ mã nguồn mở (opens in a new tab) với các ví dụ triển khai trường hợp kinh doanh và những thứ hay ho khác, mời bạn xem qua.
Mã cho Bảng rao vặt Ethereum (opens in a new tab) này có ở đó, hãy thoải mái sử dụng. Chỉ cần lưu ý rằng mã chưa được kiểm toán và bạn cần phải tự mình thẩm định trước khi rót tiền vào đó.
Những điều cơ bản của bảng không phức tạp. Tất cả các quảng cáo trong bảng sẽ chỉ là một cấu trúc (struct) với một vài trường:
1struct Trade {2 address poster;3 uint256 item;4 uint256 price;5 bytes32 status; // Mở, Đã thực thi, Đã hủy6}Vậy là có người đăng quảng cáo. Một mặt hàng để bán. Giá cho mặt hàng đó. Trạng thái của giao dịch có thể là đang mở, đã thực thi hoặc đã hủy.
Tất cả các giao dịch này sẽ được lưu giữ trong một ánh xạ (mapping). Bởi vì mọi thứ trong Solidity dường như đều là một ánh xạ. Cũng bởi vì nó tiện lợi.
1mapping(uint256 => Trade) public trades;Việc sử dụng ánh xạ chỉ có nghĩa là chúng ta phải tạo một id cho mỗi quảng cáo trước khi đăng nó, và chúng ta sẽ cần biết id của một quảng cáo trước khi có thể thao tác trên đó. Có nhiều cách để giải quyết vấn đề này trong hợp đồng thông minh hoặc trong giao diện người dùng. Vui lòng hỏi nếu bạn cần một vài gợi ý.
Tiếp theo là câu hỏi về các mặt hàng mà chúng ta xử lý là gì, và loại tiền tệ nào được sử dụng để thanh toán cho giao dịch.
Đối với các mặt hàng, chúng ta sẽ chỉ yêu cầu chúng triển khai giao diện ERC-721 (opens in a new tab), đây thực sự chỉ là một cách để đại diện cho các mặt hàng trong thế giới thực trên chuỗi khối, mặc dù nó hoạt động tốt nhất với các tài sản kỹ thuật số (opens in a new tab). Chúng ta sẽ chỉ định hợp đồng ERC721 của riêng mình trong hàm khởi tạo, nghĩa là bất kỳ tài sản nào trong bảng rao vặt của chúng ta đều cần được mã hóa từ trước.
Đối với các khoản thanh toán, chúng ta sẽ làm điều gì đó tương tự. Hầu hết các dự án chuỗi khối đều định nghĩa tiền mã hóa ERC-20 (opens in a new tab) của riêng họ. Một số khác lại thích sử dụng một loại tiền chính thống như DAI. Trong bảng rao vặt này, bạn chỉ cần quyết định loại tiền tệ của mình sẽ là gì khi xây dựng. Dễ dàng.
1constructor (2 address _currencyTokenAddress, address _itemTokenAddress3) public {4 currencyToken = IERC20(_currencyTokenAddress);5 itemToken = IERC721(_itemTokenAddress);6 tradeCounter = 0;7}Chúng ta sắp hoàn thành rồi. Chúng ta đã có quảng cáo, các mặt hàng để giao dịch và một loại tiền tệ để thanh toán. Tạo một quảng cáo có nghĩa là đặt một mặt hàng vào ký quỹ để cho thấy rằng bạn có nó và bạn chưa đăng nó hai lần, có thể là trên một bảng khác.
Đoạn mã dưới đây thực hiện chính xác điều đó. Đặt vật phẩm vào ký quỹ, tạo quảng cáo, thực hiện một số công việc dọn dẹp.
1function openTrade(uint256 _item, uint256 _price)2 public3{4 itemToken.transferFrom(msg.sender, address(this), _item);5 trades[tradeCounter] = Trade({6 poster: msg.sender,7 item: _item,8 price: _price,9 status: "Open"10 });11 tradeCounter += 1;12 emit TradeStatusChange(tradeCounter - 1, "Open");13}Hiện tất cảChấp nhận giao dịch có nghĩa là chọn một quảng cáo (giao dịch), trả giá và nhận vật phẩm. Đoạn mã dưới đây truy xuất một giao dịch. Kiểm tra xem nó có sẵn không. Thanh toán cho vật phẩm. Truy xuất vật phẩm. Cập nhật quảng cáo.
1function executeTrade(uint256 _trade)2 public3{4 Trade memory trade = trades[_trade];5 require(trade.status == "Open", "Trade is not Open.");6 currencyToken.transferFrom(msg.sender, trade.poster, trade.price);7 itemToken.transferFrom(address(this), msg.sender, trade.item);8 trades[_trade].status = "Executed";9 emit TradeStatusChange(_trade, "Executed");10}Hiện tất cảCuối cùng, chúng ta có một tùy chọn cho người bán để rút lui khỏi một giao dịch trước khi người mua chấp nhận nó. Trong một số mô hình, quảng cáo sẽ hoạt động trong một khoảng thời gian trước khi hết hạn. Lựa chọn là của bạn, tùy thuộc vào thiết kế thị trường của bạn.
Mã này rất giống với mã được sử dụng để thực hiện một giao dịch, chỉ khác là không có tiền tệ nào được trao đổi và vật phẩm sẽ quay trở lại người đăng quảng cáo.
1function cancelTrade(uint256 _trade)2 public3{4 Trade memory trade = trades[_trade];5 require(6 msg.sender == trade.poster,7 "Trade can be cancelled only by poster."8 );9 require(trade.status == "Open", "Trade is not Open.");10 itemToken.transferFrom(address(this), trade.poster, trade.item);11 trades[_trade].status = "Cancelled";12 emit TradeStatusChange(_trade, "Cancelled");13}Hiện tất cảVậy là xong. Bạn đã hoàn thành phần triển khai. Thật đáng ngạc nhiên khi một số khái niệm kinh doanh lại trở nên cô đọng khi được thể hiện bằng mã, và đây là một trong những trường hợp như vậy. Kiểm tra hợp đồng hoàn chỉnh trong kho lưu trữ của chúng tôi (opens in a new tab).
Kết luận
Các bảng rao vặt là một cấu hình thị trường phổ biến đã mở rộng quy mô lớn với sự ra đời của internet, trở thành một mô hình kinh doanh cực kỳ phổ biến với một vài người chiến thắng độc quyền.
Các bảng rao vặt cũng là một công cụ dễ sao chép trong môi trường chuỗi khối, với các tính năng rất cụ thể sẽ có thể thách thức những gã khổng lồ hiện có.
Trong bài viết này, tôi đã cố gắng kết nối thực tế kinh doanh của một doanh nghiệp bảng rao vặt với việc triển khai công nghệ. Kiến thức này sẽ giúp bạn tạo ra một tầm nhìn và một lộ trình để triển khai nếu bạn có những kỹ năng phù hợp.
Như mọi khi, nếu bạn đang xây dựng bất cứ điều gì thú vị và muốn nhận một vài lời khuyên, vui lòng liên hệ với tôi (opens in a new tab)! Tôi luôn sẵn lòng giúp đỡ.
Lần cập nhật trang lần cuối: 15 tháng 8, 2023