跳转到内容

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 */ }
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 中,初始化是由开发者显式触发的操作,赋予其更多控制权——包括对初始化顺序的控制,以及对代码与数据分离(Move 的核心范式)的遵循。显式的 entry fun initialize 须由发布者在发布之后调用(见 Aptos 上的模块)。
  • 包元数据和 named address 放在 Move.toml,而不是直接写在模块里。
[package]
name = "billboard"
version = "1.0.0"
[addresses]
billboard_address = "_"

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