컨트랙트 크기 축소
조언 및 예시
이 페이지는 코드 가독성을 희생하면서 컨트랙트 크기를 크게 줄이려는 하위 수준 개념에 익숙한 개발자를 위해 만들어졌습니다.
이 접근 방식이 도움이 될 수 있는 몇 가지 일반적인 시나리오는 다음과 같습니다.
- 계정 관리와 연결되어 있는 컨트랙트
- 팩토리를 사용하여 배포된 컨트랙트
- NEAR의 EVM과 같은 향후 발전 사항
컴파일 시 컨트랙트 크기에 원치 않는 바이트를 추가할 수 있는 몇 가지 항목이 있습니다. 이들 중 일부는 다른 접근 방식으로 더 쉽게 교체될 수 있는 반면, 다른 일부는 시스템 호출에 대한 더 많은 내부 지식이 필요합니다.
작은 승리
플래그 사용
컨트랙트를 컴파일할 때, -C link-arg=-s
플래그를 Rust 컴파일러에 전달해야 합니다.
RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release
다음은 대부분의 예제 내 Cargo.toml
에 사용하는 매개변수입니다.
[profile.release]
codegen-units = 1
opt-level = "s"
lto = true
debug = false
panic = "abort"
overflow-checks = true
더 작은 바이너리를 생성하는지 확인하기 위해, opt-level = "z"
대신 opt-level = "s"
를 사용하여 실험해 볼 수 있습니다. 이에 대한 자세한 내용은 Cargo Book Profiles 섹션을 참조하세요. 이 .wasm 크기 축소 자료를 참조할 수도 있습니다.
매니페스트에서 rlib
제거
필요한 경우가 아니면 매니페스트(Cargo.toml
)에 rlib
가 포함되지 않도록 합니다. 일부 NEAR 예제에서는 이를 포함합니다.
불필요한 블롯 추가
[lib]
crate-type = ["cdylib", "rlib"]
다음과 같은 경우:
팁
[lib]
crate-type = ["cdylib"]
- Rust SDK를 사용할 때, 기본 JSON 직렬화를 재정의하여 대신 Borsh를 사용하도록 할 수 있습니다. 자세한 내용과 예제는 이 페이지를 참조하세요.
- assertion 또는 가드를 사용하는 경우,
assert!
,assert_eq!
, 또는assert_ne!
같은 표준assert
매크로를 사용하지 마세요.unwrap
,expect
, 그리고 Rust의panic!()
매크로에도 유사한 문제가 있습니다.
표준 assertion 예시:
불필요한 블롯 추가
assert_eq!(contract_owner, predecessor_account, "ERR_NOT_OWNER");
다음과 같은 경우:
팁
if contract_owner != predecessor_account {
env::panic(b"ERR_NOT_OWNER");
}
expect
제거 예시:
불필요한 블롯 추가
let owner_id = self.owner_by_id.get(&token_id).expect("Token not found");
다음과 같은 경우:
팁
fn expect_token_found<T>(option: Option<T>) -> T {
option.unwrap_or_else(|| env::panic_str("Token not found"))
}
let owner_id = expect_token_found(self.owner_by_id.get(&token_id));