Xây Dựng Chợ Kỹ Thuật Số Trên Blockchain Algorand
Hôm nay, chúng ta sẽ cùng nhau tìm hiểu cách viết một Hợp Đồng Thông Minh (Smart Contract) cho một chợ kỹ thuật số (Digital Marketplace) trên blockchain Algorand. Chúng ta sẽ sử dụng ngôn ngữ lập trình Python và công cụ mạnh mẽ Algokit để thực hiện điều này.
Giới Thiệu Về Algokit
Algokit là một bộ công cụ toàn diện, được phát triển đặc biệt cho việc phát triển ứng dụng phi tập trung (dApp) trên blockchain Algorand. Với Algokit, việc phát triển dApp trở nên đơn giản và tiện lợi hơn bao giờ hết nhờ vào các tính năng như localnet, các mẫu hợp đồng (template contract) và nhiều tiện ích hữu ích khác.
Trước đây, để viết Smart Contract trên Algorand, bạn sẽ phải sử dụng ngôn ngữ PyTEAL, một kiểu Python với cú pháp đặc biệt, và sau đó biên dịch sang file TEAL. Tuy nhiên, với sự ra mắt của Algokit 2.0, bạn có thể viết hợp đồng thông minh trực tiếp bằng Native Python, giúp quá trình phát triển trở nên dễ dàng hơn.
Để bắt đầu một dự án mới với Algokit, bạn chỉ cần sử dụng lệnh:
bash
algokit init
Sau đó, chọn mẫu "Smart Contract" và ngôn ngữ "Python" cho dự án của bạn. Tiếp theo, hãy điền thông tin cần thiết, và Algokit sẽ tự động tạo ra một dự án mới cho bạn.
Viết Smart Contract
Sau khi hoàn thành việc tạo dự án, bạn sẽ điều hướng đến thư mục smart_contracts
và mở tệp Contract.py
để bắt đầu viết hợp đồng.
Tạo Ứng Dụng (Application)
Trên Algorand, khái niệm tương tự như Smart Contract trên các blockchain khác được gọi là Application.
python
from algopy import *
class DigitalMarketplace(ARC4Contract):
assetId: UInt64
unitaryPrice: UInt64
# Tạo ứng dụng
@arc4.abimethod(allow_actions=["NoOp"], create="require")
def createApplication(self, assetId: Asset, unitaryPrice: UInt64) -> None:
self.assetId = assetId.id
self.unitaryPrice = unitaryPrice
Phương thức này có trách nhiệm tạo ra một Application để bán Tài Sản Kỹ Thuật Số. Nó nhận hai tham số: assetId
, là ID của tài sản cần bán, và unitaryPrice
, là giá của tài sản. Phương thức này thiết lập các thuộc tính assetId
và unitaryPrice
khi bạn tạo Application lần đầu.
Thay Đổi Giá Bán
python
@arc4.abimethod
def setPrice(self, unitaryPrice: UInt64) -> None:
assert Txn.sender == Global.creator_address
self.unitaryPrice = unitaryPrice
Phương thức này cho phép người tạo smart contract thay đổi giá bán của tài sản. Nó nhận unitaryPrice
làm tham số và cập nhật thuộc tính unitaryPrice
của hợp đồng. Chúng ta cần đảm bảo phương thức này chỉ có thể được gọi bởi người tạo ra smart contract, hay còn gọi là Owner.
python
assert Txn.sender == Global.creator_address
Opt In Tài Sản
python
@arc4.abimethod
def optInToAsset(self, mbrPay: gtxn.PaymentTransaction) -> None:
assert Txn.sender == Global.creator_address
assert not Global.current_application_address.is_opted_in(Asset(self.assetId))
assert mbrPay.receiver == Global.current_application_address
assert mbrPay.amount == Global.min_balance + Global.asset_opt_in_min_balance
itxn.AssetTransfer(
xfer_asset=self.assetId,
asset_receiver=Global.current_application_address,
asset_amount=0,
).submit()
Opt in là một khái niệm trên blockchain Algorand mà bạn phải nộp đơn để nhận tài sản về ví của mình. Điều này giúp Algorand tránh việc bị spam gửi token giả mạo đến các ví người dùng. Để opt-in tài sản, bạn chỉ cần gửi Assets đến ví nhận với amount = 0
.
Mua Tài Sản
python
@arc4.abimethod
def buy(self, buyerTxn: gtxn.PaymentTransaction, quantity: UInt64) -> None:
assert self.unitaryPrice != UInt64(0)
assert Txn.sender == buyerTxn.sender
assert Txn.receiver == Global.current_application_address
assert buyerTxn.amount == self.unitaryPrice * quantity
itxn.AssetTransfer(
xfer_asset=self.assetId,
asset_receiver=Txn.sender,
asset_amount=quantity,
).submit()
Ở đây, chúng ta viết phương thức cho việc mua tài sản. Đầu tiên, cần đảm bảo số tiền người mua chi trả là đủ và người nhận là Smart Contract. Sau đó, chúng ta sẽ sử dụng hàm AssetTransfer
để chuyển tài sản cho người mua khi quá trình thanh toán thành công.
Xoá Ứng Dụng
python
@arc4.abimethod(allow_actions=["DeleteApplication"])
def deleteApplication(self) -> None:
assert Txn.sender == Global.creator_address
itxn.AssetTransfer(
xfer_asset=self.assetId,
asset_receiver=Global.creator_address,
asset_amount=0,
asset_close_to=Global.creator_address,
).submit()
itxn.Payment(
receiver=Global.creator_address,
amount=0,
close_remainder_to=Global.creator_address,
).submit()
Đoạn mã trên cho phép Owner của hợp đồng có thể xoá Application. Đầu tiên, chúng ta phải đảm bảo rằng chỉ có Owner mới có quyền thực hiện hành động này.
python
assert Txn.sender == Global.creator_address
Phương thức này đảm bảo Owner sẽ nhận lại toàn bộ tài sản và tiền còn lại trước khi ứng dụng bị xoá.
Mã Nguồn Hoàn Chỉnh
Bạn có thể tham khảo mã nguồn hoàn chỉnh trên GitHub Repository.
Triển Khai Hợp Đồng
Sau khi đã viết xong hợp đồng, bạn cần xây dựng hợp đồng bằng lệnh:
bash
algokit project run build
Lệnh này sẽ tạo ra 4 file trong thư mục artifacts. Bạn có thể lên Dappflow và tải lên các file này để triển khai trên mạng chính (mainnet)/mạng thử nghiệm (testnet)/mạng nội bộ (localnet).
Kết Luận
Qua bài viết này, chúng ta đã có cái nhìn tổng quan về cách viết Smart Contract trên Algorand bằng Python và công cụ Algokit. Hy vọng bạn đã thu thập được thêm kiến thức và sẵn sàng thực hiện các dự án của mình trên blockchain Algorand.
source: viblo