长安链智能合约命令解析(全集)
创建命令解析
./cmc client contract user create \
--contract-name=fact \
--runtime-type=WASMER \
--byte-code-path=./testdata/claim-wasm-demo/rust-fact-2.0.0.wasm \
--version=1.0 \
--sdk-conf-path=./testdata/sdk_config.yml \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt \
--sync-result=true \
--params="{}"
这个命令是使用 ChainMaker 的客户端工具 cmc
来部署一个名为 fact
的智能合约。以下是各参数的详细解析:
命令功能
部署一个 WASM 格式的智能合约(fact
),并指定相关配置和权限。
参数解析
参数 | 说明 |
---|---|
./cmc client contract user create | 使用 cmc 工具创建用户合约。 |
--contract-name=fact | 设置合约名称为 fact 。 |
--runtime-type=WASMER | 合约运行环境为 WASMER(支持 WASM 字节码)。 |
--byte-code-path=./testdata/claim-wasm-demo/rust-fact-2.0.0.wasm | 指定 WASM 字节码文件路径(Rust 编译的智能合约)。 |
--version=1.0 | 合约版本号为 1.0 。 |
--sdk-conf-path=./testdata/sdk_config.yml | 指定 SDK 配置文件路径(包含节点连接信息)。 |
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key,... | 管理员私钥文件路径(需多个组织的管理员签名)。 |
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt,... | 管理员证书文件路径(与私钥对应,用于验证身份)。 |
--sync-result=true | 同步等待交易执行结果(阻塞直到合约部署完成)。 |
--params="{}" | 合约初始化参数(本例为空 JSON {} )。 |
关键点说明
-
多组织签名
-
需要 3 个组织(org1、org2、org3) 的管理员私钥和证书共同签名(ChainMaker 的共识策略要求)。
-
私钥(
.key
)和证书(.crt
)文件必须匹配。
-
-
WASM 合约
-
合约字节码为 Rust 编译的
rust-fact-2.0.0.wasm
,需提前准备好。 -
支持其他语言(如 C++),但需编译为 WASM 格式。
-
-
SDK 配置
-
sdk_config.yml
需配置正确的节点 RPC 地址和证书路径,例如:chain_client:org_id: "wx-org1.chainmaker.org"nodes:- host: "127.0.0.1"port: 12301
-
-
权限控制
-
只有指定的管理员(
admin1
)可以部署合约,确保安全性。
-
常见问题
-
权限不足
-
确保私钥和证书文件路径正确,且文件未被损坏。
-
检查
sdk_config.yml
中的org_id
是否与证书匹配。
-
-
WASM 加载失败
-
确认
rust-fact-2.0.0.wasm
文件存在且可读。 -
验证 WASM 字节码是否完整(可通过
wasm-validate
工具检查)。
-
-
./cmc client contract user create ... --verbose
交易超时
-
如果
--sync-result=true
时卡住,可能是网络问题或节点未启动。检查节点日志:tail -f ./log/system.log
-
等效的链上操作
此命令实际会向链上发送一笔 部署合约的交易,经过共识后,合约被写入区块链。成功后可通过以下命令查询合约:
./cmc client contract user get \
--contract-name=fact \
--sdk-conf-path=./testdata/sdk_config.yml
如果需要进一步调试,可以添加 --verbose
参数查看详细日志:
调用命令解析
./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
,可通过交易哈希后续查询状态。
查询命令解析
这个命令使用 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'