2016-11-04 48 views
2

是否有可能通过chaincode进行外部服务调用?例如,如果我需要使用公共API查找当前汇率或当前温度,那么我怎样才能通过链接代码来进行调用?Hyperledger chaincode外部服务调用

如果允许外部调用,那么每个节点都有可能提供不同的输出(非确定性行为)。那么如何达成共识呢?

+0

你是指这样的事情https://github.com/hyperledger-archives/fabric/pull/1388 –

+0

非确定性行为测试类型的答案我的第二个问题。但第一个问题仍然存在:我们如何从超级链接代码调用外部Web服务或API?是否允许与外部系统进行整合,因为在以太坊这是不可能的。 –

+0

这是可能的 - 我相信它在Hyperledger演示文稿中 - 但您有一个限制,即任何对等方都必须能够调用相同的端点,并且必须返回相同的响应。否则,就像你说的那样,你会面临每个个体不确定行为的风险。 –

回答

1

来自不同来源的两次资产更新始终有机会以不同顺序击中两位代言人。这将创建不匹配的读/写集。如果代言政策要求所有代言人都达到相同的发行套餐,这可能会导致双方失败。由于任何数量的瞬间问题而增加可能改变或可能失败的外部数据的读取正在加剧这个问题。

但无论签注策略是否生效,这些更改都将被正确处理,因为只有认可的r/w集合才会被提交。

现在,如果您决定写入链码的外部数据库,则所有投注都将关闭。由于同一块中的关键冲突导致最后一分钟的故障(结构v1要求针对相同密钥的更新不会一起处理,因此必须进行流量控制)将导致事务永远不会被提交。

当发生这种情况时,应该回滚外部写入,但链代码长时间执行,因此总数据集现在已损坏。这不是首发。但是,如果有人决定诱惑命运并建立一个链代码更新外部数据的详细系统,则只要事务ID是更新日记帐条目的一部分,就可以检测到故障并且更新回滚 。这个解决方案是无法形容的脆弱,如果你尝试它,那么你可能会对不起:-)

-1
  1. 是的。我们可以进行外部API调用。为了方便起见,我更喜欢node sdk而不是lang for chaincode
  2. 通常,链代码是在一个对等体上执行的,外部api调用也是如此。一旦得到结果,交易将在网络中广播。其他同伴通过散列链验证事务。所以API调用不会在所有验证对等体上执行。
+0

声明API调用非常危险,但没有说明它们为什么如此危险以及在实践中很可能失败。 – Kim

0

这是可能的,并没有打破面料。结构不必是确定性的,因为RW集检查所有代言人,但它没有被重播,只有当交易提案被提交时,它才检查READ副本集是否相同。

在接收器背书者上,READ副本是检查,如果本地和建议具有相同版本,则交易有效。

在Solidity的smartcontracts上重放交易,这就是为什么它必须是确定性的。

相关问题