在 Sui 区块链上使用 PTB(Programmable Transaction Blocks):从基础到实战

  • huahua
  • 更新于 2024-12-11 17:05
  • 阅读 268

Sui 是一个创新的区块链平台,其设计理念不同于传统区块链,特别是在事务(Transaction)构建和执行方面。是 Sui 中的一项核心特性,它允许开发者在一个事务中执行多个操作(如代币转移、合约调用、对象操作等)。通过 PTB,开发者可以构建复杂且高效的区块链应用。在这篇博客中,我们将深入探讨如

@TOC


前言

Sui 是一个创新的区块链平台,其设计理念不同于传统区块链,特别是在事务(Transaction)构建和执行方面。Programmable Transaction Blocks(PTB) 是 Sui 中的一项核心特性,它允许开发者在一个事务中执行多个操作(如代币转移、合约调用、对象操作等)。通过 PTB,开发者可以构建复杂且高效的区块链应用。在这篇博客中,我们将深入探讨如何使用 PTB,从基础的交易构建,到如何在交易中执行多个操作,以及如何优化和扩展这些操作。

image.png


Move 共学活动:快速上手 Move 开发

为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区HackQuestOpenBuildKeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。

通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。

资源链接:

  • sui官方文档🚪:获取关于 Sui 链的详细文档,包括开发指南、API 参考等。
  • move学习B站视频🚪:通过 B 站的视频教程,跟随导师学习 Move 编程语言的基础与进阶。
  • letsmove仓库🚪:这是一个 Move 学习资源的 GitHub 仓库,包含了各种示例代码和教程,帮助开发者掌握 Move 语言。

一、什么是 PTB(Programmable Transaction Blocks)?

PTB(程序化事务块)是 Sui 区块链的一种高级功能,它允许在单一事务中组合多个操作。与传统区块链系统中每个事务只能执行单一操作的限制不同,PTB 提供了更高的灵活性和效率。在 PTB 中,开发者可以将多个操作组合成一个事务,并按特定的逻辑执行,操作之间也可以互相依赖。

PTB 的核心特点

  • 批量操作:支持在一个事务中执行多个操作,减少了网络请求次数,提高了效率。
  • 高度灵活:允许在事务内按顺序执行多个操作,且操作之间可以互相依赖或条件执行。
  • 增强的可编程性:支持执行复杂的逻辑,如代币拆分、合并、转移和合约调用等。
  • 交易优化:通过合并多个操作,降低了区块链网络的负担,减少了计算资源消耗。

更多详情请查看 PTB概念🚪开发者使用手册🚪


二、Sui 的交易模型与 PTB

Sui 的交易并不像传统区块链那样是一个独立的对象,而是可以包含多个操作。每个操作都有自己的输入、输出和执行条件。通过这种方式,开发者可以在一个事务中处理多个步骤,并根据实际需要组织这些步骤。

例如,一个简单的 Sui 交易可能包括:

  • 拆分代币;
  • 转移代币;
  • 执行智能合约调用。

每个步骤都被视为一个操作,并且这些操作可以按特定顺序执行。Sui 的 PTB 使得这些操作能够在同一个交易中协同工作,从而提升了整个网络的处理效率。


三、如何构建和执行 PTB

Sui 提供了一套 API 来帮助开发者构建 PTB。以下是如何使用这些 API 来构建和执行一个交易的详细步骤:

3.1 创建一个基础交易

首先,我们需要使用 Sui 的 Transaction 类来创建一个交易对象:

import { Transaction } from '@mysten/sui/transactions';

const tx = new Transaction();

Transaction 类是构建 PTB 的基础,它允许我们在一个事务中添加多个操作。接下来,我们将详细介绍如何添加这些操作。

3.2 拆分代币和转移

假设我们需要从一个代币中拆分出两个新的代币,并将它们分别转移到不同的地址。我们可以使用 splitCoinstransferObjects 方法来完成这些操作:

// 从 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') 将拆分出的第一个代币转移到指定的地址。

3.3 批量转账操作

如果你有多个地址需要进行转账,可以通过批量处理来提高效率。例如,以下代码演示了如何批量转账:

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) 用于将拆分出的代币转移到指定的地址。

3.4 合约调用与 Move 脚本执行

除了代币转移外,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 网络。在提交交易后,你将获得交易结果,其中包括交易的状态和任何可能的错误信息。

4.1 等待交易完成

在 Sui 中,交易执行可能需要一些时间才能完成。为了确保你获得最新的交易状态,你可以使用 waitForTransaction 方法来等待交易执行完毕:

await client.waitForTransaction({
  digest: result.digest,
});

waitForTransaction 方法返回时,交易已经完全执行,并且你可以获取交易结果。


五、交易输入与输出

Sui 允许多种类型的交易输入和输出。了解这些输入输出的类型对于构建高效的交易非常重要。

5.1 对象引用

在 Sui 中,许多操作需要对象引用作为输入。你可以使用 tx.object 来获取对象的引用,并将其作为操作的输入:

tx.transferObjects([tx.object('0xSomeObject')], '0xSomeAddress');

5.2 纯值

对于简单的值,如整数、字符串等,你可以直接传递这些原始值:

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。如果你有任何问题,欢迎在评论区讨论或直接联系我!🌹

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
huahua
huahua
0xbdd3...53C1
感谢您抽出时间阅读或观看这个简介,制作不易,感谢关注!如果您有任何问题或建议,请随时与我联系。谢谢!v:HHHHHH_1223