#abi #deserialize #serialization #eosio #antelope

bin+lib rs_abieos

Antelope(前EOSIO)ABI序列化和反序列化的Rust包装库

2个版本

0.1.5 2024年3月27日
0.1.4 2024年3月26日
0.1.3 2024年3月26日
0.1.2 2024年3月22日
0.1.1 2024年3月22日

#179 in 魔法豆

MIT许可证

4MB
74K SLoC

C++ 56K SLoC // 0.2% comments Python 8K SLoC // 0.3% comments TypeScript 3.5K SLoC // 0.1% comments Visual Studio Project 3K SLoC Rust 1K SLoC // 0.0% comments JavaScript 611 SLoC // 0.4% comments Bazel 526 SLoC // 0.2% comments Automake 423 SLoC // 0.2% comments Shell 303 SLoC // 0.5% comments M4 255 SLoC // 0.4% comments C 240 SLoC // 0.0% comments Visual Studio Solution 234 SLoC Xcode Config 33 SLoC // 0.7% comments INI 7 SLoC

包含 (晦涩的autoconf代码,7KB) configure.ac,(晦涩的autoconf代码,1KB) configure.ac,(晦涩的autoconf代码,3KB) configure.ac

Rust Abieos

Crates.io

API 文档

rs_abieos 是一个Rust库,为 abieos C++ 库提供了一个包装器。它允许您通过提供在ABI文件之间转换二进制和JSON格式、在本地名称和字符串名称之间转换等功能来处理Antelope区块链的数据。

此包装器目前基于 AntelopeIO/abieos 的纯版本。

测试用例正在用Rust完全重写。它们可以在 tests 目录中找到。

要求

  • Linux
  • C++ 工具链。您可以使用其他编译器来构建库。我们建议使用Clang 18来构建 abieos C++ 库。

确保您已经在系统上安装了Clang 18

wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 18

设置说明

要在您的Rust项目中使用 rs_abieos,您需要在 Cargo.toml 文件中将其添加为依赖项

cargo add rs_abieos

然后,运行以下命令以下载和编译 rs_abieos

cargo build
# or if you have another default compiler, use clang-18 to build the library
CXX=clang++-18 CC=clang-18 cargo build

快速使用示例

如何在新的Rust二进制项目中使用库的简短示例

// Step 1 - Bring rs_abieos into scope
use rs_abieos::Abieos;

fn main() {
  // Step 2 - Create an instance of Abieos
  let abieos = Abieos::new();

  // Let's try to convert a string to u64 name
  let name = "alice";
  let name_u64 = abieos.string_to_name(name).unwrap();
  println!("Name: {}, Name_u64: {}", name, name_u64);
}

详细示例

为此示例,下载 eosio.system abi文件 并将其复制到您的项目根目录作为 eosio.abi.json

use rs_abieos::{AbiLike, Abieos, NameLike};

fn main() {
  let abieos = Abieos::new();
  let path = "eosio.abi.json";

  // Read the ABI file
  let abi_content = match std::fs::read_to_string(path) {
    Ok(content) => content,
    Err(e) => {
      eprintln!("Failed to read ABI file: {}", e);
      return;
    }
  };

  // define the NameLike enum to hold the account name using either a string (String) or a reference (StringRef) or an u64 (U64)
  let account_name = "eosio";
  let eosio = NameLike::StringRef(&account_name);

  // create a eosio contract instance using the NameLike enum
  let mut eosio_contract = abieos.contract(eosio);

  // load the abi using the contract instance
  // load_abi method takes an AbiLike enum which can be either a Json (String), Hex (String) or Bin (Vec<u8>)
  let load_status = eosio_contract.load_abi(AbiLike::Json(abi_content));

  // check if the abi was loaded successfully
  match load_status {
    Ok(_) => println!("ABI loaded successfully"),
    Err(e) => eprintln!("Failed to load ABI: {}", e),
  }

  // Let's serialize an action using the eosio contract instance

  // define the action data (example eosio::buyram)
  let action_data = r#"{
            "payer":"alice",
            "receiver":"bob",
            "quant":"100.0000 SYS"
    }"#;

  // retrieve the datatype for the action
  let datatype = match eosio_contract.get_type_for_action("buyram") {
    Ok(datatype) => datatype,
    Err(e) => {
      eprintln!("Failed to get datatype for action: {}", e);
      return;
    }
  };

  // serialize the action data
  let serialized_action = eosio_contract.json_to_hex(datatype.as_str(), action_data.to_string());

  let hex_action = match serialized_action {
    Ok(hex_data) => {
      println!("Serialized action data: {}", hex_data);
      hex_data
    }
    Err(e) => {
      eprintln!("Failed to serialize action data: {}", e);
      return;
    },
  };

  // Let's deserialize the serialized action data
  let json_action = eosio_contract.hex_to_json(datatype.as_str(), hex_action);

  match json_action {
    Ok(json_data) => println!("Deserialized action data: {}", json_data),
    Err(e) => eprintln!("Failed to deserialize action data: {}", e),
  }

}

bin-src/main.rs 包含一个更详细的可执行示例,演示了库的多个用例。

请参阅库的API文档以获取每个函数的详细信息。

库开发

测试

要运行测试用例,请使用以下命令

cargo test
# or
CXX=clang++-18 CC=clang-18 cargo test

无运行时依赖