32 个版本 (14 个稳定)

4.1.1 2024年4月17日
4.0.2 2024年3月14日
4.0.0-rc.12023年12月1日
4.0.0-rc2023年11月30日
0.1.0 2022年6月8日

#955 in 魔法豆

Download history 811/week @ 2024-04-16 922/week @ 2024-04-23 324/week @ 2024-04-30 894/week @ 2024-05-07 1061/week @ 2024-05-14 957/week @ 2024-05-21 1095/week @ 2024-05-28 917/week @ 2024-06-04 626/week @ 2024-06-11 662/week @ 2024-06-18 889/week @ 2024-06-25 704/week @ 2024-07-02 432/week @ 2024-07-09 429/week @ 2024-07-16 1072/week @ 2024-07-23 379/week @ 2024-07-30

每月下载量:2,438
9 个crate(6 个直接) 中使用

Apache-2.0

175KB
4K SLoC

Contract Transcode

包含将智能合约调用编码到 SCALE 的实用程序。

目前是 cargo-contract 的一部分,它是用于编写 ink! 的智能合约的构建工具。

请参阅 crate 文档 以获取示例用法。


lib.rs:

要从命令行与合约交互,需要将参数从字符串表示形式转换为 SCALE 编码表示形式。

例如 "false" -> 0x00

并且为了显示事件和 RPC 响应中的 SCALE 编码数据,必须从 SCALE 编码表示形式转换为可读的字符串。

例如 0x00 -> "false"

转码依赖于scale-info元数据,以便动态确定预期类型。

编码

首先将字符串解析为中间的Value

"false" -> ::布尔值(false)

然后,此值与该上下文中的预期类型的元数据进行匹配。例如,flipper合约接受一个bool参数作为其new构造函数,这将在合约元数据中反映为scale_info::TypeDefPrimitive::Bool

#[ink(constructor)]
pub fn new(init_value: bool) -> Self {
    Self { value: init_value }
}

解析的Value::Bool(false)参数值与scale_info::TypeDefPrimitive::Bool类型元数据相匹配,然后可以将值安全地编码为bool,结果为0x00,然后可以将它作为数据附加到消息中,以调用构造函数。

解码

首先根据元数据确定SCALE编码数据的类型。例如,当通过RPC以“dry run”方式调用时,消息的返回类型

#[ink(message)]
pub fn get(&self) -> bool {
    self.value
}

元数据将定义返回类型为scale_info::TypeDefPrimitive::Bool,因此当接收到原始数据时,可以将其解码为正确的Value,然后将其转换为字符串以显示给用户

0x00 -> ::布尔值(false) -> "false"

SCALE对象符号(SCON)

可以使用SCON将复杂类型表示为字符串,以便进行人机交互。它旨在类似于Rust语法来实例化类型。例如:

Foo{a: false,b: [0, 1, 2],c: "bar",d: (0, 1) }

此字符串可以被解析为Value::Map,并与scale_info::TypeDefComposite元数据一起,可以被转码为SCALE编码的字节。

与上面原始类型bool的例子一样,这在解码SCALE编码的字节并转换为可读字符串的方向上也是一样的。

示例

let metadata_path = Path::new("/path/to/contract.json");
let transcoder = ContractMessageTranscoder::load(metadata_path).unwrap();

let constructor = "new";
let args = ["foo", "bar"];
let data = transcoder.encode(&constructor, &args).unwrap();

println!("Encoded constructor data {:?}", data);

依赖项

~9MB
~191K SLoC