Modules and Initialization
在 Move 里,最接近 Solidity 合约这一代码单元的是 module。
Solidity contract
Section titled “Solidity contract”pragma solidity ^0.8.20;
contract Billboard { constructor(address owner_) { // initialization }}Move module
Section titled “Move module”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。迁移时最关键的是:初始化依然需要显式编写,只是打包方式和地址模型不同了。