Corda节点附件能否防双花跨节点传输?能否作为可拥有状态转移?
关于Corda附件传输的两个问题解答
1. 附件能否在不发生双花的情况下传输至其他Corda节点?
先明确一个核心认知:Corda的附件本质是不可变的二进制静态数据,「双花」这个概念根本不适用于它——双花是针对可消耗、有明确所有权的资产类状态(比如现金、数字证券这类Ownable State),而附件只是附着在交易上的“附加文件”(比如合同模板、凭证扫描件),不存在“被重复花费”的场景。
如果只是要把附件从A节点传到B节点,直接通过交易附带的方式就能实现:
- 发起交易时,把附件加入交易的
attachments列表 - 交易完成后,所有参与该交易的节点都会同步存储这份附件的副本
- 因为附件是通过哈希引用的,所有节点存的都是同一个哈希对应的内容,完全不会有双花的风险——毕竟它不是可消耗的资产,只是一份静态文件的副本而已。
唯一需要注意的是:Corda不会主动把附件同步给非交易参与方,只有参与了包含该附件的交易的节点,才能获取到附件内容。
2. 能否将已添加的附件作为可拥有状态(Ownable State)安全传输,实现一经发送便无法再次发送?
附件本身没法直接变成Ownable State,但你可以用Ownable State来封装附件的所有权控制权,间接实现这个需求,具体思路如下:
定义自定义所有权状态:
写一个AttachmentOwnershipState,这是一个标准的Ownable State,里面包含两个关键字段:attachmentHash: 存储目标附件的SHA-256哈希值(用来关联对应的附件内容)owner: 当前持有该附件“唯一控制权”的Party
通过交易转移所有权:
当你要把附件的控制权转给其他节点时,发起一笔交易:- 输入原有的
AttachmentOwnershipState(必须由当前所有者签字授权) - 输出新的
AttachmentOwnershipState,把owner字段改成接收方 - 如果接收方还没有这份附件,记得把附件加入交易的
attachments列表,让对方同步获取
- 输入原有的
合约约束保障唯一性:
在状态对应的合约代码里加两个关键约束:- 禁止同一个
attachmentHash对应的AttachmentOwnershipState存在多个有效实例(避免重复确权) - 只有当前
owner才能发起转移交易,防止未授权的操作
- 禁止同一个
这样一来,虽然附件本身还是可以被复制,但代表其唯一控制权的状态是受Corda交易机制严格保护的:原所有者的旧状态会被交易消耗,再也没法用它发起第二次转移,完美实现了你要的“一经发送便无法再次发送”的效果。
内容的提问来源于stack exchange,提问作者geekybot
相关产品推荐
相关产品推荐

