如何查询Corda State在账本中占用的存储空间大小
Corda State 存储容量获取方案
- 方法1:通过Corda序列化框架直接计算(适配开发阶段快速估算)
Corda底层存储State时采用内置AMQP序列化协议,使用和存储场景一致的序列化上下文处理State实例,得到的字节长度就是实际落盘的近似大小,误差可忽略。
代码示例(Kotlin):
import net.corda.core.contracts.ContractState import net.corda.core.serialization.SerializationDefaults import net.corda.core.serialization.serialize fun calculateStateSize(state: ContractState): Int { // 使用存储场景专属序列化上下文,和账本落盘规则完全对齐 val serializedResult = state.serialize(SerializationDefaults.STORAGE_CONTEXT) return serializedResult.size }
如果用Java开发,调用对应序列化API的逻辑一致。
- 方法2:节点数据库直接查询(获取精确实际占用值)
Corda节点所有未消费/已消费State都存储在VAULT_STATES表中,可直接执行SQL查询得到单条State的精确存储大小:
SELECT OCTET_LENGTH(TRANSACTION_ID) + OCTET_LENGTH(OUTPUT_INDEX) + OCTET_LENGTH(CONTRACT_STATE) AS state_total_size FROM VAULT_STATES WHERE STATE_STATUS = 0 -- 0代表未消费,1代表已消费,可按需调整 AND TRANSACTION_ID = '目标交易哈希' AND OUTPUT_INDEX = 目标输出序号;
如果需要统计某一类自定义State的总存储占用,可增加过滤条件CONTRACT_STATE_CLASS_NAME = '你的State类全限定名',对state_total_size做求和运算即可。
注意事项:
- 以上计算的是单份State副本在单个节点的存储大小,如果节点配置了账本多副本备份、多节点共同存储同一份State,总占用需要乘以对应倍数。
- State大小不包含关联附件的存储占用,附件大小需单独查询
NODE_ATTACHMENTS表统计。- 数据库层面统计的大小已经包含表字段、索引的额外开销,比序列化计算的数值略高,属于正常情况。
内容的提问来源于stack exchange,提问作者user10488162
相关产品推荐
相关产品推荐

