我们目前正在为我们的超级账本结构网络制定计划。我们真的需要知道以下问题的答案:“对区块链/世界状态的查询是否向区块链添加了另一笔交易”?
文档告诉我们以下内容(这是发生混乱的地方)。
那么仅更新会导致区块链上的新交易还是查询?
答案 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;