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

Mik*_*rds 8 node.js aws-sdk amazon-qldb

我一直在阅读文档,试图弄清楚如何在QLDB中提交事务,为了做到这一点,CommitDigest需要a,文档将其描述为:

指定要提交的事务的提交摘要。对于每个活动事务,必须传递提交摘要。如果客户端上计算的摘要与QLDB计算的摘要不匹配,则QLDB会验证CommitDigest并拒绝提交,并显示错误。

因此,必须计算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();
Run Code Online (Sandbox Code Playgroud)

我需要CommitDigestCommitTransactionapi调用中哈希什么?

Mar*_*arc 7

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

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

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

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