下面的列表展示了 Aleo 指令支持的特殊操作数。
特殊操作数表
| 名称 | 说明 |
|---|---|
| block.height | 在 finalize 作用域内返回区块高度 |
| block.timestamp | 在 finalize 作用域内返回当前区块的 Unix 时间戳 |
| self.signer | 返回发起 transition 的用户地址 |
| self.caller | 返回当前程序的直接调用者地址 |
| network.id | 返回程序执行所在网络的 ID |
| edition | 返回程序的版本号(u16) |
| checksum | 返回程序字符串的 SHA3-256 哈希值 |
| program_owner | 返回提交部署交易的账户地址 |
群生成元表
| 名称 | 说明 |
|---|---|
| group::GEN | 椭圆曲线素数阶子群的生成元 |
| aleo::GENERATOR | 用于 Aleo 账户派生的点 G |
| aleo::GENERATOR_POWERS | 用于 Aleo 签名和加密方案的完整群基数组 |
规范说明
下面是 Aleo 虚拟机(AVM)中每个特殊操作数的规范说明。
network.id
描述
返回程序执行所在网络的 ID。这可用于管理与网络相关的程序行为。
network.id 命令必须在 finalize 块中调用。
当前支持的网络 ID 如下:
0:Mainnet1:Testnet2:Canarynet
使用示例
assert.eq network.id 0u64; // 用于 mainnetblock.height
描述
在 finalize 作用域内返回区块高度。
block.height 命令必须在 finalize 块中调用。
返回值类型为 u64。
使用示例
assert.eq block.height 100u64;block.timestamp
描述
在 finalize 作用域内返回当前区块的 Unix 时间戳。
block.timestamp 命令必须在 finalize 块中调用。
返回值类型为 i64。
使用示例
assert.eq block.timestamp 1767976339i64;self.signer
描述
返回发起 transition 的用户地址。
使用示例
assert.eq self.signer aleo1...;self.caller
描述
返回当前程序的直接调用者地址。
使用示例
assert.eq self.caller aleo1...;edition
描述
以无符号 16 位整数(u16)的形式返回程序版本号。初始部署时,edition 必须为 0u16。每次有效升级时,它必须严格递增 1。
该操作数只能在 finalize 作用域内使用,用于程序可升级性。
使用示例
assert.eq edition 0u16; // 检查这是否为初始部署:::note
你也可以通过程序名限定操作数来引用其他程序的元数据,例如 Program::edition(credits.aleo)、Program::edition(foo.aleo)。如果要使用这种语法,需要先在 Leo 文件中导入对应程序。
:::
checksum
描述
返回一个 32 字节数组([u8; 32u32]),表示程序字符串的 SHA3-256 哈希值。它是程序代码的唯一指纹。
在任何可升级程序的部署中,checksum 都是必需的,用于验证已部署代码是否符合预期。
该操作数只能在 finalize 作用域内使用。
使用示例
assert.eq checksum <EXPECTED_CHECKSUM>; // 验证程序代码是否与预期哈希一致:::note
你也可以通过程序名限定操作数来引用其他程序的元数据,例如 Program::checksum(credits.aleo)、Program::checksum(foo.aleo)。如果要使用这种语法,需要先在 Leo 文件中导入对应程序。
:::
program_owner
描述
返回提交部署交易的账户 address。
在任何可升级程序的部署中,program_owner 都是必需的,并且可用于对程序升级实施访问控制。
该操作数只能在 finalize 作用域内使用。
使用示例
assert.eq program_owner <ADMIN_ADDRESS>; // 将升级权限限制给指定管理员:::note
你也可以通过程序名限定操作数来引用其他程序的元数据,例如 Program::program_owner(credits.aleo)、Program::program_owner(foo.aleo)。如果要使用这种语法,需要先在 Leo 文件中导入对应程序。
:::
:::warning
在可升级功能推出之前部署的程序没有 program_owner。尝试访问它会导致运行时错误。
:::
group::GEN
描述
椭圆曲线素数阶子群的生成元。它用于 Twisted Edwards 曲线上的通用椭圆曲线运算,也会在某些特定类型转换操作中作为默认值之一使用。
使用示例
add group::GEN group::GEN into r0;
mul group::GEN 2scalar into r1;aleo::GENERATOR
描述
用于 Aleo 账户派生的点 G,其中 view_key * G = address。它用于 Aleo 账户和签名派生过程中的 g_scalar_multiply。
它是通过对域字符串 "AleoAccountEncryptionAndSignatureScheme0" 调用 hash_to_curve 生成的群基数组中的第一个元素。这些群基专门用于 Aleo 账户和签名。
使用示例
function derive_address:
input r0 as scalar.public; // view_key
input r1 as address.public; // expected address
// Derive the address from the view key
mul aleo::GENERATOR r0 into r2;
cast r2 into r3 as address;
assert.eq r1 r3;:::note 关于该生成元如何用于账户派生,请参阅 Accounts 文档。 :::
aleo::GENERATOR_POWERS
描述
用于 Aleo 签名和加密方案的群基数组。它通过对域字符串 "AleoAccountEncryptionAndSignatureScheme0" 调用 hash_to_curve 生成,专门用于 Aleo 账户和签名。
该数组长度为 253,有效索引范围是 0u32 到 252u32。
使用示例
function example:
input r0 as scalar.public;
// Access the first generator power (same as aleo::GENERATOR)
mul aleo::GENERATOR_POWERS[0u32] r0 into r1;
// Verify equivalence with aleo::GENERATOR
mul aleo::GENERATOR r0 into r2;
assert.eq r1 r2;
// These are equivalent
assert.eq aleo::GENERATOR aleo::GENERATOR_POWERS[0u32];