【问题标题】:How to build and deploy multiple contracts in NEAR protocol如何在 NEAR 协议中构建和部署多个合约
【发布时间】:2021-01-14 12:01:33
【问题描述】:

目前cargo build 会生成一个像contract/target/wasm32-unknown-unknown/release/hello.wasm 这样的WASM 文件。如果我的 contract 源代码树包含多个合约,每个命名的 Rust 模块一个合约,我如何生成多个 wasm 二进制文件?

我的Cargo.toml

[package]
name = "hello"
version = "0.1.0"
authors = ["Why so difficult <argh@example.com>"]
edition = "2018"

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
near-sdk = "2.0.0"

[profile.release]
codegen-units = 1
# Tell `rustc` to optimize for small code size.
opt-level = "z"
lto = true
debug = false
panic = "abort"

[workspace]
members = []

【问题讨论】:

    标签: nearprotocol


    【解决方案1】:

    是的。在撰写本文时,我们目前没有任何类似于 Truffle 的东西来部署多个合约。我们一直在将多个合约组织到它们自己的目录中,然后使用父级 build-all.sh 脚本,该脚本基本上运行目录的 build.sh

    这里的 Chainlink 存储库就是一个例子: https://github.com/smartcontractkit/near-protocol-contracts

    例如,三个合约之一(在本例中为oracle)有自己的目录,其中包含build.sh 脚​​本:

    #!/bin/bash
    
    cargo build --target wasm32-unknown-unknown --release
    mkdir -p ./res
    cp target/wasm32-unknown-unknown/release/oracle.wasm ./res
    

    注意:在 NEAR 上构建智能合约时,您可能会看到 cargo build… 命令的标志比此处显示的要多。在此特定示例中,这些标志已移至 .cargo/config 文件:

    [build]
    rustflags = ["-C", "link-args=-s"]
    

    这有助于实现跨平台兼容性,尤其是与 Windows 的兼容性。


    然后在项目的父级有一个简单的 bash 脚本来运行子脚本,如下所示:

    #!/bin/bash
    
    cd near-link-token && ./scripts/build && cd ..
    cd oracle && ./scripts/build && cd ..
    cd client && ./scripts/build && cd ..
    

    我们确实期待未来有更强大的部署机制。

    【讨论】:

    • 谢谢!这个例子非常有用。为 NEAR 生成 WASM 二进制文件的技术要求是什么?我可能想尝试刺穿工具链,看看是否可以避免过多的目录和多余的 toml 文件。
    • 我发现这个超级有用stackoverflow.com/questions/54843118/…
    • 看起来如果将二进制而不是库用作目标,那么构建多个合约会很容易stackoverflow.com/a/36604610/315168
    • 将正确的勾移到另一个答案,因为它正在获得牵引力。
    【解决方案2】:

    虽然每个合约仍然需要放到自己的 crate 中,但有一个名为 workspaces 的货物功能可以从您的合约中删除至少一些重复的样板文件,您将只有一个 Cargo.lock 文件。

    contract 文件夹拆分为多个文件夹 - 我们称它们为“令牌”和“池”。

    在顶部合同文件夹有一个工作区Cargo.toml

    [profile.release]
    codegen-units = 1
    # Tell `rustc` to optimize for small code size.
    opt-level = "z"
    lto = true
    debug = false
    panic = "abort"
    
    # Important security flag for the compiler,
    # otherwise not present in optimised builds
    # https://stackoverflow.com/q/64129432/315168
    overflow-checks = true
    
    
    [workspace]
    members = [
        "token",
        "pool"
    ]
    
    

    然后在每个文件夹上都有自己的Cargo.toml,它可以依赖于同一工作区中的其他 crate:

    [package]
    name = "nep9000_pool"
    version = "0.0.0"
    
    # https://stackoverflow.com/a/53985748/315168
    edition = "2018"
    
    [dependencies]
    near-sdk = "2.0.0"
    nep9000_token = { path = "../token" }
    
    
    [lib]
    crate-type = ["cdylib", "rlib"]
    
    

    根目录中的一个cargo build 将构建它们。

    Full example.

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2022-06-22
      • 2021-07-23
      • 2021-01-12
      • 2021-04-16
      • 2021-01-19
      • 2020-07-19
      • 2020-09-27
      • 2021-01-19
      相关资源
      最近更新 更多