我一直在阅读文档,试图弄清楚如何在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();

CommitDigest api调用中,我需要为CommitTransaction散列什么?

最佳答案

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

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

目的是很直接的:确保仅在服务器处理完客户端发送的确切语句集后,才提交事务(所有顺序,无重复)。 HTTP是请求-响应,因此可能会丢弃请求,无序处理或重复请求。 QLDB驱动程序可以正确管理与QLDB的通信,但是协议(protocol)中包含提交摘要,因此实现不可能错误地重试请求并仍然提交事务。例如,考虑两次增加银行存款余额,因为即使第一个请求成功,也会重试HTTP消息。

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

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

10-09 20:14