跳转到内容

Modules and Initialization

在 Move 里,最接近 Solidity 合约这一代码单元的是 module

pragma solidity ^0.8.20;
contract Billboard {
constructor(address owner_) {
// initialization
}
}
module billboard_address::billboard {
use std::signer;
/// Caller is not the module publisher.
const ENOT_AUTHORIZED: u64 = 1;
struct Billboard has key { /* fields */ }
public entry fun initialize(owner: &signer) {
assert!(signer::address_of(owner) == @billboard_address, ENOT_AUTHORIZED);
move_to(owner, Billboard { /* ... */ });
}
}
  • Solidity 用 contract 关键字声明合约;Move 用 address::module_name 声明模块。
  • Solidity 的 constructor 在部署时执行一次;在 Move 中,初始化逻辑应放在显式的 public entry fun initialize 中,由发布者在发布之后调用(见 Aptos 上的模块)。
  • 包元数据和 named address 放在 Move.toml,而不是直接写在模块里。
[package]
name = "billboard"
version = "1.0.0"
[addresses]
billboard_address = "_"

生产部署时,也应考虑 把代码作为 object 部署 以及 package upgrade policy。迁移时最关键的是:初始化依然需要显式编写,只是打包方式和地址模型不同了。