+1

Xây Dựng Một Smart Contract Digital Marketplace Trên Blockchain Algorand Với Python và Algokit

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.

Algokit

Để 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

Contract.py

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 assetIdunitaryPrice 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

GitHub Repository

Deploy

Sau khi viết xong Contract. Mình cần build sử dụng command

algokit project run build

Building Smart Contract

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.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí