sui-rust-operator

用rust 封装的一个和sui进行交互的组件库。

项目起因

sui 官方提供的sdk https://docs.sui.io/testnet/build/rust-sdk 过于臃肿,使用不太方便。

基本思路

  1. 使用 std ,reqwest 完成基本的rpc 的http 请求部分
  2. 使用 serde serde_json 完成相关结构的封装
  3. 按照 官方提供的 RPC 文档,和sui 进行交互。
  4. 对于需要签名的请求,根据 unsafe 请求,构建未签名的 tx-bytes
  5. 使用 ed25519-dalek 封装账号结构,对未签名的tx-bytes 完成签名,重新发送,完成执行

已实现的功能

  1. 账号管理

```rust let store = Keystore::default(); let account = store.loadaccount(0).unwrap(); let newaccount: SuiAccount = SuiAccount::new_account();

println!("Account: {} , seed : {} ", newaccount, newaccount.dumphexseed()); ```

2.network 网络设置

rust let network = network::default(); println!("network : {}", network); println!("gateway : {}", network.get_gateway()); println!("faucet_url : {}", network.faucet_url());

3.获取交互client

rust let myclient = client::debug_client(network);

4.读取操作

rust match myclient.get_object_id(&object_id).await { Ok(object) => { println!( "object detail : {}", serde_json::to_string_pretty(&object).unwrap() ) } Err(err) => { println!("get object error : {}", err) } }

rust match myclient.get_owned_objects(account.to_address(), query, None, None) .await { Err(err) => { println!("err :{}", err) } Ok(result) => { println!("data found : {}", result.result.data.len()); } }

rust match myclient.get_all_balances(account.to_address()).await { Err(err) => { println!("err :{}", err) } Ok(result) => { for balance in result.result { println!(" {} => {}", balance.coin_type, balance.total_balance) } } }

5.sui 链写操作

通过unsafe rpc 发送数据构建tx_bytes. account 使用对应的私钥,对数据完成签名,再次发送。

构建完成交易后,通过 account.signunsafetransaciton 完成签名。最后使用 sendpayloadeffect 发送交易。

```rust match myclient .unsafemovecall( &account.toaddress(), &"0x988fb71f38bb0323eeb5014c7a00e5988b047c09f39d58f157fc67d43ddfc091", &"helloworld", "mint", vec![], vec![], &"0x6abb224a86b8e571f221ea6bf6a5028923b29b13201a3c29f6fdaaaa3b4cbb97", 3000000, ) .await { Err(err) => { println!("{}", err) } Ok(data) => { let signedpayload = account.signunsafetransaciton(data.result);

    let effet = myclient.send_payload_effect(&signed_payload).await.unwrap();

    println!("reuslt : {}", serde_json::to_string_pretty(&effet).unwrap());
    println!(
        "transaction link : {}",
        myclient
            .network
            .transaction_link(&effet.result.digest.to_string())
    )
}

} ```

需要使用sui 准备好编译完成的bytes 文件。

shell sui move build --dump-bytecode-as-base64 --path . > delopy.json

示例合约介绍

playground 提供一个测试模块,已完成move_call 的相关功能

  1. 合约 资源 ${address}::hello_world::HelloWorldObject
  2. entry : mint, mintto , updatetext, destroy

TODO

  1. 支持 其他的秘钥类型
  2. 支持 批量交易 batch transaction
  3. 多签交易