Hôm nay, chúng ta sẽ cùng nhau viết một Smart Contract Digital Marketplace trên blockchain Algorand, sử dụng ngôn ngữ lập trình Python và công cụ Algokit.
Giới thiệu về Algokit
Algokit là một bộ công cụ toàn diện được thiết kế cho việc phát triển ứng dụng phi tập trung (dApp) trên blockchain Algorand.
Algokit cung cấp một môi trường lập trình thuận tiện, bao gồm localnet, các template contract và nhiều tiện ích khác, giúp việc phát triển dApp trở nên dễ dàng và tiện lợi hơn.
Trước đây, việc viết Smart Contract trên Algorand các bạn có thể sử dụng ngôn ngữ PyTEAL. Nó là Python with Syntax và compile ra file TEAL.
Tuy nhiên, gần đây, Algorand đã giới thiệu Algokit 2.0, cho phép viết hợp đồng thông minh trực tiếp bằng Native Python.
Để bắt đầu một dự án mới, chúng ta sử dụng lệnh:
algokit init
Sau đó, chọn template "Smart Contract" và ngôn ngữ là "Python". Tiếp theo, điền thông tin cần thiết và Algokit sẽ tạo ra một dự án mới cho chúng ta.
Viết Smart Contract
Sau khi tạo dự án, chúng ta điều hướng đến thư mục smart_contracts và mở tệp Contract.py để bắt đầu viết Contract
Tạo Application
Với các chain khác gọi là Smart Contract thì Algorand có 1 term tương tự là Application.
from algopy import * class Digital_marketplace(ARC4Contract): assetId: UInt64 unitaryPrice: UInt64 # create the app @arc4.abimethod(allow_actions=["NoOp"], create="require") def createApplication(self, assetId: Asset, unitaryPrice: UInt64) -> None: self.assetId = assetId.id self.unitaryPrice = unitaryPrice
Method này chịu trách nhiệm tạo ra một Application để bán Digital Assets. 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.
Method set các thuộc tính assetId
và unitaryPrice
khi mình create Application lần đầu.
Thay đổi giá bán
@arc4.abimethod
def setPrice(self, unitaryPrice: UInt64) -> None: assert Txn.sender == Global.creator_address self.unitaryPrice = unitaryPrice
Method 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 Contract.
Mình cần đảm bảo method này chỉ có thể được gọi bởi người tạo ra smart contact hay còn gọi là Owner.
assert Txn.sender == Global.creator_address
Opt in tài sản
@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 có trên blockchain Algorand khác với một số blockchain khác.
Bạn cần phải opt-in một tài sản thì mới có thể nhận tài sản đó về ví.
Điều này giúp Algorand tránh việc bị spam gửi token giả mạo đến các ví.
Để opt-in tài sản, bạn cần gửi Assets đó đến ví nhận với amount = 0 là được
Mua Tài Sản
@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()
Tiếp theo chúng ta viết method cho việc mua Assets.
Đầu tiên mình cần đảm bảo lượng tiền người mua bỏ ra là đủ và người nhận là Smart Contract.
Sau đó mình sẽ dùng hàm AssetTransfer để chuyển Asset cho người mua khi pay thành công
Delete Application
@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()
Đầu tiên mình cần đảm bảo rằng chỉ có Owner của contract mới có thể xoá Application.
assert Txn.sender == Global.creator_address
Với Method này Owner sẽ nhận lại toàn bộ tiền và Assets còn lại sau đó xoá Application.
Full Code
Deploy
Sau khi viết xong Contract. Mình cần build sử dụng command
algokit project run build
Nó sẽ tạo ra 4 file ở thư mục artifacts. Bạn có thể lên https://app.dappflow.org/ và upload file lên để deploy lên mainet/testnet/localnet.
Kết Luận
Qua bài viết này, chúng ta đã có cái nhìn tổng quan về việc viết Smart Contract trên Algorand bằng ngôn ngữ Python và công cụ Algokit. Hy vọng bạn đã có thêm kiến thức và sẵn sàng tiếp tục thực hiện các dự án của mình trên blockchain Algorand.