如何在 NEAR 协议中构建和部署多个合约
How to build and deploy multiple contracts in NEAR protocol
目前 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 = []
是的。在撰写本文时,我们目前没有任何类似于 Truffle 的东西来部署多个合约。我们一直在将多个合约组织到它们自己的目录中,然后使用 parent-level 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"]
这有助于 cross-platform 兼容性,尤其是与 Windows。
然后在项目的父级别有一个简单的 bash 脚本运行子脚本,如下所示:
#!/bin/bash
cd near-link-token && ./scripts/build && cd ..
cd oracle && ./scripts/build && cd ..
cd client && ./scripts/build && cd ..
我们确实期待在未来拥有更强大的部署机制。
虽然每个合约仍然需要放在自己的箱子里,但有一个叫做 workspaces 的货物功能,它至少从你的合约中删除了一些重复的样板文件,你将只有一个 Cargo.lock
文件.
将 contract
文件夹拆分为多个文件夹 - 我们称它们为 'token' 和 'pool'。
在最上面的合约文件夹中有一个工作区 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
#
overflow-checks = true
[workspace]
members = [
"token",
"pool"
]
然后在每个文件夹上你都有自己的 Cargo.toml
可以依赖于同一工作区中的其他板条箱:
[package]
name = "nep9000_pool"
version = "0.0.0"
#
edition = "2018"
[dependencies]
near-sdk = "2.0.0"
nep9000_token = { path = "../token" }
[lib]
crate-type = ["cdylib", "rlib"]
根中的一个 cargo build
将构建它们。
目前 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 = []
是的。在撰写本文时,我们目前没有任何类似于 Truffle 的东西来部署多个合约。我们一直在将多个合约组织到它们自己的目录中,然后使用 parent-level 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"]
这有助于 cross-platform 兼容性,尤其是与 Windows。
然后在项目的父级别有一个简单的 bash 脚本运行子脚本,如下所示:
#!/bin/bash
cd near-link-token && ./scripts/build && cd ..
cd oracle && ./scripts/build && cd ..
cd client && ./scripts/build && cd ..
我们确实期待在未来拥有更强大的部署机制。
虽然每个合约仍然需要放在自己的箱子里,但有一个叫做 workspaces 的货物功能,它至少从你的合约中删除了一些重复的样板文件,你将只有一个 Cargo.lock
文件.
将 contract
文件夹拆分为多个文件夹 - 我们称它们为 'token' 和 'pool'。
在最上面的合约文件夹中有一个工作区 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
#
overflow-checks = true
[workspace]
members = [
"token",
"pool"
]
然后在每个文件夹上你都有自己的 Cargo.toml
可以依赖于同一工作区中的其他板条箱:
[package]
name = "nep9000_pool"
version = "0.0.0"
#
edition = "2018"
[dependencies]
near-sdk = "2.0.0"
nep9000_token = { path = "../token" }
[lib]
crate-type = ["cdylib", "rlib"]
根中的一个 cargo build
将构建它们。