如何在Hyperledger Composer中删除资产特定字段及AssetRegistry中资产字段数据
嘿,我来帮你搞定这两个Hyperledger Composer的问题,都是实际开发中常碰到的点,分情况给你讲清楚:
1. 如何删除资产(Asset)定义中的特定字段?
如果是想从资产的模型定义里彻底移除某个字段(也就是以后所有新创建的资产都不会有这个字段),得这么操作:
- 首先找到你的业务网络CTO模型文件,定位到目标资产类型,直接删掉你要移除的字段。举个例子,原来的资产定义是:
asset SampleAsset identified by assetId { o String assetId o String assetName o Integer assetValue // 这是要删除的字段 }
修改后就去掉o Integer assetValue这一行就行。
- 接下来重新打包业务网络:执行命令
composer archive create -t dir -n .生成新的BNA文件。 - 最后更新运行中的业务网络:用
composer network update -a your-network.bna -c admin@your-network把新的模型部署上去。
注意:这个操作只影响之后新建的资产,已经存在的存量资产里的旧字段数据不会自动消失,得结合下面的方法处理存量数据。
2. 如何在资产注册表(AssetRegistry)中删除某一资产的特定字段数据?
Hyperledger Composer里没有直接删除单个字段的API,而是通过更新资产实例的方式来移除字段值,具体步骤要看字段是否是必填项:
- 第一步,先获取对应的资产注册表和目标资产:
// 获取资产注册表 const assetRegistry = await getAssetRegistry('org.example.SampleAsset'); // 根据资产ID获取目标资产 const targetAsset = await assetRegistry.get('ASSET-001');
- 如果字段是可选的(模型里没有加
required约束):直接删除该字段属性或者设为undefined,然后更新资产:
// 方式1:删除字段属性 delete targetAsset.assetValue; // 方式2:设为undefined targetAsset.assetValue = undefined; // 更新资产注册表 await assetRegistry.update(targetAsset);
- 如果字段是必填的:那你得先按照第一个问题的方法,修改模型把该字段改成可选(去掉
required),更新业务网络后,再执行上面的更新操作,否则直接删除会触发校验报错。
内容的提问来源于stack exchange,提问作者Lakshmi Narayana Galla
相关产品推荐
相关产品推荐

