Sui 是一个创新的区块链平台,其设计理念不同于传统区块链,特别是在事务(Transaction)构建和执行方面。是 Sui 中的一项核心特性,它允许开发者在一个事务中执行多个操作(如代币转移、合约调用、对象操作等)。通过 PTB,开发者可以构建复杂且高效的区块链应用。在这篇博客中,我们将深入探讨如
@TOC
Sui 是一个创新的区块链平台,其设计理念不同于传统区块链,特别是在事务(Transaction)构建和执行方面。Programmable Transaction Blocks(PTB) 是 Sui 中的一项核心特性,它允许开发者在一个事务中执行多个操作(如代币转移、合约调用、对象操作等)。通过 PTB,开发者可以构建复杂且高效的区块链应用。在这篇博客中,我们将深入探讨如何使用 PTB,从基础的交易构建,到如何在交易中执行多个操作,以及如何优化和扩展这些操作。
为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。
通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。
资源链接:
PTB(程序化事务块)是 Sui 区块链的一种高级功能,它允许在单一事务中组合多个操作。与传统区块链系统中每个事务只能执行单一操作的限制不同,PTB 提供了更高的灵活性和效率。在 PTB 中,开发者可以将多个操作组合成一个事务,并按特定的逻辑执行,操作之间也可以互相依赖。
PTB 的核心特点:
Sui 的交易并不像传统区块链那样是一个独立的对象,而是可以包含多个操作。每个操作都有自己的输入、输出和执行条件。通过这种方式,开发者可以在一个事务中处理多个步骤,并根据实际需要组织这些步骤。
例如,一个简单的 Sui 交易可能包括:
每个步骤都被视为一个操作,并且这些操作可以按特定顺序执行。Sui 的 PTB 使得这些操作能够在同一个交易中协同工作,从而提升了整个网络的处理效率。
Sui 提供了一套 API 来帮助开发者构建 PTB。以下是如何使用这些 API 来构建和执行一个交易的详细步骤:
首先,我们需要使用 Sui 的 Transaction
类来创建一个交易对象:
import { Transaction } from '@mysten/sui/transactions';
const tx = new Transaction();
Transaction
类是构建 PTB 的基础,它允许我们在一个事务中添加多个操作。接下来,我们将详细介绍如何添加这些操作。
假设我们需要从一个代币中拆分出两个新的代币,并将它们分别转移到不同的地址。我们可以使用 splitCoins
和 transferObjects
方法来完成这些操作:
// 从 gas 代币中拆分出两个新的代币
const [coin1, coin2] = tx.splitCoins(tx.gas, [100, 200]);
// 将第一个代币转移到地址 1
tx.transferObjects([coin1], '0xAddress1');
// 将第二个代币转移到地址 2
tx.transferObjects([coin2], '0xAddress2');
在这段代码中:
tx.splitCoins(tx.gas, [100, 200])
将 gas
代币拆分为两个新的代币,一个金额为 100,另一个为 200。tx.transferObjects([coin1], '0xAddress1')
将拆分出的第一个代币转移到指定的地址。如果你有多个地址需要进行转账,可以通过批量处理来提高效率。例如,以下代码演示了如何批量转账:
interface Transfer {
to: string;
amount: number;
}
const transfers: Transfer[] = getTransfers();
const tx = new Transaction();
// 拆分代币,创建多个新的代币
const coins = tx.splitCoins(tx.gas, transfers.map((transfer) => transfer.amount));
// 为每个转账操作创建转账命令
transfers.forEach((transfer, index) => {
tx.transferObjects([coins[index]], transfer.to);
});
在这段代码中:
getTransfers()
假设是获取转账列表的函数。tx.splitCoins(tx.gas, transfers.map((transfer) => transfer.amount))
会根据每笔转账的金额,拆分出相应的代币。tx.transferObjects([coins[index]], transfer.to)
用于将拆分出的代币转移到指定的地址。除了代币转移外,Sui 还允许你在交易中调用智能合约moveCall
(Move 脚本)。以下是如何在交易中调用 Move 合约的示例:
tx.moveCall({
target: '0x2::coin::mint_and_transfer',
arguments: [tx.pure.string(treasuryCap), tx.pure.string(amount), tx.pure.string(address)],
});
在这段代码中:
moveCall
用于执行指定的 Move 合约函数。target
是合约的地址和函数名,arguments
则是传递给该函数的参数。通过这种方式,你可以在交易中调用任意的 Move 合约,实现复杂的逻辑,如铸造 coin代币、处理资产等。
当交易构建完成后,你需要通过 Sui 的客户端执行该交易。以下是如何签名并执行交易的示例:
import { client } from '@mysten/sui/client';
// 获取签名者(如用户钱包)
const signer = getSigner();
// 执行并提交交易
const result = await client.signAndExecuteTransaction({
signer,
transaction: tx,
});
signAndExecuteTransaction
方法将交易提交到 Sui 网络。在提交交易后,你将获得交易结果,其中包括交易的状态和任何可能的错误信息。
在 Sui 中,交易执行可能需要一些时间才能完成。为了确保你获得最新的交易状态,你可以使用 waitForTransaction
方法来等待交易执行完毕:
await client.waitForTransaction({
digest: result.digest,
});
当 waitForTransaction
方法返回时,交易已经完全执行,并且你可以获取交易结果。
Sui 允许多种类型的交易输入和输出。了解这些输入输出的类型对于构建高效的交易非常重要。
在 Sui 中,许多操作需要对象引用作为输入。你可以使用 tx.object
来获取对象的引用,并将其作为操作的输入:
tx.transferObjects([tx.object('0xSomeObject')], '0xSomeAddress');
对于简单的值,如整数、字符串等,你可以直接传递这些原始值:
const coin = tx.splitCoins(tx.gas, [100]);
tx.transferObjects([coin], '0xSomeSuiAddress');
交易提交后,你可能希望获取交易的详细信息。Sui 提供了多种方式来获取交易结果:
showObjectChanges
选项,你可以看到交易执行后对象的变化。const result = await client.signAndExecuteTransaction({
signer,
transaction: tx,
options: { showObjectChanges: true, showBalanceChanges: true },
});
Sui 的 PTB 特性为开发者提供了灵活而强大的工具,使得在一个交易中执行多个操作成为可能。通过 PTB,开发者可以高效地执行批量操作、调用合约、拆分和转移代币等,所有这些操作都可以在一个事务中完成,从而减少网络请求,提高效率。
随着 Sui 的不断发展,未来还会有更多新的功能和优化。掌握 PTB 的使用,不仅能提升开发效率,还能帮助你更好地构建复杂的区块链应用。希望这篇博客能够为你提供有用的参考,帮助你快速上手 Sui PTB。如果你有任何问题,欢迎在评论区讨论或直接联系我!🌹
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!