我如何使用Rust SDK在Aptos上执行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上的函数。移动模块,它被部署在链上。对于这个问题,它所做的不是那么重要,但简而言之,它检查目标帐户的余额是否小于desired_balance,如果小于,则将其充值到desired_balance

我可以通过CLI轻松执行这个移动脚本,像这样:

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?;
}

相关内容

  • 没有找到相关文章

最新更新