Corda技术关于交易数据的描述
- 我对交易数据写入Corda数据库中的理解
对于存入Corda数据库中的交易数据,后续可以对此交易数据进行“修改”,这里的修改不是真正意义上的修改,而是把原来的数据在数据库中进行标记。在区块链技术中,我们称之为消费,然后再把新数据create到数据库中。这样就会形成这条数据的历史记录,不过只有当前的记录是未消费的,被标记了的则是消费了的,被标记只是一个字段的状态值,在Corda中表vault_status中state_status字段1.
- 这里展示一个例子来说明
描述 | id | name | age | company | hobby |
---|---|---|---|---|---|
第一次走Corda数据库 | 123456 | Karan | 22 | English | |
第二次走Corda数据库 | 123456 | Ted | 22 | S-labs | IT |
第三次走Corda数据库 | 123456 | Sara | 21 | Ali | IT |
第四次走Corda数据库 | 123456 | Sanding | 26 | S-labs | Java |
注意:这上链的三条数据的唯一标识id都是123456
在Corda节点中的数据库中的状态就是,Karan和Ted和Sara这三条数据是被标记为消费了的,而Sanding这条数据是有效的。
- 需求:要追溯 id = 123456 的数据
需求理解:因为Corda的查询机制是,默认查询出来的记录是有效的,就是未被消费的数据。
- 在追溯此数据的过程中,问题记录
常规写法
Vault.StateStatus.ALL代表查询出被消费了和未被消费的。然后拼接一个唯一标识Id条件。
注意:上图中是用QueryCriteria.VaultQueryCriteria
结果
利用上面Corda数据库中的四条数据来描述,查询出来的还是未被消费的,根本就没有达到追溯的结果,查询出来是第四条,是不是很不能理解?
执行过程中内存快照
经过多次实验,内存快照图说明如下几点:
1. var criteria: QueryCriteria = QueryCriteria.VaultQueryCriteria(Vault.StateStatus.UNCONSUMED)
默认就是UNCONSUMED可以不用写。
2. 如果写上criteria.and{ }来进行拼接,如果不加入条件的话,Corda对于拼接的每一个条件默认都添加了一个未被消费的状态。
3.如上图所示,一个条件我设置为消费了的,拼接的第二条件,默认给的未被消费的,查询出来是未被消费的(也就是例子中的第三条)。
4.当你拼接多个条件时,Corda中的criteria的格式永远是,a , b两个。假如这个criteria拼接了三个条件,那么a下面有两个,a 和 b;而b下面是最后一个拼接条件。
猜测并实验
-
既然每个拼接的条件的status的默认值是UNCONSUMED,而第一个条件我的写法是
var criteria: QueryCriteria = QueryCriteria.VaultQueryCriteria(Vault.StateStatus.CONSUMED)
而第二个拼接条件默认是UNCONSUMED,且无法修改。查询出来的结果就是UNCONSUMED,也就是第二覆盖了第一个。那我就交换位置,先拼接id这个条件,反正Corda会给个默认的status值,我最后一个条件设置为已经被消费的,就可以了。实验结果就是,查询出被消费的所有记录。 -
那我可以criteria.or() 我第一个条件是消费了的,第二条件我用or()方法去拼接,因为第二个条件默认值是未被消费的。 实验结果就是,只能查询出未被消费的记录。
-
既然最后的条件是覆盖前面的,那最后的条件拼接如下:
var criteria: QueryCriteria = QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL)
这样查询出来是根据前面拼接的条件决定的,比如是消费了,则查询出来是消费了的。他们取交集。
解决问题的写法
如上图中的写法就可以实现查询到未被消费了的和消费了的,根据唯一标识id。
结论
- Corda中的查询所有的条件都是UNCONSUMED.
- 无论多少个条件,Corda的查询的格式都是a 和 b , 如果大于2个,在a下面有a , b, c …
- 最后一个条件可以覆盖前面的条件,但是当最后的一个条件是ALL的时候,却无法覆盖前面的条件。
- 无论是拼接and 还是or 采用 QueryCriteria. VaultQueryCriteria的方式都无法完成追溯的需求。
- 如果就是要QueryCriteria. VaultQueryCriteria来完成追溯需求呢?
利用程序分步骤查询,然后拼接结果,响应给前台。
但是,像这样的数据,一般前端是分页展示,第一页有未被消费的记录,而第二页以后都没有,完成功能需要,肯定是可以的,但是特麻烦。
小结
- 首先,我谈了下我对Corda数据库中的交易数据的一个理解。
- 其次,使用表格的方式,构建了一个非常简单的例子。然后记录探索过程的心路历程。
- 最后,我通过猜测并实验,获得了一个追溯此数据的正确写法。最后得出关于Corda技术的总结知识。