Sui Testnet 简单发布a + b

  • Nigdle
  • 更新于 2024-03-23 18:56
  • 阅读 1005

Sui Testnet 简单发布a + b

一:Testnet

$\mathit {Sui}$ 拥有主网、开发网和测试网网络,其中,测试网网络又可以分为 $\mathit {Devnet}$ 和 $\mathit {Testnet}$,当然,你也可以构建本地 $\mathit {Sui}$ 网络进行纯本地开发,但是本地的开发环境不是持久的,每一次启动,本地网络都会作为一个全新的网络启用。<br>这里我们选择连接到 $\mathit {Testnet}$ 尝试发布我们的第一个程序,当然,你也可以选择 $\mathit {Devnet}$ 或者本地网络再或者其它,原理都是一样的,只是代码细节需要根据实际选择进行调整。

如果你还没有安装 $\mathit {Sui}$ 的话,可以根据之前的文章布置环境,现在,在命令行输入 sui client,如果此前没有运行过相关命令,那么系统将为您配置客户端信息,显示为:<br>Config file ["&lt;PATH-TO-FILE>/client.yaml"] doesn't exist, do you want to connect to a Sui Full node server [y/N]?<br>按 $\mathit y$ 并回车后,终端会提示:<br>Sui Full node server URL (Defaults to Sui Devnet if not specified) :<br>这里将默认连接到 $\mathit {Devnet}$,如果要在初次连接就一步到位选择我们即将使用的 $\mathit {Testnet}$ 的话,需要在这里键入对应的地址。不过,由于后续也可以更换连接的网络,并且之后的那种方法更加通用(这也是为什么要选 Testnet,方便展现那种方法),所以我们这里不如直接回车,得到如下提示:<br>Select key scheme to generate keypair (0 for ed25519, 1 for secp256k1, 2 for secp256r1):<br>这里有 $\text 0,\ \text 1,\ \text 2$ 三种加密方案可供选择,选哪个都行,键入任何一个供选择的数字后回车,根据具体情况,你将得到类似的,包含地址和 $\text {12}$ 个恢复时使用的单词信息:<br>Generated new keypair for address with scheme "ed25519" [0xb9c83a8b40d3263c9ba40d551514fbac1f8c12e98a4005a0dac072d3549c2442] Secret Recovery Phrase : [cap wheat many line human lazy few solid bored proud speed grocery]<br>这条信息最好能记录一下,说不定往后哪天就用到了呢。

此时,可以通过sui client envs来查看当前的网络环境,不难发现只有一个 $\mathit {devnet}$ 的网络正在活跃,换句话说,也就是我们当前的网络环境是 $\mathit {Devnet}$。<br>如果想要切换到 $\mathit {Testnet}$,就需要使用添加新网络环境的命令:<br>sui client new-env --alias &lt;ALIAS> --rpc &lt;RPC-SERVER-URL><br>其中,尖括号里的内容是需要替换的,$\mathit {ALIAS}$ 是自定义的别名,$\mathit {PRC}$-$\mathit {SERVER}$-$\mathit{URL}$ 是想要连接到的新的网络的地址,已知 $\mathit {Testnet}$ 的 $\mathit {URL}$ 为 https://fullnode.devnet.sui.io:443,如果将其命名为testnet,就可以通过这条命令来添加:<br>sui client new-env --alias testnet --rpc https://fullnode.devnet.sui.io:443<br>此时再通过sui client envs来查看网络环境,就可以看到有两条,但是当前依旧处于 $\mathit {devnet}$,用如下命令就可以将其切换到 $\mathit {testnet}$:<br>sui client switch --env testnet<br>同理,如果你想要添加新的网络,或者切换到别的网络,就可以以此举一反三。

二:重写 a + b

这是我们上一篇写的 $\mathit a + \mathit b$:

module my_first_package::my_module {
    public fun add(a: u64, b: u64): u64 {
        a + b
    }
}

发布到链上之后测试代码都无法使用了,似乎也没有什么好的输出手段让用户得到 $\mathit a + \mathit b$ 的结果,那么我们来考虑一个问题,对象拥有者。<br>$\mathit {move}$ 代码中,任何一个东西都是对象,如果丧失了拥有者,那么这个所谓的对象也将走向消亡,当然,这里的“消亡”有的时候必须手动进行,这就不是这篇文章需要讨论的内容了。<br>回到上述问题,如果我们将 $\mathit a + \mathit b$ 的结果对象,拥有权从当前函数转交到程序的拥有者(在这里,也就是我们)的手上,这样一来,就增加了该结果对象的寿命,我们再通过对象的地址去询问答案,是不是就完美解决了问题?

稍加拓展,如果我们想要重新定义一个对象呢?

在 $\mathit {move}$ 语言当中,定义一个类型可以有四种修饰词:

  • $\mathit {Copy}$:被修饰的值可以被复制。
  • $\mathit {Drop}$:被修饰的值在作用域结束时可以被丢弃。
  • $\mathit {Key}$:被修饰的值可以作为键值对全局状态进行访问。
  • $\mathit {Srote}$:被修饰的值可以被存储到全局状态。

基本类型和内建类型的修饰词都是预先定义并且不可更改的,比如整型、布尔类型同时拥有除了 $\mathit {Key}$​ 之外的其它三项。

显然,针对上述问题,我们需要对自定义的对象,添加 $\mathit {Key}$ 修饰词,让它能够被唯一标识并全局访问。因此,我们可以将代码进行如下修改:

module my_first_package::my_module {
    use sui::object::{Self, UID};
    use sui::tx_context::{Self, TxContext};
    use sui::transfer;

    struct Result has key {
        id: UID,
        res: u64,
    }

    public fun add(a: u64, b: u64, ctx: &mut TxContext) {
        let result = Result {
            id: object::new(ctx),
            res: a + b,
        };
        transfer::transfer(result, tx_context::sender(ctx));
    }
}

导入相关模块后,定义了一个名为 $\mathit {Result}$ 的结构体,它拥有唯一表示用的 $\mathit {id}$ 以及用来存储 $\mathit a + \mathit b$ 结果的整型字段 $\mathit {res}$。<br>在 $\mathit {add}$ 函数当中,我们创建了一个 $\mathit {Result}$ 存储在 $\mathit {result}$ 当中,$\mathit {id}$ 是通过自带的方式唯一生成的,$\mathit {res}$ 自然就是通过传入的两个参数相加得到。<br>很容易注意到 $\mathit {TxContext}$,这是一个特殊参数,不需要用户自己传递,这也是为什么一般作为函数最后一个参数而不写在前面的原因,它记录有有关交易的基本信息,本篇文章不适合深究,有兴趣的小伙伴可以去官方文档查看。<br>最后,有一个 $\mathit {transfer}$ 操作,目的就是将 $\mathit {result}$​ 的拥有权转交到“我们”手上。

三:发布

链上的交易都是需要开销的,即使是测试网络,那么,开销怎么来?既然是测试用网,肯定不需要自己掏腰包,只需要一行命令就可以搞定:sui client faucet,回车后会提示你到账有延迟,大概等个一分钟左右,通过sui client gas查看余额。<br>如果你申请了多次,就会到账多次,对于每一笔金额,可以拆分也可以合并,这不是本篇文章的重点也就不再赘述。

现在,我们就可以用领到的测试用水去发布上链第一个程序:sui client publish --gas-budget 5000000,其中--gas-budget表示本次交易的最大开销,如果超过了这个金额,那么发布将会失败。<br>如果你得到了error: InsufficientGas,这就是金额设置的不够大,扩大金额重新发布即可。

成功之后终端会返回交易的详细信息,包括交易数据、交易效果、交易块事件、对象更改和余额更改。<br>在 $\mathit {Object\ Changes}$ 表中,可以查看到以发布内容的详细信息,包括它的 $\mathit {ID}$,这也是我们通过调用链上程序时所需要的信息。

sui client call --function &lt;FUNCTION_NAME> --package &lt;PACKAGE_ID> --module &lt;MODULE_NAME> --args &lt;...> --gas-budget 10000000

  • $\mathit {FUNCTION_NAME}$ 是调用的函数名。
  • $\mathit {PACKAGE_ID}$ 是从 $\mathit {Object\ Changes}$ 表中得到的 $\mathit {ID}$ 信息。
  • $\mathit {MODULE_NAME}$ 是调用的模块名。
  • $\mathit {args}$ 后的尖括号内依次填传入函数的参数,之间用空格隔开。
  • 最后的数据,同样的,代表本次交易的最大开销。

按照要求填入并执行命令,例如:sui client call --function add --package 0xe2496799139225a06e7251857cdf46a32c20d773030c62b9bf24095cd60aac43 --module my_module --args 333 666 --gas-budget 10000000

同样的,终端会返回交易的详细信息,其中可以在 $\mathit {Object\ Changes}$ 表当中,看到这一笔交易过后我们有了一个自己所拥有的对象,这其中就存储有 $\mathit a + \mathit b$ 的结果,可以借助其 $\mathit {ObjectID}$​ 进行查询。<br>通过 sui client object &lt;OBJECT_ID>就可以看这个对象的详细信息,如下图所示:<br>result.png

$\text {333} + \text {666} = \text {999}$,$\mathit {res}$ 当中存储的就是这个值,大成功(๑•̀ㅂ•́)و✧!

四:加入组织,共同进步!

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

0 条评论

请先 登录 后评论
Nigdle
Nigdle
0xa745...Fe19
江湖只有他的大名,没有他的介绍。