在Hyperledger Fabric v1.0中,如何在提供多个通道的溯源跟踪的同时确保隐私保护?

10
在Hyperledger Fabric v0.6中,可以实现一个供应链应用程序,使追溯产品渊源成为可能,并且避免了双重花费(即销售超过自身库存)和伪造产品的风险。例如,当供应商向经销商提供500个商品时,这些数据将被储存在总账之中。经销商可以通过调用“转移”函数来分配一定数量的商品给特定的经销商。转移函数会执行以下操作:
  • 检查经销商是否有足够的商品数量供应给特定的经销商(即,如果要转移的商品数量小于或等于当前数量)
  • 更新总账(即,扣除经销商的当前数量并将其添加到经销商的当前数量中)
通过这种方法,经销商无法再分配超过其拥有量的商品(即,不能销售伪造/走私物品)。
此外,消费者可以通过查看总账来追溯产品渊源(例如,该产品从经销商1购买,而经销商1又从经销商2购买,最后从供应商处获得)。
然而,由于它使用单一总账,隐私是一个问题(例如,经销商2可以看到经销商1订购的商品数量等信息)。
为了解决隐私问题,在Hyperledger Fabric v1.0中提出了使用多个通道的解决方案。在这种方法中,供应商和经销商使用单独的通道/总账。同样,经销商和经销商1使用单独的通道/总账,经销商和经销商2使用另一个单独的通道/总账。
然而,由于经销商(即经销商1和经销商2)无法访问供应商和经销商的通道/总账,因此经销商不知道供应商向经销商提供的真实数量。例如,如果供应商仅向经销商提供了500个商品,则经销商可以向经销商声称已从供应商采购了1000件商品。这种方法将导致无法避免双重花费/伪造产品。
此外,如何实现产品渊源追溯?消费者将能够访问所有通道/总账吗?如果是这样,隐私问题又会浮现。
鉴于这一点,在Hyperledger Fabric v1.0中如何使用多个通道,同时实现产品渊源追溯和禁止双重花费呢?
3个回答

5
正如Artem所指出的,目前没有直接的方法来实现这一点。
Chaincodes可以跨通道读取,但是只能弱化,它们不能将此读取的内容作为提交的内容。同样,跨通道的交易没有顺序,这会带来其他的复杂性。
然而,只要两个频道中都有至少一个受信任的参与者,就应该可以安全地将资产转移到另一个频道。您可以将其视为监管者或审计员的角色。
为了实现这一点,应用程序本质上必须在fabric上实现互斥锁,以确保资源不会同时迁移到两个不同的频道。
考虑一个拥有资产Q控制权的A公司、B公司和监管机构R的场景,其中Q位于频道A-R中,并且B希望在频道A-B-R中安全地控制资产Q。
要安全地实现这一点,A可以执行以下操作:
1. A提议在A-R中对序列0上的Q进行锁定,并将其迁移到A-B-R频道。被接受并提交。
2. A提议在A-B-R频道上的序列0存在Q,并由R(执行跨通道读取以验证资产已锁定到A-B-R)认可。被接受并提交。
3. A建议在A-B-R频道上,将Q在序列0处转移到B。所有人都检查序列0上的Q记录是否存在,并将其包含在其读取集中,然后将其设置为其写入集中的序列1。
现在,绿色路径已完成。现在,假设B决定不购买Q,而A希望将其出售给C,在A-C-R中,则需要先完成(1)和(2)。
3. A提议从A-B-R频道中删除资产Q。R读取序列0处的Q,在序列1处写入它,并标记其不可用。
4. A建议在A-R中解锁资产Q。R在A-B-R中执行跨通道读取,并确认序列为1,认可A-R中的解锁。
5. A提议在A-C-R中存在Q的序列1,并按照(1)中的步骤继续进行。
攻击路径,再次假设(1),(2)已完成。
1. A建议在A-C-R中存在Q的序列0。R将读取A-R并发现它未锁定到A-C-R,因此不会认可。
2. A建议在A-B-R中的交易后,在A-R中删除资产Q的考虑。移动和解锁交易均在相同版本中读取该值,因此只有一个交易会成功。
这里的关键是,B信任监管机构以强制执行Q不能在A-R中解锁,直到Q已在A-B-R中释放。跨频道的无序读取是可以接受的,只要包括单调类型序列号以确保资产在正确的版本上被锁定即可。

3
目前在Hyperledger Fabric 1.0中还没有一种简单的方法来跨越两个不同通道提供溯源。有几个方向可以支持这样的场景:
  1. 第一个是具有在通道内保留数据部分并提供离散隔离能力的能力,该工作项在此处描述:FAB-1151
  2. 此外,还提出了添加对私有数据的支持的建议,同时保持证明所声称资产的存在和所有权的能力,该建议发布在邮件list中。
目前您可以利用应用程序端的加密来提供隐私,并将所有相关交易保留在同一通道上,例如同一分类账(与v0.6时的方法非常相似)。

0

v1.2开始,

Fabric提供了创建私有数据集合的能力,这允许通道上的一组定义好的组织有权在不必创建单独通道的情况下背书、提交或查询私有数据。

现在对于你的情况,你可以创建一个子集来将你的经销商数据私有化给特定实体,而无需创建单独的通道。更多信息请参考:Fabric Doc


如果将数据设为私有,它就变得不可验证。如果它是可验证的,那么它就不再是私有的。 - Grigory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接