Hyperledger Fabric-在区块链上查询新交易

时间:2019-12-12 14:42:48

标签: hyperledger-fabric

我们目前正在为我们的超级账本结构网络制定计划。我们真的需要知道以下问题的答案:“对区块链/世界状态的查询是否向区块链添加了另一笔交易”?

文档告诉我们以下内容(这是发生混乱的地方)。

  • “应用程序提交捕获世界变化的事务 状态,这些交易最终将被提交到分类帐 区块链。”
  • “区块链被构造为互连的顺序日志 区块,其中每个区块包含一系列交易,每个 代表查询或更新到世界状态的交易。”

那么仅更新会导致区块链上的新交易还是查询?

2 个答案:

答案 0 :(得分:1)

答案是,您不会在块中插入另一个事务,但是会生成一个事务来进行查询。

让我更好地解释一下:

当应用程序想要将数据插入到区块链中时,它会生成交易。 该应用程序将联系背书的对等方提出交易建议,检查结果,并且只有当它们相等且正确时,交易才会被发送到订购服务。 订购服务是唯一允许为区块链生成新区块的服务。 订购服务接收这些交易并将其插入到区块中,然后将区块发送给各个对等点,以更新其本地分类帐副本。

相反,当您要进行查询时,会生成一个事务以与一个或多个对等方进行通信,对等方将向您发送答案,但事务在此处结束。 到最后,我的意思是交易不会发送给订购者,在您进行查询时任何时候都不会联系他。 这是因为您查询对等方中包含的分类帐(这是分类帐的本地副本),并且不会生成新的块。

因此,事务用于与对等方进行通信,但在这种情况下不发送给订购者,它不写在块内,也不用于该事务。 在区块内部,您只会找到提案之后应用程序批准的交易,然后由订购服务进行验证,并且可以修改世界状态。

答案 1 :(得分:-1)

这取决于你的行为。 Fabirc 1.4 SDK(java)中有两个功能。如果您不希望将查询事务提交到分类帐,则可以使用validateTransaction功能。

    /**
     * Evaluate a transaction function and return its results.
     * The transaction function {@code name}
     * will be evaluated on the endorsing peers but the responses will not be sent to
     * the ordering service and hence will not be committed to the ledger.
     * This is used for querying the world state.
     * This function is equivalent to calling {@code createTransaction(name).evaluate()}.
     *
     * @param name Transaction function name.
     * @param args Transaction function arguments.
     * @return Payload response from the transaction function.
     * @throws ContractException if no peers are reachable or an error response is returned.
     */
    byte[] evaluateTransaction(String name, String... args) throws ContractException;

    /**
     * Submit a transaction to the ledger. The transaction function {@code name}
     * will be evaluated on the endorsing peers and then submitted to the ordering service
     * for committing to the ledger.
     * This function is equivalent to calling {@code createTransaction(name).submit()}.
     *
     * @param name Transaction function name.
     * @param args Transaction function arguments.
     * @return Payload response from the transaction function.
     * @throws ContractException if the transaction is rejected.
     * @throws TimeoutException If the transaction was successfully submitted to the orderer but
     * timed out before a commit event was received from peers.
     * @throws InterruptedException if the current thread is interrupted while waiting.
     * @throws GatewayRuntimeException if an underlying infrastructure failure occurs.
     *
     * @see <a href="https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/application.html#submit-transaction">Developing Fabric Applications - Submit transaction</a>
     */
    byte[] submitTransaction(String name, String... args) throws ContractException, TimeoutException, InterruptedException;