如何使用 Rust SDK 在 Aptos 上执行 Move 脚本?

2024-02-24

我想执行这个 Move 脚本,例如在sources/top_up.move:

script {
    use std::signer;
    use aptos_framework::aptos_account;
    use aptos_framework::aptos_coin;
    use aptos_framework::coin;

    fun main(src: &signer, dest: address, desired_balance: u64) {
        let src_addr = signer::address_of(src);

        let balance = coin::balance<aptos_coin::AptosCoin>(src_addr);
        if (balance < desired_balance) {
            aptos_account::transfer(src, dest, desired_balance - balance);
        };
    }
}

这是调用函数aptos_coin.move https://github.com/aptos-labs/aptos-core/blob/main/aptos-move/framework/aptos-framework/sources/aptos_coin.move模块,部署在链上。它的作用对于这个问题来说并不那么重要,但简而言之,它检查目标帐户的余额是否小于desired_balance,如果是这样,则将其加满desired_balance.

我可以通过 CLI 轻松执行此 Move 脚本,如下所示:

aptos move compile
aptos move run-script --compiled-script-path build/MyModule/bytecode_scripts/main.mv

或者甚至只是这样:

aptos move run-script --script-path sources/top_up.move

我想知道我是否可以使用 Rust SDK 来做到这一点?


首先,您需要像上面那样编译脚本。想象一下您的项目布局如下:

src/
    main.rs
move/
    Move.toml
    sources/
        top_up.mv

你会想要进入move/并运行aptos move compile,就像你上面说的。从那里,您可以依赖代码中编译的脚本(见下文)。

完成后,下面是一个最小的代码示例,演示如何使用 Rust SDK 执行 Move 脚本。

Cargo.toml:

[package]
name = "my-example"
version = "0.1.0"
edition = "2021"

[dependencies]
anyhow = "1"
aptos-sdk = { git = "https://github.com/aptos-labs/aptos-core", branch = "mainnet" }

src/main.rs:

use aptos_sdk::crypto::ed25519::Ed25519PublicKey;
use aptos_sdk::types::transaction::authenticator::AuthenticationKey;
use aptos_sdk::{
    rest_client::Client,
    transaction_builder::TransactionFactory,
    types::{
        account_address::AccountAddress,
        chain_id::ChainId,
        transaction::{Script, SignedTransaction, TransactionArgument},
        LocalAccount,
    },
};

static SCRIPT: &[u8] =
    include_bytes!("../../move/build/MyModule/bytecode_scripts/main.mv");

fn main() -> anyhow::Result<()> {
    // Prior to the follow code we assume you've already acquired the necessary
    // information such as chain_id, the private key of the account submitting
    // the transaction, arguments for the Move script, etc.

    // Build a transaction factory.
    let txn_factory = TransactionFactory::new(chain_id);

    // Build a local representation of an account.
    let account = LocalAccount::new(
        AuthenticationKey::ed25519(&Ed25519PublicKey::from(&private_key)).derived_address()
        private_key,
        0,
    );

    // Build an API client.
    let client = Client::new("https://fullnode.mainnet.aptoslabs.com");

    // Create a builder where the payload is the script.
    let txn_builder = transaction_factory.script(Script::new(
        SCRIPT.to_vec(),
        // type args
        vec![],
        // args
        vec![
            TransactionArgument::Address(dest_address),
            TransactionArgument::U64(desired_balance),
        ],
    )));

    // Build the transaction request and sign it.
    let signed_txn = account.sign_with_transaction_builder(
        txn_builder
    );

    // Submit the transaction.
    client.submit_and_wait_bcs(&signed_transaction).await?;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Rust SDK 在 Aptos 上执行 Move 脚本? 的相关文章

随机推荐

  • 由于 Web 部署而将绝对路径更改为相对路径(Python - Flask)

    我创建了一个可以在本地运行的应用程序 我想将其部署到 Heroku 当我部署它时 我在 Heroku 日志中收到错误 提示找不到我在脚本中指定的文件夹 正如预期的那样 它们是绝对路径 我正在尝试做出改变 但没有一个有效 我在服务器端使用 F
  • 如何在 iOS SDK 中为用户提供预先编写的 SMS 消息

    我使用 Apple Dev 网站上的示例代码来学习如何设置预写电子邮件 但是有没有办法类似地设置预写短信 首先你必须添加框架MessageUI到您的项目并导入库 MessageUI MessageUI h 然后遵守协议
  • Android - 将视频/音频文件上传到 Firebase 存储

    我正在使用 Firebase 存储来保存视频 音频用户的文件 我的主要想法是将每个视频 音频保存在用户 ID UID 下 这意味着每个用户在其 UID 下保存有多个视频 音频文件 我写了一个代码 问题是他不断将新视频保存在我保存的旧视频上
  • JavaFX 菜单栏中的菜单右对齐

    In Java Swing可以使用以下方法将菜单放在菜单栏的右侧 menubar add menu1 menubar add Box createHorizontalGlue menubar add menu2 这将把menu1在左边和me
  • 如何播放 MP3 文件? [复制]

    这个问题在这里已经有答案了 我正在尝试访问MP3 http en wikipedia org wiki MP3音频文件保存在我的源文件夹中 以便我可以在 Java 程序 应用程序 而不是小程序 中播放它 我似乎遇到的问题是我无法导入java
  • HTML5在画布上拖放路径,无需JS库

    我想在 HTML5 画布上拖放路径 如果我们点击形状 我没有发现任何类似 SVG 提供事件的东西 有人知道我如何在这里处理路径项上的事件吗 我想在没有任何java脚本库的情况下做到这一点 以下是我当前绘制路径的代码 var canvas d
  • MongoDB索引定义策略

    我有一个基于 MongoDB 的数据库 里面有大约 100K 到 500K 文本文档 并且该集合不断增长 系统应支持文档不同字段的查询 例如 标题 类别 重要性等 该系统是一个近乎实时的系统 每 5 10 分钟就会获取新文档 为了提高查询性
  • 引用具有动态工作表名称的另一个工作簿

    我想引用另一个工作簿和一个依赖于某些单元格值的特定工作表 这个方程有效 S 停机时间 11 Nov 2013 Downtime Tracker xls 30 F 12 但值 Nov 和 30 是动态的 它们分别取决于 D13 和 E13 的
  • C getopt 多个值

    我的论点是这样的 a out i file1 file2 file3 我该如何利用getopt 获取 3 个 或更多 输入文件 我正在做这样的事情 while opt getopt argc argv i xyz 1 case i inpu
  • 如何从范围滑块获取多个值 - bootstrap-slider.js

    我正在使用 bootstrap slider js http www eyecon ro bootstrap slider http www eyecon ro bootstrap slider 给我范围滑块功能 我在一页上有 9 个滑块
  • 删除seaborn线图图例标题

    我想从我的seaborn lineplot 图例中删除标题 我尝试使用这个答案 https stackoverflow com a 45335602 2970186无济于事 import matplotlib pyplot as plt i
  • 我们可以对类型类进行抽象吗?

    我想知道我们不能对类型类进行抽象是否有更深层次的原因 或者我们可以吗 例如 当我们有 fzip forall a a gt a gt b gt c gt b c fzip f xs ys zip f xs f ys 那么我们可以说 fzip
  • 无法让 git 与 iconv 和 utf-16 很好地配合

    我试图让 git 将 UTF 16 识别为文本 以允许我本地比较和修补文本 但我无法获取textconv参数来工作 我可以手动调用 iconv f utf 16 t utf 8 some utf 16 file rc 一切都很好 但是如果我
  • 如何获取 CodenameOne TextField 中每次更改的事件

    我正在使用 CodenameOne 构建一个应用程序 并希望使用 TextField 来过滤一长串项目 我尝试使用 DataChangedListener 如建议的那样https www codenameone com javadoc co
  • 如何获取 QTreeWidget 的项目数

    我创建了一个 QTreeWidget 我正在尝试列出所有显示的项目 如果该项目有子项但未扩展 我不想进入该项目 它确实获取了我在树中可以看到的项目数量 我努力了 for int i 0 i lt MyTreeWidget gt topLev
  • iOS客户端服务器方法

    我熟悉其他平台上用于点对点或客户端 服务器消息传递的 SOAP 和 Web 服务 苹果的消息传递功能是什么 我正在尝试组装一个应用程序服务器来管理协作工作环境 LAN 上平均有 200 个 最多 1000 个移动客户端 例如 一台 Mac
  • Android 从自己的服务器自动更新

    我一直在寻找一个很好的例子 如何更新我自己开发的应用程序 因此 我的设备上安装了一个 apk 当我启动它时 我想检查我的服务器上是否存在任何更新 如果是 则从网络服务器下载并安装 首先我必须检查我的服务器是否有任何更新 如果是 则下载并安装
  • 在Android(使用Java)中,如何设置铃声音量(指定的数字)?

    因此 在我的应用程序中 我有一个搜索栏 允许用户设置铃声音量 0 100 我似乎找不到将铃声音量设置为指定数字的方法 我浏览了音频管理器 http d android com reference android media AudioMan
  • 如何使用 MapKit 绘制两个位置之间的路线并绘制要点?

    我正在使用 MapKit api 获取地图上的当前位置 并绘制由落针指向的两个位置之间的路线 我还想获取其路线之间的所有主要看台 我正在使用下面的函数来获取两个位置之间的路线 NSArray getRoutePointFrom MyLoca
  • 如何使用 Rust SDK 在 Aptos 上执行 Move 脚本?

    我想执行这个 Move 脚本 例如在sources top up move script use std signer use aptos framework aptos account use aptos framework aptos