如何在NEAR协议中构建和部署多个合同

时间:2020-09-28 21:46:13

标签: nearprotocol

当前,cargo build产生一个WASM文件,例如contract/target/wasm32-unknown-unknown/release/hello.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 = []

2 个答案:

答案 0 :(得分:4)

是的。在撰写本文时,我们目前还没有类似于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 ..

我们希望将来拥有更强大的部署机制。

答案 1 :(得分:2)

尽管每个合同仍然需要自己处理,但有一个称为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,它们可以依赖于同一工作区中的其他板条箱:

[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