地址 (Address)
address 是 Move 中的內建類型,用於表示存儲中的位置(有時稱為帳戶)。一個 address 數值是一個 256 位元(32 位元組)的識別碼。Move 使用地址來區分 模組 (modules) 的套件,其中每個套件都有自己的地址和模組。Move 的具體部署也可能將 address 數值用於 存儲 操作。
對於 Sui 來說,address 用於表示「帳戶」,以及透過強類型包裝器(使用 sui::object::UID 和 sui::object::ID)表示物件。
儘管 address 在底層是一個 256 位元的整數,但 Move 地址被刻意設計為不透明的 —— 它們不能從整數建立,不支援算術運算,也不能被修改。Move 的特定部署可能有 native (原生) 函式來切換其中一些操作(例如,從位元組 vector<u8> 建立 address),但這些不屬於 Move 語言本身。
雖然存在執行階段的高地址數值(類型為 address 的數值),但它們 不能 用於在執行階段存取模組。
地址及其語法
地址有兩種形式:具名地址 (named addresses) 或數字地址 (numerical addresses)。具名地址的語法遵循 Move 中任何具名識別碼的相同規則。數字地址的語法不限於十六進制編碼的數值,任何有效的 u256 數字值 都可以用作地址數值,例如 42、0xCAFE 和 10_000 都是有效的數字地址常值。
為了區分何時在表達式上下文中使用地址,使用地址時的語法取決於其使用的上下文:
一般來說,你可以將 @ 視為一個運算子,它將地址從命名空間項目轉換為表達式項目。
具名地址 (Named Addresses)
具名地址是一項功能,允許在任何使用地址的地方使用識別碼來代替數字值,而不僅僅是在數值層級。具名地址在 Move 套件中作為頂層元素(在模組和腳本之外)被宣告和綁定,或者作為參數傳遞給 Move 編譯器。
具名地址僅存在於原始語言層級,在位元組碼層級將被完全替換為它們的數值。正因為如此,模組和模組成員應該透過模組的具名地址存取,而不是透過編譯期間分配給具名地址的數字值。因此,雖然 use my_addr::foo 等同於 use 0x2::foo(如果 my_addr 被分配為 0x2),但最佳做法是始終使用 my_addr 名稱。
範例
// 簡寫形式為
// 0x0000000000000000000000000000000000000000000000000000000000000001
let a1: address = @0x1;
// 簡寫形式為
// 0x0000000000000000000000000000000000000000000000000000000000000042
let a2: address = @0x42;
// 簡寫形式為
// 0x00000000000000000000000000000000000000000000000000000000DEADBEEF
let a3: address = @0xDEADBEEF;
// 簡寫形式為
// 0x000000000000000000000000000000000000000000000000000000000000000A
let a4: address = @0x0000000000000000000000000000000A;
// 將具名地址 `std` 的數值分配給 `a5`
let a5: address = @std;
// 任何有效的數字值都可以用作地址
let a6: address = @66;
let a7: address = @42_000;
module 66::some_module { // 不在表達式上下文中,所以不需要 @
use 0x1::other_module; // 不在表達式上下文中,所以不需要 @
use std::vector; // 可以將具名地址用作命名空間項目
...
}
module std::other_module { // 宣告模組時可以使用具名地址
...
}