0

每当我尝试提交交易时。它给出了一个错误,即摘要应该是 32 个字节,我尝试提交摘要的二进制值,然后它给出了一个错误,即提交摘要与 qldb (Ledger) 摘要不匹配。

    public function insert()
{
    $client = AwsFacade::createClient('qldb-session');
    $clientA = AwsFacade::createClient('qldb');
    $result = $client->sendCommand([
        'StartSession' => [
            'LedgerName' => 'LawHq',
        ],
    ]);
    $sessiontoken = ((object)$result->get('StartSession'))->SessionToken;
    
    $result = $client->sendCommand([
        'StartTransaction' =>
        [],
        'SessionToken' => $sessiontoken
    ]);
    $transectiontoken = ((object)$result->get('StartTransaction'))->TransactionId;
    $result = $client->sendCommand([
        'ExecuteStatement' => [
            'Statement' => 'INSERT INTO Employee {`Name`:`wow`,`Designation`:`ok`, `Address`:`hmm`}',
            'TransactionId' => $transectiontoken,
        ],
        'SessionToken' => $sessiontoken
    ]);
    $result = $clientA->getDigest([
        'Name' => 'LawHq',
    ]);
    $digest = $result->get("Digest");
    $diges = base64_encode($result->get("Digest"));
    $result = $client->sendCommand([
        'CommitTransaction' => [
            'CommitDigest' => $digest,
            'TransactionId' => $transectiontoken
        ],

        'SessionToken' => $sessiontoken
    ]);
}
4

1 回答 1

0

您通过$clientA->getDigest(['Name' => 'LawHq']);的摘要是分类帐的摘要,不同于CommitDigest. 您可以在此处了解有关 Ledger 摘要的更多信息。

该机制以下列方式工作:对于每个事务(可以包含多个 PartiQL 语句),客户端必须计算 CommitDigest(使用下面提到的算法)。同时,QLDB 还在服务器端使用相同的算法计算 CommitDigest。当您决定提交事务时,您必须将 CommitDigest 传递给 QLDB(通过 CommitTransaction API)。如果您传递的 CommitDigest 与计算的 CommitDigest QLDB 相同,那么您的事务将被提交(假设没有其他错误),否则 QLDB 将拒绝您的事务。

CommitDigest 计算依赖于计算 IonHash 的能力。计算 IonHash 并不简单,通常由 IonHash 库完成。不幸的是,没有适用于 PHP 的 IonHash 库。如果您想自己实现一个,可以查看 IonHash 规范https://amzn.github.io/ion-hash/docs/spec.html作为计算 IonHash 的起点。一旦有了计算 IonHash 的方法,就可以实现计算 CommitDigest 的算法,类似于其他 QLDB 驱动程序所做的算法。

Marc 在回答类似问题时概述了 CommitDigest 和算法背后的动机,当时 QLDB 没有适用于 Node.js 的驱动程序:在 AWS QLDB 中提交事务时如何获取/计算 CommitDigest?.

我鼓励您阅读他的完整答案以获取更多上下文。从他的回答中引用一个相关的片段

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

请注意,当 Marc 写答案时,虽然没有适用于 QLDB 的 Node.js 驱动程序,但ion-hash-js库是可用的,而 PHP 不是这种情况。

或者,如果可能,我强烈建议使用现有驱动程序之一,因为它可以轻松与 QLDB 交互。驱动程序可用于PythonNodejsJava.NetGolang(预览版)

于 2020-10-02T00:43:06.963 回答