- vừa được xem lúc

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

0 0 9

Người đăng: Henry Pham

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Code Smart Contract bằng Assembly ?

Introduction. Hồi còn học trong ghế nhà trường bộ môn lập trình tốn nhiều não nhất của mình là code assembly. Nôm na thì bất cứ ngôn ngữ bậc cao nào như C , Go, Java,... được sinh ra để người dễ hiểu và dễ code , tuy nhiên chúng đều sẽ được compiled down xuống assembly một ngôn ngữ bậc thấp để máy h

0 0 58

- vừa được xem lúc

Tích hợp Band Protocol để lấy dữ liệu off-chain cho smart contract

Khoan nói về Band Protocol là gì, mình sẽ đi thẳng vào công dụng của nó, có thể đây chính là mảnh ghép mà bạn vẫn luôn tìm kiếm cho Dapp của mình. Band protocol hỗ trợ các contract giao tiếp với dữ liệu từ thế giới bên ngoài như các dữ liệu về thời tiết, thể thao, giá trị cổ phiếu, tỉ giá các đồng n

0 0 68

- vừa được xem lúc

Xây dựng ứng dụng Dapps đầu tiên của bạn

Tutorial này sẽ giúp bạn xây dựng dapp đầu tiên của bạn – một hệ thống theo dõi chủ nuôi trong một tiệm thú cưng! Được dịch từ tutorial của Truffle. .

1 1 742

- vừa được xem lúc

Làm thế nào để một smart contract có thể nhận NFT (Non-Fungible Token)?

Mở đầu. Như chúng ta đã biết, trên các chain chạy evm ngày nay ngoài Native coin (ETH) và Fungible Token (ERC20) thì chúng còn cón Non-Fungible Token (ERC721 và ERC1155).

0 0 138

- vừa được xem lúc

Lập trình smart contract để tạo NFT kết hợp với Chainklink và IPFS

NFTs hay tên tiếng Anh là Non-Fungible Tokens có nghĩa là token duy nhất mà không bất kì token nào khác giống như nó. .

0 0 294

- vừa được xem lúc

Tản mạn về lỗ hổng trong smart contract của Fairmoon Token, các dấu hiệu bất thường và nguy cơ từ crypto

Hôm nay (19/05/2021) là một ngày đen tối đối với cộng đồng crypto khi:. .

0 0 69