32 个版本 (14 个稳定)
4.1.1 | 2024年4月17日 |
---|---|
4.0.2 | 2024年3月14日 |
4.0.0-rc.1 | 2023年12月1日 |
4.0.0-rc | 2023年11月30日 |
0.1.0 | 2022年6月8日 |
#955 in 魔法豆
每月下载量:2,438
在 9 个crate(6 个直接) 中使用
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