33 个版本 (14 个稳定版)

5.0.0 2024 年 3 月 11 日
5.0.0-rc.22024 年 2 月 28 日
5.0.0-rc2023 年 11 月 30 日
4.3.0 2023 年 8 月 24 日
3.0.0-rc22020 年 10 月 22 日

#758神奇豆子

Download history 1776/week @ 2024-04-14 2260/week @ 2024-04-21 1899/week @ 2024-04-28 2028/week @ 2024-05-05 2426/week @ 2024-05-12 2342/week @ 2024-05-19 1508/week @ 2024-05-26 2726/week @ 2024-06-02 1487/week @ 2024-06-09 1970/week @ 2024-06-16 1944/week @ 2024-06-23 1352/week @ 2024-06-30 1016/week @ 2024-07-07 1286/week @ 2024-07-14 1682/week @ 2024-07-21 1472/week @ 2024-07-28

每月 5,519 次下载
69 个包(32 个直接) 中使用

Apache-2.0

190KB
4K SLoC

ink! 元数据

ink! 元数据用于以平台无关的方式描述合约属性。要了解更多信息,请参阅 ink! 文档中的部分

注意:元数据版本独立于 ink! 版本!此处描述的元数据版本 3 也适用于 ink! v4。

元数据 JSON 模式

ink! 元数据分为两个主要部分。外部元数据和 ink! 元数据(MetadataVersioned)。

我们不会在这里详细介绍这两者之间的区别,但如果你对此感兴趣,可以在 ink! 文档门户中阅读有关信息。

为了验证合约的元数据是否符合外部工具期望的格式,我们创建了一套 JSON 模式。这些模式描述了元数据的属性,使我们能够验证合约的元数据是否正确。

为了验证元数据,我们将使用jsonschema,但也可以使用在线验证器https://www.jsonschemavalidator.net/

首先,让我们安装jsonschema

cargo install jsonschema

接下来,我们将构建我们的合约元数据

# At the top level of the ink! repo
cargo contract build --manifest-path ./integration-tests/flipper/Cargo.toml

生成的元数据将位于:$PATH_TO_INK_REPO/integration-tests/flipper/target/ink/flipper.json

现在,为了验证我们的元数据,我们需要这些模式。这些模式可以在以下文件夹中找到:outer-schema.jsonink-v3-schema.json

然后我们可以用它来验证我们的元数据与我们的模式

jsonschema outer-schema.json --instance $PATH_TO_INK_REPO/integration-tests/flipper/target/ink/flipper.json

如果flipper.json符合我们的模式,我们应该看到以下内容

flipper.json - VALID

否则,我们将看到

flipper.json - INVALID. Errors: ...

以及错误列表。

我们还可以为ink!版本化的元数据做类似的事情。

jq '. | {V3}' $PATH_TO_INK_REPO/integration-tests/flipper/target/ink/flipper.json > ink-v3-metadata.json
jsonschema ink-v3-schema.json --instance ink-v3-metadata.json

元数据模式生成

目前,这些模式是通过一组在scale-infoinkcargo-contract中拼凑的分支生成的。

  1. 拉取三个仓库
  2. 检查所有仓库的hc-derive-jsonschema分支
  3. 更改scale-infoink的本地路径以匹配您的本地文件夹结构

现在,在您修改后的cargo-contract版本中运行以下命令

cargo run -- contract build --manifest-path $PATH_TO_INK_REPO/integration-tests/flipper/Cargo.toml > schema.json

src/cmd/metadata.rs中,您可以根据传递给schemars::schema_for宏的结构更改正在打印的模式(这在execute函数中被调用)。

let schema = schemars::schema_for!(ContractMetadata);
println!("{}", serde_json::to_string_pretty(&schema).unwrap());

OR

let schema = schemars::schema_for!(ink_metadata::MetadataVersioned);
println!("{}", serde_json::to_string_pretty(&schema).unwrap());

依赖关系

~2.6–4MB
~81K SLoC