长安链合约操作 调用合约命令解析

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

./cmc client contract user invoke \
--contract-name=fact \
--method=save \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"file_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \
--sync-result=true

这个命令使用 ChainMaker 的客户端工具 cmc 调用已部署的智能合约 fact 的 save 方法,并传入参数。以下是详细解析:

命令功能

调用合约 fact 的 save 方法,保存文件信息(文件名、哈希、时间戳),并同步等待执行结果。

参数解析

参数 说明
./cmc client contract user invoke 使用 cmc 调用用户合约方法。
--contract-name=fact 指定目标合约名称为 fact(需已部署)。
--method=save 调用合约中的 save 方法(由合约开发者定义)。
--sdk-conf-path=./testdata/sdk_config.yml 指定 SDK 配置文件路径(包含节点连接信息)。
--params="{\"file_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" 传入 JSON 格式参数:
file_name: 文件名(name007
file_hash: 文件哈希值(ab3456df...
time: 时间戳(6543234
--sync-result=true 同步等待交易执行结果(阻塞直到链上确认)。

关键点说明

  1. 合约方法 save

    • 该方法是合约开发者预先定义的,功能可能是将文件信息存储到链上。

    • 需确保合约 fact 已部署,且包含 save 方法。

  2. 参数格式

    • 参数为 JSON 字符串,需严格转义(如 \")。

    • 参数名(如 file_name)必须与合约代码中的输入参数一致。

  3. 同步调用

    • --sync-result=true 会等待交易上链并返回结果,适合需要即时确认的场景。

    • 若设为 false,则异步调用(仅返回交易 ID)。

  4. 权限要求

    • 默认使用 sdk_config.yml 中配置的身份发起交易(需有合约写权限)。


示例合约代码(Rust 参考)

假设 fact 合约的 save 方法如下(WASM 合约):

#[chainmaker_contract::contract]
pub trait Fact {
    fn save(&self, file_name: String, file_hash: String, time: String) -> Result<(), ContractError> {
        // 存储逻辑(如写入链上状态)
        self.ctx.put_state("file_name", &file_name)?;
        self.ctx.put_state("file_hash", &file_hash)?;
        self.ctx.put_state("time", &time)?;
        Ok(())
    }
}

常见问题

  1. 参数错误

    • 若 JSON 格式错误(如缺少引号),会直接报错。

    • 若参数名或类型与合约不匹配,合约执行时会失败。

  2. 合约未部署

    • 错误信息类似:contract not found: fact。需先部署合约。

  3. 权限不足

    • 确保 sdk_config.yml 中的身份有权限调用该合约方法。


验证调用结果

  1. 直接输出
    命令执行成功后,会返回交易回执(包含交易哈希、区块高度等)。

  2. 查询链上数据
    可通过以下命令查询存储结果:

    ./cmc client contract user get \
    --contract-name=fact \
    --method=get_file \  # 假设合约有查询方法
    --sdk-conf-path=./testdata/sdk_config.yml \
    --params="{\"file_name\":\"name007\"}"

异步调用示例

如果不需要即时确认,可改为异步:

./cmc client contract user invoke \
--contract-name=fact \
--method=save \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"file_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \
--sync-result=false

此时返回的是 tx_id,可通过交易哈希后续查询状态。