Hyperledger链代码外部服务调用

时间:2016-11-04 10:25:18

标签: go hyperledger

是否可以通过链码进行外部服务调用?例如,如果我需要使用公共API查询当前汇率或今天的温度,我该如何从链码中进行调用?

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

4 个答案:

答案 0 :(得分:3)

总有机会从不同来源进行两次资产更新,以不同的顺序击中两名代言人。这将创建不匹配的读/写集。如果认可政策要求所有代言人实现相同的r / w设置,这可能导致两者都失败。添加可能因任何数量的瞬间问题而发生变化或可能失败的外部数据读取会加剧这一问题。

但无论哪种认可政策生效,都会正确处理这些变更,因为只有认可的r / w集才会被提交。

现在,如果您决定从链码中到外部数据库,那么所有赌注都将被取消。由于同一块中的密钥冲突导致最后一分钟失败(结构v1要求针对相同密钥的更新永远不会一起处理,因此必须进行流控制)将导致事务永远不会被提交。

当发生这种情况时,应该回滚外部写入,但是链码长时间执行,因此总数据集现在已经损坏。这是一个非首发。

但是,如果有人决定诱惑命运并建立一个精心设计的系统,其中链码更新外部数据,只要事务ID是更新的日记帐分录的一部分,就可以检测到故障并且更新回滚 即可。这个解决方案难以言表的脆弱,如果你尝试它,那么你很可能会抱歉: - )

答案 1 :(得分:0)

有可能并且不会破坏Fabric。 Fabric不一定是确定性的,因为RW集合检查所有代言人,但它没有被重放,只有在交易提议被提交时才检查READ副本集是否相同。

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

On Solidity的smartcontracts交易被重播,这就是为什么它必须是确定性的。

答案 2 :(得分:0)

我认为调用外部API方法并不完全是邪恶的。这是验证背书的对等点的完美方法,这些对等点实际上是从外部源检索到的数据。即从可信赖的全球来源获取今天的$ /€汇率。如果所有背书的同行从同一来源获得相同的结果,各方就不能说:“嘿,你编造了货币,你就腐败了。”

根据此Hyperledger-Composer Documentation,本节讨论:如果可能进行外部API调用,如何以及何时使用它,何时避免使用它,利弊等等。答案:

HTTP请求可能由于多种原因而导致不同的响应:

  • 不同组织中的对等节点可能在不同数据中运行 中心,在不同的国家,在不同的时区。
  • 不同组织中的对等节点可能无法访问HTTP服务器 取决于公共互联网访问和防火墙限制。
  • 不同组织中的对等节点可以向HTTP服务器进行身份验证 作为不同的用户,导致不同的HTTP响应。

为了最小化发出HTTP请求时共识失败的风险 从事务处理器功能,建议您使用make HTTP请求是:

  • 安全,因为HTTP请求不会修改HTTP上的任何状态 服务器。
  • 幂等,因为相同的HTTP请求可以被设为 时间没有不同的结果。

答案 3 :(得分:-1)

  1. 是。我们可以进行外部API调用。为了方便起见,我更喜欢节点sdk而不是go lang for chaincode
  2. 通常,链路代码在其中一个对等端上执行,外部api呼叫也是如此。一旦导出结果,就在网络中广播该事务。其他对等体通过哈希链验证事务。因此,API调用不会在所有验证对等体上执行。