call-smart-contracts call-smart-contracts

使用 AlgoKit CLI 和 TypeScript 客户端部署和交互 Algorand 智能合约

智能合约 0 次安装 0 次浏览 更新于 3/4/2026

部署和与 Algorand 智能合约进行交互,使用 AlgoKit CLI 和生成的 TypeScript 客户端。适用于在本地网络/testnet/mainnet 上部署合约,调用合约方法,读取全局/本地/box 状态,选择加入或退出应用程序,或编写交互脚本。强烈的触发词包括“部署合约”、“调用增加方法”、“读取合约状态”、“选择加入应用”、“编写交互脚本”、“getTypedAppClientById”。

调用智能合约

使用 AlgoKit CLI 和生成的 TypeScript 客户端部署和与 Algorand 智能合约进行交互。

概览 / 核心工作流程

  1. 构建合约:algokit project run build
  2. 使用 CLI 部署:algokit project deploy localnet
  3. 使用生成的客户端编写 TypeScript 脚本
  4. 运行脚本: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="你的二十四个词的助记词短语在这里"

参考 / 进一步阅读