实施ARC标准
ARC(Algorand请求评论)标准定义了Algorand上的编码、方法调用和应用规范。这项技能涵盖了智能合约开发中最核心的ARC。
概览 / 核心工作流程
- 确定适用于您用例的ARC
- 按照ARC约定实现合约
- 生成应用规范文件
- 使用应用规范构建类型化客户端
如何进行
智能合约开发的关键ARC
| ARC | 目的 | 何时使用 |
|---|---|---|
| ARC-4 | 应用程序二进制接口(ABI) | 所有智能合约方法调用、类型编码 |
| ARC-22 | 只读方法注释 | 不修改状态的方法 |
| ARC-28 | 事件日志规范 | 发出结构化事件 |
| ARC-32 | 应用规范(已弃用) | 旧版应用规范(使用ARC-56代替) |
| ARC-56 | 扩展应用描述 | 包含完整合约元数据的现代应用规范 |
ARC-4:基础
ARC-4定义了如何为Algorand智能合约编码方法调用和数据类型。
方法签名
方法签名唯一标识一个方法:name(arg_types)return_type
# 方法签名:add(uint64,uint64)uint128
# 方法选择器:SHA-512/256哈希的前4个字节
from algopy import ARC4Contract, arc4
class Calculator(ARC4Contract):
@arc4.abimethod
def add(self, a: arc4.UInt64, b: arc4.UInt64) -> arc4.UInt128:
return arc4.UInt128(a.native + b.native)
import { Contract } from '@algorandfoundation/algorand-typescript'
import { abimethod, UInt64, UInt128 } from '@algorandfoundation/algorand-typescript/arc4'
class Calculator extends Contract {
@abimethod()
add(a: UInt64, b: UInt64): UInt128 {
return new UInt128(a.native + b.native)
}
}
方法选择器计算
方法签名:add(uint64,uint64)uint128
SHA-512/256哈希:8aa3b61f0f1965c3a1cbfa91d46b24e54c67270184ff89dc114e877b1753254a
方法选择器:8aa3b61f(前4个字节)
ARC-32与ARC-56
| 特性 | ARC-32 | ARC-56 |
|---|---|---|
| 状态模式 | 是 | 是 |
| 方法描述 | 是 | 是 |
| 命名结构体 | 否 | 是 |
| 默认参数值 | 部分 | 全部 |
| 源映射 | 否 | 是 |
| 事件(ARC-28) | 否 | 是 |
| 状态 | 已弃用 | 当前 |
对于新项目使用ARC-56。ARC-32为向后兼容而维护。
生成应用规范
应用规范在编译时自动生成:
# 生成ContractName.arc32.json和ContractName.arc56.json
algokit project run build
使用应用规范与客户端
// TypeScript与AlgoKit Utils
import { algorandClient } from '@algorandfoundation/algokit-utils'
import appSpec from './Calculator.arc56.json'
const client = algorand.client.getTypedAppClientById(CalculatorClient, {
appId: 12345n,
appSpec,
})
const result = await client.send.add({ args: { a: 10n, b: 20n } })
# Python与AlgoKit Utils
from algokit_utils import AlgorandClient
from artifacts.calculator_client import CalculatorClient
algorand = AlgorandClient.default_localnet()
client = algorand.client.get_typed_app_client(
CalculatorClient,
app_id=12345,
)
result = client.send.add(a=10, b=20)
重要规则/指南
| 规则 | 详情 |
|---|---|
| ARC-4类型仅在ABI中 | 方法参数和返回值使用arc4.UInt64、arc4.String等 |
| 引用类型仅作为参数 | account、asset、application不能作为返回类型 |
| 15个参数限制 | 16+参数的方法将额外参数编码为参数15中的元组 |
| 返回前缀 | 返回值以151f7c75前缀记录 |
| 裸方法无选择器 | 裸调用使用NumAppArgs == 0进行路由 |
常见变体/边缘情况
| 场景 | 方法 |
|---|---|
| 从合约调用ARC-4方法 | 使用arc4.abi_call()进行类型安全的内部交易 |
| 创建带方法的合约 | 在@abimethod装饰器中使用create="require" |
| 只读方法(ARC-22) | 在装饰器中使用readonly=True参数 |
| 发出事件(ARC-28) | 使用arc4.emit()与类型化事件结构体 |
参考资料/进一步阅读
- ARC-4 ABI详情 - 类型、编码规则、方法调用
- ARC-32/56应用规范 - 应用规范详情
- ARC标准 - 官方ARC文档
- 调用智能合约 - 使用AlgoKit Utils进行ABI调用