You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python向Starknet Cairo合约函数传入地址进行单元测试?

在Cairo合约单元测试中用Python传入账户地址的方法

在Cairo的Python测试框架里,账户地址本质是felt类型(对应Python的整数),你可以通过两种方式给合约函数传地址:生成测试账户获取地址,或者直接使用自定义整数值。以下是具体操作和代码示例:

1. 生成测试账户并传入地址

通过Starknet.deploy_account()可以创建测试用的账户实例,其address属性就是可直接传给合约的地址值,适合模拟真实账户调用场景的测试。

import pytest
from starkware.starknet.testing.starknet import Starknet

@pytest.mark.asyncio
async def test_authorized_management():
    # 初始化测试环境
    starknet = await Starknet.empty()
    
    # 创建两个测试账户
    authorized_account = await starknet.deploy_account()
    random_account = await starknet.deploy_account()
    
    # 部署你的授权管理合约
    auth_contract = await starknet.deploy("contracts/authorization.cairo")
    
    # 调用合约的添加授权函数,传入测试账户地址
    await auth_contract.add_authorized(authorized_account.address).invoke()
    
    # 验证地址已被授权
    check_result = await auth_contract.is_authorized(authorized_account.address).call()
    assert check_result.result == (1,)
    
    # 验证未授权地址的状态
    check_result = await auth_contract.is_authorized(random_account.address).call()
    assert check_result.result == (0,)

2. 使用自定义地址值

如果不需要完整的账户实例,仅需传入地址参数,直接用整数表示即可(Cairo的felt类型与Python int完全兼容),适合快速测试特定地址的场景。

@pytest.mark.asyncio
async def test_custom_address_input():
    starknet = await Starknet.empty()
    auth_contract = await starknet.deploy("contracts/authorization.cairo")
    
    # 自定义一个地址(用十六进制或十进制整数均可)
    test_address = 0x123456789ABCDEF0123456789ABCDEF
    
    # 传入自定义地址到合约函数
    await auth_contract.add_authorized(test_address).invoke()
    
    # 验证授权状态
    check_result = await auth_contract.is_authorized(test_address).call()
    assert check_result.result == (1,)

3. 测试带modifier的函数

如果合约里有only_authorized这类需要验证调用者地址的modifier,测试时可以通过invoke(sender=address)指定调用方地址,模拟不同账户的调用行为:

@pytest.mark.asyncio
async def test_only_authorized_modifier():
    starknet = await Starknet.empty()
    auth_contract = await starknet.deploy("contracts/authorization.cairo")
    allowed_account = await starknet.deploy_account()
    
    # 先将账户加入授权列表
    await auth_contract.add_authorized(allowed_account.address).invoke()
    
    # 用授权账户调用受限制函数(成功执行)
    await auth_contract.restricted_operation().invoke(sender=allowed_account.address)
    
    # 用未授权账户调用,预期触发错误
    blocked_account = await starknet.deploy_account()
    try:
        await auth_contract.restricted_operation().invoke(sender=blocked_account.address)
        assert False, "未捕获到未授权调用的错误"
    except Exception as e:
        assert "Unauthorized" in str(e)

内容的提问来源于stack exchange,提问作者DarkShark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:18:20