gpt4 book ai didi

node.js - 在 AWS QLDB 中提交事务时如何获取/计算 CommitDigest?

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:16 24 4
gpt4 key购买 nike

我一直在阅读文档,试图找出如何在 QLDB 中提交事务,为此,需要一个 CommitDigest,文档将其描述为:

Specifies the commit digest for the transaction to commit. For every active transaction, the commit digest must be passed. QLDB validates CommitDigest and rejects the commit with an error if the digest computed on the client does not match the digest computed by QLDB.

所以必须计算 CommitDigest,但我不太确定在这个例子中它的计算需要什么:

// ** Start Session **
const startSessionResult = await qldbSession.sendCommand({
StartSession: {
LedgerName: ledgerName
}
}).promise(),
sessionToken = startSessionResult.StartSession!.SessionToken!;

// ** Start Transaction **
const startTransactionResult = await qldbSession.sendCommand({
StartTransaction: {},
SessionToken: sessionToken
}).promise(),
transactionId = startTransactionResult.StartTransaction!.TransactionId!;

// ** Insert Document **
const executeStatementResult = await qldbSession.sendCommand({
ExecuteStatement: {
TransactionId: transactionId,
Statement: `INSERT INTO sometable { 'id': 'abc123', 'userId': '123abc' }`
},
SessionToken: sessionToken
}).promise(),
documentId = getDocumentIdFromExecuteStateResult(executeStatementResult)

// ** Get Ledger Digest
const getDigestResult = await qldb.getDigest({
Name: ledgerName
}).promise(),
ledgerDigest = getDigestResult.Digest;


// ** Commit Transaction **
// ** **The API call in question** **
const commitTransactionResult = await qldbSession.sendCommand({
CommitTransaction: {
TransactionId: transactionId,
CommitDigest: `${commitDigest}` // <-- How to compute?
},
SessionToken: sessionToken
}).promise();
// *******************************


// ** End Session **
const endSession = await qldbSession.sendCommand({
EndSession: {},
SessionToken: sessionToken
}).promise();

CommitTransaction api 调用中,我需要为 CommitDigest 哈希什么?

最佳答案

更新:Node.js 驱动程序现已可用。看看https://github.com/awslabs/amazon-qldb-driver-nodejs/ .

在撰写本文时,QLDB Node.js 驱动程序仍在开发中。如果您尝试自己创建一个,那将是相当困难的,所以我会提醒您不要这样做。也就是说,我可以解释 CommitDigest 背后的目的和算法。

目的相当简单:确保事务仅在服务器处理了客户端发送的确切语句集时才提交(全部按顺序进行,没有重复)。 HTTP 是请求-响应,因此请求可能会被丢弃、乱序处理或重复。 QLDB 驱动程序正确地管理与 QLDB 的通信,但是在协议(protocol)中包含提交摘要使得实现不可能错误地重试请求并仍然提交事务。例如,考虑将银行余额增加两次,因为即使第一次请求成功也会重试 HTTP 消息。

该算法也非常简单:散列值以交易 ID 为种子,然后使用 QLDB“点”运算符进行更新。语句哈希(PartiQL 字符串的 sha256)以及 IonHash 中的每个更新“点”所有的绑定(bind)值。点运算符是 QLDB 合并散列值的方式(这与 verification APIs 中使用的运算符相同)并定义为两个散列的串联散列,按(有符号,小端)字节排序两个哈希之间的比较。客户端和服务器以锁步方式运行此算法,并且只有在客户端传递的值与服务器计算的值匹配时,服务器才会处理提交命令。这样,服务器将永远不会提交与客户端请求不完全相同的事务。

关于node.js - 在 AWS QLDB 中提交事务时如何获取/计算 CommitDigest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com