使用Sui CLI在Sui上创建和执行PTBs

Sui命令行界面(CLI)中的新命令允许用户直接从终端或Bash脚本创建和执行可编程交易区块(PTB)。这个新命令为开发人员在实现和执行PTB方面提供了更大的灵活性。

PTB为开发人员提供了一种非常强大的编程工具,这在其他区块链上不可用。将多个交易链接在一起形成单个可执行文件的能力在更广泛的软件工程世界中可能被视为理所当然,但在区块链上却代表了一个根本性的飞跃。

以往,只能使用可用的SDK之一来处理 PTB。现在,偏爱通过终端和编写脚本工作的开发人员有了使用这一强大功能的新途径。

查看Sui CLI PTB命令文档以获取详细信息和示例。

下面的示例显示了创建简单PTB所需的命令。它创建了三个新币,其价值分别为1000、2000和3000MIST,来自gas币,并将它们转移到地址:0x02a212de6a9dfa3a69e22387acfbafbb1a9e591bd9d636e7895dcfc8de05f331(注意地址前面的@符号,表示这是一个地址,而不是十六进制)。

sui client ptb \
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e591bd \
--split-coins gas [1000,2000,3000] \
--assign coins \
--transfer-objects to_address [coins.0, coins.1, coins.2] \
--gas-budget 5000000 \
--summary

以下是结果消息:

╭──────────────────────────────────────────────────────╮ 
│ PTB Execution Summary                                │ 
├──────────────────────────────────────────────────────┤ 
│ Digest: 7S7XpkGns8mQ4mBUzjdM32xqNHGF2P1ErHSLbb4Chn2j │ 
│ Status: success                                      │
│ Gas Cost Summary:                                    │ 
│ Storage Cost: 3952000                                │ 
│ Computation Cost: 1000000                            │ 
│ Storage Rebate: 978120                               │ 
│ Non-refundable Storage Fee: 9880                     │ 
╰──────────────────────────────────────────────────────╯

Sui CLI PTB

CLI PTB支持的主要理念是让开发人员能够从命令行构建和执行PTB。您也可以编写Bash脚本来构建和执行PTB,就像您从命令行中所做的那样,这在自动化不同任务时提供了很大的灵活性。

sui client ptb命令接受以下选项:

sui client ptb -h
Build, preview, and execute programmable transaction blocks. Depending on your shell, you might have to use quotes around arrays or other passed values. Use --help to see examples for how to use the core functionality of this command.

Usage: sui client ptb [OPTIONS]

Options:
      --assign <NAME> <VALUE>                                         Assign a value to a variable name to use later in the PTB.
      --gas-coin <ID>                                                 The object ID of the gas coin to use. If not specified, it will try to use the first gas coin that it finds that has at least
                                                                      the requested gas-budget balance.
      --gas-budget <MIST>                                             The gas budget for the transaction, in MIST.
      --make-move-vec <TYPE> <[VALUES]>                               Given n-values of the same type, it constructs a vector. For non objects or an empty vector, the type tag must be specified.
      --merge-coins <INTO_COIN> <[COIN OBJECTS]>                      Merge N coins into the provided coin.
      --move-call <PACKAGE::MODULE::FUNCTION> <TYPE> <FUNCTION_ARGS>  Make a move call to a function.
      --split-coins <COIN> <[AMOUNT]>                                 Split the coin into N coins as per the given array of amounts.
      --transfer-objects <[OBJECTS]> <TO>                             Transfer objects to the specified address.
      --publish <MOVE_PACKAGE_PATH>                                   Publish the Move package. It takes as input the folder where the package exists.
      --upgrade <MOVE_PACKAGE_PATH>                                   Upgrade the move package. It takes as input the folder where the package exists.
      --preview                                                       Preview the list of PTB transactions instead of executing them.
      --summary                                                       Show only a short summary (digest, execution status, gas cost). Do not use this flag when you need all the transaction data
                                                                      and the execution effects.
      --warn-shadows                                                  Enable shadow warning when the same variable name is declared multiple times. Off by default.
      --json                                                          Return command outputs in json format.
  -h, --help 

概念和特性

除了使用现有的传统PTB相关概念外,还需要一些新的概念来支持这个命令。

  • 使用 — assign命令重新使用结果或自定义定义的变量。
  • 在执行PTB之前预览PTB中的输入命令。
  • 在多次声明具有相同标识符的变量时发出警告。
  • 受益于对常见包(如sui、std和deepbook)的名称解析(而不是使用它们的地址)。
  • 错误消息提供了对PTB语法出错的简明而准确的解释。
  • 变量名不能是address、bool、vector、some、none、gas、u8、u16、u32、u64、u128 或 u256。

示例

让我们通过一些示例来展示Sui CLI PTB工具的强大功能。请注意,这些示例是在Bash中进行测试的,您的情况可能会有所不同,这取决于您的shell以及它如何处理和解析字符串和引号(例如,在zsh或fish中,您可能需要在数组周围使用引号,但在Bash中则不需要)。

嵌套或多类型

当您需要使用嵌套类型时,您可以简单地将所需的类型包装在<and>中。例如,如果参数期望一个 Option<vector<u256>>,您可以写成 std::option::Option<vector<u256>>。

以下是一个例子:

sui client ptb 
--make-move-vec "<std::option::Option<vector<u256>>>" "[vector[]]" \
--gas-budget 5000000

如果您需要为调用传递多个类型,可以在类型之间使用逗号,例如<u64,u8,bool,string>。

域名解析

CLI PTB使用域名解析来识别常见包如sui、std和deepbook,因此您可以直接使用它们,而不是它们的地址:0x2、0x1 或 0xdee9。您仍然可以使用传统的package::module::function方法来调用特定函数。例如,您可以同时使用std::option或0x1::option。

sui client ptb \
--assign A none \
--move-call std::option::is_none "<u64>" A \
--gas-budget 5000000

您还可以通过其别名而不是完整地址来引用本地钱包中的地址。

为变量分配数据

— assign参数将值绑定到变量。您可以以几种方式使用它:

1.将值分配给变量:

sui client ptb \
--assign myvar 100 \
--gas-budget 5000000

2.将变量分配给上一个交易的结果。在以下示例中,split-coins会产生三个新对象,由于使用了 — assign,因此可以通过coins变量访问这些对象。

sui client ptb \
--split-coins gas "[1000,2000,3000]" \
--assign coins \
--gas-budget 5000000

3.将变量分配给另一个变量

sui client ptb \  
--assign myvar vector[100, 200] \  
--assign my_addr @0x0fe375fff0ee40d20c54a7f2478b9b5c7eaa3625b761 \  
--assign old_address my_addr \  
--gas-budget 5000000

发布包并调用函数

在Sui仓库中,第一个包示例是一个简单的Move项目。简而言之,该示例发布了该包,创建了一个Forge对象,您可以使用该对象调用new_sword函数创建swords。下面的代码假设您已经设置了Sui测试网环境,并且您的地址有足够的gas。

首先,进入示例文件夹并发布该包。

cd sui/examples/move/first_package
sui client ptb 
--move-call sui::tx_context::sender \
--assign "sender" \
--publish "." \
--assign upgrade_cap \
--transfer-objects [upgrade_cap] sender \
--gas-budget 50000000

发布此包会生成以下交易数据:

INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING first_package
Successfully verified dependencies on-chain against source.
╭──────────────────────────────────────────────────────╮
│ PTB Execution Summary                                │
├──────────────────────────────────────────────────────┤
│ Digest: 8ULSyjJXhX5CPiEge3a7T2kLSA3YA8V44BAGZPdknJ1h │
│ Status: success                                      │
│ Gas Cost Summary:                                    │
│   Storage Cost: 9978800                              │
│   Computation Cost: 1000000                          │
│   Storage Rebate: 978120                             │
│   Non-refundable Storage Fee: 9880                   │
╰──────────────────────────────────────────────────────╯

从上一个结果中,我们可以使用digest,并将其传递给sui client tx-digest来查找packageId和Forge对象的objectId。我们想要锻造一个新sword并将其转移到此交易的发送者。

接下来,我们查找我们发布的包中的new_sword函数,以了解我们需要传递给函数的参数。其签名是:

/// Constructor for creating swords 
 public fun new_sword( 
     forge: &mut Forge, 
     magic: u64, 
     strength: u64, 
     ctx: &mut TxContext, 
 ): Sword 

现在,由于包存在于链上,让我们使用PTB来创建一个sword。首先要做的是使用move-call命令获取发送者的地址,并将该调用的结果分配给sender变量。我们可以使用assign来处理magic和strength参数,并将Forge对象的ID分配给forge_obj变量。

最后,通过move-call命令调用new_sword函数,传递所有正确的函数参数,将move-call的结果分配给sword变量,并将新sword对象转移到发送者。

sui client ptb \
--move-call sui::tx_context::sender \
--assign sender \
--assign magic 10u64 \
--assign strength 50u64 \
--assign forge_obj @0xd5d19fde64ea43876add02efb2a769372869f30118 \
--move-call  0xbe6edeefea02371d35fdde5a45033d8d8e2e00b3eb911b23fa::example::new_sword  forge_obj magic strength \
--assign sword \
--transfer-objects "[sword]" sender \
--gas-budget 5000000 \
--summary

因为我们设置了 — summary标志,所以执行结果如下所示:

╭──────────────────────────────────────────────────────╮ 
│ PTB Execution Summary                                │ 
├──────────────────────────────────────────────────────┤ 
│ Digest: HYqWpN9sYBGLawj4BE9VnRM7qaezUFA8aLrGBbjf72L7 │ 
│ Status: success                                      │ 
│ Gas Cost Summary:                                    │ 
│    Storage Cost: 3739200                             │ 
│    Computation Cost: 1000000                         │ 
│    Storage Rebate: 2309868                           │ 
│    Non-refundable Storage Fee: 23332                 │ 
╰──────────────────────────────────────────────────────╯ 

在Bash脚本中使用PTB

为了方便自动化和重用,您可以将终端中的PTB命令复制粘贴到Bash脚本中并运行它。

#!/usr/bin/bash 

sui client ptb \ 
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e59
--split-coins gas "[1000,2000,3000]" \
--assign coins \
--transfer-objects "[coins.0, coins.1, coins.2]" to_address \
--gas-budget 5000000

上述代码可以作为普通的 Bash 脚本运行。

在Bash脚本中使用PTB发行100个NFT并转移它们

此示例使用Bash脚本来发行100个NFT并将它们转移到100个地址。NFT在此发布到GitHub的智能合约中进行定义。我们发布了该包,并获取了num_issuer_cap和package ID。项目在module num中定义了mint函数,我们在此声明。

然后脚本从一个文本文件中加载地址,每个地址都在新行上。然后它构建了一个move-call命令字符串,在for循环中调用mint函数并将对象转移到一个地址。最后,执行了PTB。

请注意,作为Bash脚本,您可以像处理其他Bash脚本一样传递环境变量。

num_issuer_cap=0x3e8a046807edd63b75014b9aff0f8dc30b76344a4dfdb1ae4655932e0514086b
package=0x610834b5fa960b297a5caf6af56bcc045d67d158889da5b511a20031307ce099
module=num
fun=mint

echo "Loading addresses from file"
readarray -t addresses < addresses.txt

cmd=""
for address in ${addresses[@]}; do
  cmd+="--move-call $package::$module::$fun @$num_issuer_cap --assign X --transfer-objects [X] @$address "
done

echo "Executing PTB"
sui client ptb \
 $cmd \
 --gas-budget 5000000000 \
 --summary

最终结果如下:

bash-5.2$ bash working-demo.sh
Loading addresses from file
Executing PTB
╭──────────────────────────────────────────────────────╮
│ PTB Execution Summary                                │
├──────────────────────────────────────────────────────┤
│ Digest: 7THBdpRHWSTiWExxSB7A3m9E7PDP9kQaD16N8xXevdcA │
│ Status: success                                      │
│ Gas Cost Summary:                                    │
│   Storage Cost: 132376800                            │
│   Computation Cost: 1000000                          │
│   Storage Rebate: 2392632                            │
│   Non-refundable Storage Fee: 24168                  │
╰──────────────────────────────────────────────────────╯

购买SuiNS上的域名

以下示例通过首先创建一个没有SUI的零币来注册一个Sui域名,以供move-call使用,然后将新创建的域名对象转移到特定地址。

sui client ptb \
--assign suins_object_id  @0x300369e8909b9a6464da265b9a5a9ab6fe2158a040e84e808628cde7a07ee5a3 \
--split-coins gas "[0]" \
--assign zero_coin \
--move-call 0x4255184a0143c0ce4394a3f16a6f5aa5d64507269e54e51ea396d569fe8f1ba5::register::register suins_object_id '"mysui.sui"' 1u8 zero_coin @0x6 \
--assign suins_name \
--transfer-objects "[suins_name]"  @0x0fe375fff0ee40d20c54a7f2478b9b5c7eaa3625b7611f9661ec5faefb4a6fea \
--gas-budget 50000000

这个命令的结果是:

╭──────────────────────────────────────────────────────╮
│ PTB Execution Summary                                │
├──────────────────────────────────────────────────────┤
│ Digest: 5D2W4beXGWzF4Cn69y6ihnTvoyBC99vb5zGhpxAhdq1z │
│ Status: success                                      │
│ Gas Cost Summary:                                    │
│   Storage Cost: 10039600                             │
│   Computation Cost: 1000000                          │
│   Storage Rebate: 5394708                            │
│   Non-refundable Storage Fee: 54492                  │ 
╰──────────────────────────────────────────────────────╯

预览而不是执行PTB

— preview标志对于复杂的PTB很有用,它列出PTB中的交易而不是执行它。预览显示了在解析整个输入后的每个交易及其参数的格式良好的表格。它还显示了任何错误。这在处理复杂的PTB时很有帮助,因为它会生成交易列表而不是执行PTB。

sui client ptb \
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e59 \
--split-coins gas [1000,2000,3000] \
--assign coins \
--transfer-objects [coins.0, coins.1, coins.2] to_address \
--gas-budget 5000000 \
--summary \
--preview

这次调用的结果如下:

警告和错误

当使用 — assign命令和 — warn-shadows标志时,工具在遇到阴影变量时会发出警告。也就是说,如果给定变量名有多个声明,工具会警告开发人员同一变量被声明多次。以下是一个示例:

sui client ptb \ 
--assign a 10 \ 
--assign a 15 \ 
--gas-budget 5000000 \ 
--warn-shadows

下图显示了构建PTB时产生的警告:

我们在报告有用的错误方面投入了大量的工作。我们的目标是让错误信息包含足够的信息来说明问题所在,准确指出导致该错误的参数,并在某些情况下甚至提供如何修复的提示。

例如,如果用户调用std::Option::is_none函数并将模块名称用大写而不是小写传递,工具将生成以下消息:

sui client ptb \  
--move-call std::Option::is_none none \ 
--gas-budget 5000000

错误消息将显示如下:

这是另一个例子,展示了用户在命令不产生任何结果后调用 — assign X而不传递变量时产生的错误:

sui client ptb \ 
--assign X \ 
--gas-budget 5000000

在这种情况下,错误将如下所示:

这里是另一个关于工具中保留字段的错误示例:

sui client ptb --assign address 5 --gas-budget 5

在这种情况下,错误消息将显示为:


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|英文Twitter|中文Twitter|Discord|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商务口语每天学习,柯桥英语培训

今天天气好 Its a nice day today. 今天天气真好。(搭讪) Ive heard too much about you. 久仰大名。(恭维) Remember me to... 请代我向……问好。(问候) 半个句型要记牢 Its a ~(nice/good/bad) day today. Tip: 如果你想和某人搭讪而找不着好的借口时&#xff0c;就说天气…

Macs Fan Control Pro--精准掌控Mac风扇,优化散热新选择

Macs Fan Control Pro是一款专为Mac电脑设计的高级风扇控制工具。它具备强大的温度监测能力&#xff0c;可以实时监测Mac电脑各个核心组件的温度&#xff0c;并通过直观的界面展示给用户。同时&#xff0c;用户可以根据个人需求自定义风扇速度&#xff0c;或者选择预设的自动风…

【STL】vector的模拟实现

目录 前言 vector概述 vector的数据结构 vector迭代器的运用 vector的构造和析构 vector的拷贝构造与赋值 拷贝构造 传统写法 现代写法 赋值重载 vector的扩容 reserve() resize() vector的元素操作 push_back() pop_back() insert() erase() 迭代器…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

算法学习——LeetCode力扣动态规划篇5(198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III )

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

Python|OpenCV-实现检测人脸以及性别检测(12)

前言 本文是该专栏的第13篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 性别检测是计算机视觉领域里面的一个重要学习领域,简单的来说,它可以实现自动识别一张图片中的人物性别。为此在本文中,笔者将结合OpenCV和Tensorflow来实现对一张图进行“图片中的人物人…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

【更新】在湘源7、8中使用2023年11月国空用地用海分类

之前为了做控规&#xff0c;从湘源8中扒了一套国空用地用海的绘图参数给湘源7使用。 【预告】在湘源控规7中使用 国空用地用海分类标准 但是部里在2023年11月又发布了一套新的用地用海分类。 本想去湘源8里面再扒一下&#xff0c;结果发现湘源8自己还没有更新呢&#xff0c;…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种&#xff0c;用来传递准确的时间信息。 PPS&#xff0c;Pulse Per Second&#xff0c;是每秒一次的脉冲信号&#xff0c;其上升沿表示整秒的时刻。TOD&#xff0c;Time of Day&#xff0c;是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…

Servlet Response的常用方法 缓存和乱码处理

前言 Servlet Response相关的信息&#xff0c;在service方法中使用的是HttpServletResponse&#xff0c;它继承自ServletResponse&#xff0c;扩展了Http协议相关的内容&#xff0c;下面简单记录一下它的基本用法。 一、response组成内容 以下是一个常见response响应的内容&…

红黑树介绍及插入操作的实现

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

node.js的错误处理

当我打开一个不存在的文件时&#xff0c;错误如下&#xff1a; 在读取文件里面写入console.log&#xff08;err&#xff09;&#xff0c;在控制台中可以看到我的错误代码类型&#xff1a;文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…

每日面经分享(pytest入门)

1. pytest具有什么功能 a. 自动发现和执行测试用例&#xff1a;pytest可以自动发现项目中的测试文件和测试函数&#xff0c;无需手动编写测试套件或测试运行器。 b. 丰富的断言函数&#xff1a;pytest提供了丰富的断言函数&#xff0c;方便地验证测试结果是否符合预期。断言函…

【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取】

1、SPI协议 简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface)&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间&#xff0c;要求通讯速率较高的场合。 通信方式&#xff1a;同…

基于SpringBoot+Vue交通管理在线服务系统的开发(源码+部署说明+演示视频+源码介绍+lw)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

Docker搭建LNMP环境实战(10):大结局!脚本化一次性安装测试、生产环境

实现使用 Docker 在一台服务器上搭建支持 80、443 端口访问的测试、生产双站点系统。 1、生产环境&测试环境的规划和部署 1.1、说明 图1 系统部署示意图 1&#xff09;项目 此处以一个演示项目的形式来进行环境的规划和部署。此项目名称默认定义为&#xff1a;“demo”&a…

网安学习笔记-day11,FTP服务器

FTP服务器 FTP介绍 FTP(File Transfer Protocol)文件传输协议 端口号&#xff1a;TCP 20/21 工作方式&#xff1a; 主动模式被动模式 服务器部署 准备阶段 配置IP windowsXP 192.168.1.21&#xff08;也可DHCP自动获取&#xff09; Windows2003 192.168.1.1 安装万维网…

[SWPUCTF 2021 新生赛]crypto5(小明文攻击)

题目&#xff1a; 直接暴力破解&#xff1a; from Cryptodome.Util.number import * import gmpy2 flag 251667516535309413648396638468065433877208653392633709079856557751521873194647157371165991714772070474300653458826262598807568390941796270326238953302426553…