长安链合约操作 查询合约命令解析
这个命令使用 ChainMaker 的 cmc
客户端工具查询智能合约 fact
的 find_by_file_hash
方法,通过文件哈希值检索链上存储的数据。以下是详细解析:
命令功能
调用合约 fact
的 查询方法 find_by_file_hash
,根据文件哈希值 ab3456df5799b87c77e7f88
获取链上存储的对应文件信息。
参数解析
参数 | 说明 |
---|---|
./cmc client contract user get | 使用 cmc 查询合约状态(只读操作,不上链)。 |
--contract-name=fact | 指定目标合约名称为 fact (需已部署)。 |
--method=find_by_file_hash | 调用合约中的查询方法 find_by_file_hash 。 |
--sdk-conf-path=./testdata/sdk_config.yml | 指定 SDK 配置文件路径(包含节点连接信息)。 |
--params="{\"file_hash\":\"ab3456df5799b87c77e7f88\"}" | 传入 JSON 格式参数: - file_hash : 要查询的文件哈希值。 |
关键点说明
-
查询方法特性
-
find_by_file_hash
是合约开发者定义的只读方法,通常用于检索链上数据(不会修改状态)。 -
与
invoke
不同,get
操作无需共识,直接返回节点本地存储的结果。
-
-
参数要求
-
参数
file_hash
必须与合约代码中的输入参数名一致。 -
哈希值需完全匹配(区分大小写)。
-
-
返回结果
-
返回格式取决于合约实现,通常为 JSON 字符串,例如:
{"file_name": "name007","time": "6543234","owner": "org1" }
-
-
权限要求
-
查询操作一般不需要管理员权限,但需确保
sdk_config.yml
中的身份有合约读权限。
-
示例合约代码(Rust 参考)
假设 fact
合约的 find_by_file_hash
方法如下:
#[chainmaker_contract::contract] pub trait Fact {fn find_by_file_hash(&self, file_hash: String) -> Result<String, ContractError> {// 从链上状态读取数据let file_name: String = self.ctx.get_state("file_name", &file_hash)?;let time: String = self.ctx.get_state("time", &file_hash)?;// 返回 JSON 格式结果Ok(format!(r#"{{"file_name":"{}","time":"{}"}}"#,file_name, time))} }
常见问题
-
合约方法未定义
-
若报错
method not found: find_by_file_hash
,需检查合约是否部署了该方法。
-
-
参数格式错误
-
确保 JSON 中的引号转义正确(如
\"
)。
-
-
无查询结果
-
若返回空,可能是文件哈希不存在或未调用过
save
方法存储数据。
-
扩展用法
-
查询其他字段
如果合约支持,可通过不同参数查询:--params="{\"file_name\":\"name007\"}"
-
批量查询
需合约提供批量查询方法(如find_all
),并调整参数格式。 -
结合 SDK 使用
在 Go/Python 应用中集成 SDK,以编程方式调用查询接口。
输出示例
成功执行后,终端可能返回如下结果:
{"code": 0,"message": "success","contract_result": {"result": "{\"file_name\":\"name007\",\"time\":\"6543234\"}"} }
如果需要进一步处理返回数据,可以使用 jq
工具解析 JSON:
./cmc client contract user get ... | jq -r '.contract_result.result'