./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 |
同步等待交易执行结果(阻塞直到链上确认)。 |
关键点说明
合约方法
save
该方法是合约开发者预先定义的,功能可能是将文件信息存储到链上。
需确保合约
fact
已部署,且包含save
方法。
参数格式
参数为 JSON 字符串,需严格转义(如
\"
)。参数名(如
file_name
)必须与合约代码中的输入参数一致。
同步调用
--sync-result=true
会等待交易上链并返回结果,适合需要即时确认的场景。若设为
false
,则异步调用(仅返回交易 ID)。
权限要求
默认使用
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(()) } }
常见问题
参数错误
若 JSON 格式错误(如缺少引号),会直接报错。
若参数名或类型与合约不匹配,合约执行时会失败。
合约未部署
错误信息类似:
contract not found: fact
。需先部署合约。
权限不足
确保
sdk_config.yml
中的身份有权限调用该合约方法。
验证调用结果
直接输出
命令执行成功后,会返回交易回执(包含交易哈希、区块高度等)。查询链上数据
可通过以下命令查询存储结果:./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
,可通过交易哈希后续查询状态。