部署和与 Algorand 智能合约进行交互,使用 AlgoKit CLI 和生成的 TypeScript 客户端。适用于在本地网络/testnet/mainnet 上部署合约,调用合约方法,读取全局/本地/box 状态,选择加入或退出应用程序,或编写交互脚本。强烈的触发词包括“部署合约”、“调用增加方法”、“读取合约状态”、“选择加入应用”、“编写交互脚本”、“getTypedAppClientById”。
调用智能合约
使用 AlgoKit CLI 和生成的 TypeScript 客户端部署和与 Algorand 智能合约进行交互。
概览 / 核心工作流程
- 构建合约:
algokit project run build - 使用 CLI 部署:
algokit project deploy localnet - 使用生成的客户端编写 TypeScript 脚本
- 运行脚本:
npx tsx scripts/my-script.ts
如何进行
1. 构建合约
algokit project run build
这将编译您的合约并生成:
artifacts/<ContractName>/<ContractName>.arc56.json— ARC-56 应用规范artifacts/<ContractName>/client.ts— 生成的 TypeScript 客户端
2. 部署到 Localnet
# 如果本地网络未运行,则启动
algokit localnet start
# 部署(运行 deploy-config.ts)
algokit project deploy localnet
部署脚本(smart_contracts/deploy-config.ts)处理:
- 幂等部署(可以安全重新运行)
- 应用 ID 跟踪
- 初始状态设置
注意部署输出中的 App ID。
3. 使用生成的客户端进行交互
在项目中创建脚本来调用合约方法。示例结构:
// scripts/call-contract.ts
import { AlgorandClient } from '@algorandfoundation/algokit-utils'
import { CounterClient } from '../smart_contracts/artifacts/Counter/client'
async function main() {
// 连接到本地网络
const algorand = AlgorandClient.fromEnvironment()
// 获取默认账户(本地网络分发器)
const deployer = await algorand.account.fromEnvironment('DEPLOYER')
// 为部署的应用创建客户端
const client = algorand.client.getTypedAppClientById(CounterClient, {
appId: BigInt(1234), // 替换为实际的 App ID
sender: deployer,
})
// 调用方法
const result = await client.send.increment({})
console.log('新计数:', result.return)
// 读取全局状态
const state = await client.state.global.getAll()
console.log('全局状态:', state)
}
main().catch(console.error)
运行:
npx tsx scripts/call-contract.ts
4. 常见操作
调用方法
// 无参数
const result = await client.send.increment({})
// 带参数
const result = await client.send.setValue({ args: { value: 42n } })
// 访问返回值
console.log('返回:', result.return)
读取全局状态
// 获取所有全局状态
const state = await client.state.global.getAll()
// 获取特定键(如果合约中已类型化)
const count = await client.state.global.count()
读取本地状态
// 获取某个地址的本地状态
const localState = await client.state.local(address).getAll()
选择加入应用
// 如果合约有 opt_in 方法
await client.send.optIn.optIn({})
// 或使用裸选择加入
await client.send.optIn.bare({})
读取 Box 存储
// 如果合约使用 boxes
const boxValue = await client.state.box.myBox()
批量选择加入/退出
对于多个资产的批量操作:
// 批量选择加入多个资产
const group = algorand.newGroup()
for (const assetId of assetIds) {
group.addAssetOptIn({ sender: account.addr, assetId })
}
await group.send()
// 批量退出多个资产
const closeGroup = algorand.newGroup()
for (const assetId of assetIds) {
closeGroup.addAssetOptOut({ sender: account.addr, assetId, creator: creatorAddr })
}
await closeGroup.send()
重要规则 / 指南
- 部署前总是构建:运行
algokit project run build以生成新的工件 - 使用生成的客户端:它们提供类型安全性并处理 ABI 编码
- 检查 App ID:从部署输出中获取,不要在不同环境中硬编码
- 使用环境变量:将敏感数据如助记词存储在
.env中 - Localnet 账户:使用
algorand.account.fromEnvironment('DEPLOYER')用于本地网络
常见变体 / 边缘情况
| 场景 | 方法 |
|---|---|
| 部署到测试网络 | algokit project deploy testnet(需要资助账户) |
| 自定义发送者 | 使用 algorand.account.fromMnemonic() 创建账户 |
| 多个合约 | 为每个创建单独的客户端实例 |
| 状态未找到 | 确保应用已部署且 App ID 正确 |
| 方法未找到 | 重新构建合约并重新生成客户端 |
环境设置
对于非本地网络部署,设置环境变量:
# .env 文件
ALGORAND_NETWORK=testnet
DEPLOYER_MNEMONIC="你的二十四个词的助记词短语在这里"