{"author":{"address":"0xbdd3203FeD7bC268DC76BFF731E78C73f76053C1","user":"https://learnblockchain.cn/people/17384"},"content":{"body":"@[TOC](文章目录)\r\n\r\n---\r\n\r\n# 前言\r\nSui 是一个创新的区块链平台，其设计理念不同于传统区块链，特别是在事务（Transaction）构建和执行方面。**Programmable Transaction Blocks（PTB）** 是 Sui 中的一项核心特性，它允许开发者在一个事务中执行多个操作（如代币转移、合约调用、对象操作等）。通过 PTB，开发者可以构建复杂且高效的区块链应用。在这篇博客中，我们将深入探讨如何使用 PTB，从基础的交易构建，到如何在交易中执行多个操作，以及如何优化和扩展这些操作。\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/12/QCB2UJfS675955dbae3f0.png)\r\n\r\n\r\n---\r\n# Move 共学活动：快速上手 Move 开发\r\n为了帮助更多开发者快速了解和掌握 Move 编程语言，**Move 共学**活动由 **HOH 社区**、**HackQuest**、**OpenBuild**、**KeyMap** 联合发起。该活动旨在为新手小白提供一个良好的学习平台，带领大家一步步熟悉 Move 语言，并了解如何将其应用到 Web3 开发中。\r\n\r\n通过与 Move 领域的专业导师们合作，参与者可以快速掌握 Move 语言的基础知识，逐步向更复杂的应用开发进阶。无论是区块链初学者，还是有一定开发经验的工程师，都能从中获益。\r\n\r\n**资源链接：**\r\n- [sui官方文档🚪](https://docs.sui.io/)：获取关于 Sui 链的详细文档，包括开发指南、API 参考等。\r\n- [move学习B站视频🚪](https://www.bilibili.com/video/BV1BMD8Y2EfE/)：通过 B 站的视频教程，跟随导师学习 Move 编程语言的基础与进阶。\r\n- [letsmove仓库🚪](https://github.com/move-cn/letsmove)：这是一个 Move 学习资源的 GitHub 仓库，包含了各种示例代码和教程，帮助开发者掌握 Move 语言。\r\n\r\n\r\n---\r\n\r\n\r\n\r\n# 一、什么是 PTB（Programmable Transaction Blocks）？\r\n\r\nPTB（程序化事务块）是 Sui 区块链的一种高级功能，它允许在单一事务中组合多个操作。与传统区块链系统中每个事务只能执行单一操作的限制不同，PTB 提供了更高的灵活性和效率。在 PTB 中，开发者可以将多个操作组合成一个事务，并按特定的逻辑执行，操作之间也可以互相依赖。\r\n\r\n**PTB 的核心特点**：\r\n- **批量操作**：支持在一个事务中执行多个操作，减少了网络请求次数，提高了效率。\r\n- **高度灵活**：允许在事务内按顺序执行多个操作，且操作之间可以互相依赖或条件执行。\r\n- **增强的可编程性**：支持执行复杂的逻辑，如代币拆分、合并、转移和合约调用等。\r\n- **交易优化**：通过合并多个操作，降低了区块链网络的负担，减少了计算资源消耗。\r\n\r\n更多详情请查看 [PTB概念🚪](https://docs.sui.io/concepts/transactions/prog-txn-blocks)和 [开发者使用手册🚪](https://sdk.mystenlabs.com/typescript/transaction-building/basics)\r\n\r\n---\r\n# 二、Sui 的交易模型与 PTB\r\n\r\nSui 的交易并不像传统区块链那样是一个独立的对象，而是可以包含多个操作。每个操作都有自己的输入、输出和执行条件。通过这种方式，开发者可以在一个事务中处理多个步骤，并根据实际需要组织这些步骤。\r\n\r\n例如，一个简单的 Sui 交易可能包括：\r\n- 拆分代币；\r\n- 转移代币；\r\n- 执行智能合约调用。\r\n\r\n每个步骤都被视为一个操作，并且这些操作可以按特定顺序执行。Sui 的 PTB 使得这些操作能够在同一个交易中协同工作，从而提升了整个网络的处理效率。\r\n\r\n---\r\n\r\n# 三、如何构建和执行 PTB\r\n\r\nSui 提供了一套 API 来帮助开发者构建 PTB。以下是如何使用这些 API 来构建和执行一个交易的详细步骤：\r\n\r\n## 3.1 创建一个基础交易\r\n\r\n首先，我们需要使用 Sui 的 `Transaction` 类来创建一个交易对象：\r\n\r\n```typescript\r\nimport { Transaction } from '@mysten/sui/transactions';\r\n\r\nconst tx = new Transaction();\r\n```\r\n\r\n`Transaction` 类是构建 PTB 的基础，它允许我们在一个事务中添加多个操作。接下来，我们将详细介绍如何添加这些操作。\r\n\r\n## 3.2 拆分代币和转移\r\n\r\n假设我们需要从一个代币中拆分出两个新的代币，并将它们分别转移到不同的地址。我们可以使用 `splitCoins` 和 `transferObjects` 方法来完成这些操作：\r\n\r\n```typescript\r\n// 从 gas 代币中拆分出两个新的代币\r\nconst [coin1, coin2] = tx.splitCoins(tx.gas, [100, 200]);\r\n\r\n// 将第一个代币转移到地址 1\r\ntx.transferObjects([coin1], '0xAddress1');\r\n\r\n// 将第二个代币转移到地址 2\r\ntx.transferObjects([coin2], '0xAddress2');\r\n```\r\n\r\n在这段代码中：\r\n- `tx.splitCoins(tx.gas, [100, 200])` 将 `gas` 代币拆分为两个新的代币，一个金额为 100，另一个为 200。\r\n- `tx.transferObjects([coin1], '0xAddress1')` 将拆分出的第一个代币转移到指定的地址。\r\n\r\n## 3.3 批量转账操作\r\n\r\n如果你有多个地址需要进行转账，可以通过批量处理来提高效率。例如，以下代码演示了如何批量转账：\r\n\r\n```typescript\r\ninterface Transfer {\r\n  to: string;\r\n  amount: number;\r\n}\r\n\r\nconst transfers: Transfer[] = getTransfers();\r\n\r\nconst tx = new Transaction();\r\n\r\n// 拆分代币，创建多个新的代币\r\nconst coins = tx.splitCoins(tx.gas, transfers.map((transfer) =\u003e transfer.amount));\r\n\r\n// 为每个转账操作创建转账命令\r\ntransfers.forEach((transfer, index) =\u003e {\r\n  tx.transferObjects([coins[index]], transfer.to);\r\n});\r\n```\r\n\r\n在这段代码中：\r\n- `getTransfers()` 假设是获取转账列表的函数。\r\n- `tx.splitCoins(tx.gas, transfers.map((transfer) =\u003e transfer.amount))` 会根据每笔转账的金额，拆分出相应的代币。\r\n- `tx.transferObjects([coins[index]], transfer.to)` 用于将拆分出的代币转移到指定的地址。\r\n\r\n## 3.4 合约调用与 Move 脚本执行\r\n\r\n除了代币转移外，Sui 还允许你在交易中调用智能合约`moveCall`（Move 脚本）。以下是如何在交易中调用 Move 合约的示例：\r\n\r\n```typescript\r\ntx.moveCall({\r\n  target: '0x2::coin::mint_and_transfer',\r\n  arguments: [tx.pure.string(treasuryCap), tx.pure.string(amount), tx.pure.string(address)],\r\n});\r\n```\r\n\r\n在这段代码中：\r\n- `moveCall` 用于执行指定的 Move 合约函数。\r\n- `target` 是合约的地址和函数名，`arguments` 则是传递给该函数的参数。\r\n\r\n通过这种方式，你可以在交易中调用任意的 Move 合约，实现复杂的逻辑，如铸造 coin代币、处理资产等。\r\n\r\n---\r\n\r\n# 四、执行交易\r\n\r\n当交易构建完成后，你需要通过 Sui 的客户端执行该交易。以下是如何签名并执行交易的示例：\r\n\r\n```typescript\r\nimport { client } from '@mysten/sui/client';\r\n\r\n// 获取签名者（如用户钱包）\r\nconst signer = getSigner(); \r\n\r\n// 执行并提交交易\r\nconst result = await client.signAndExecuteTransaction({\r\n  signer,\r\n  transaction: tx,\r\n});\r\n```\r\n\r\n`signAndExecuteTransaction` 方法将交易提交到 Sui 网络。在提交交易后，你将获得交易结果，其中包括交易的状态和任何可能的错误信息。\r\n\r\n## 4.1 等待交易完成\r\n\r\n在 Sui 中，交易执行可能需要一些时间才能完成。为了确保你获得最新的交易状态，你可以使用 `waitForTransaction` 方法来等待交易执行完毕：\r\n\r\n```typescript\r\nawait client.waitForTransaction({\r\n  digest: result.digest,\r\n});\r\n```\r\n\r\n当 `waitForTransaction` 方法返回时，交易已经完全执行，并且你可以获取交易结果。\r\n\r\n---\r\n\r\n# 五、交易输入与输出\r\n\r\nSui 允许多种类型的交易输入和输出。了解这些输入输出的类型对于构建高效的交易非常重要。\r\n\r\n## 5.1 对象引用\r\n\r\n在 Sui 中，许多操作需要对象引用作为输入。你可以使用 `tx.object` 来获取对象的引用，并将其作为操作的输入：\r\n\r\n```typescript\r\ntx.transferObjects([tx.object('0xSomeObject')], '0xSomeAddress');\r\n```\r\n\r\n## 5.2 纯值\r\n\r\n对于简单的值，如整数、字符串等，你可以直接传递这些原始值：\r\n\r\n```typescript\r\nconst coin = tx.splitCoins(tx.gas, [100]);\r\ntx.transferObjects([coin], '0xSomeSuiAddress');\r\n```\r\n\r\n---\r\n\r\n# 六、交易结果与反馈\r\n\r\n交易提交后，你可能希望获取交易的详细信息。Sui 提供了多种方式来获取交易结果：\r\n- **余额变化**：你可以在执行交易时请求显示余额变化。\r\n- **对象变更**：通过 `showObjectChanges` 选项，你可以看到交易执行后对象的变化。\r\n\r\n```typescript\r\nconst result = await client.signAndExecuteTransaction({\r\n  signer,\r\n  transaction: tx,\r\n  options: { showObjectChanges: true, showBalanceChanges: true },\r\n});\r\n```\r\n\r\n\r\n---\r\n\r\n# 总结\r\nSui 的 PTB 特性为开发者提供了灵活而强大的工具，使得在一个交易中执行多个操作成为可能。通过 PTB，开发者可以高效地执行批量操作、调用合约、拆分和转移代币等，所有这些操作都可以在一个事务中完成，从而减少网络请求，提高效率。\r\n\r\n随着 Sui 的不断发展，未来还会有更多新的功能和优化。掌握 PTB 的使用，不仅能提升开发效率，还能帮助你更好地构建复杂的区块链应用。希望这篇博客能够为你提供有用的参考，帮助你快速上手 Sui PTB。如果你有任何问题，欢迎在评论区讨论或直接联系我！🌹","title":"在 Sui 区块链上使用 PTB（Programmable Transaction Blocks）：从基础到实战"},"history":null,"timestamp":1733907937,"version":1}