【问题标题】:Digest doesn't match when inserting to QLDB插入 QLDB 时摘要不匹配
【发布时间】:2020-08-30 11:54:17
【问题描述】:

我正在尝试使用 Go 中的 AWS 开发工具包将记录插入 QLDB 分类帐。我以 Python QLDB 驱动程序为例,并记录了那里产生的最终事务哈希。这在事务提交期间用于与 QLDB 端生成的哈希进行比较,以验证事务并允许它提交,python 驱动程序成功地做到了这一点。

不过,目前还没有 Go 版本的 IonHash,所以我在 Go 中实现了 StartTransaction、InsertInto 和 CommitTransaction 步骤,并包含一个 Python 可执行 IonHash 实现来计算用于比较摘要的 IonHash结尾。

// Go (pseudocode)
import "github.com/fernomac/ion-go" as ion
import python_hash_module as python

func (client qldbClient) StartTransaction(transactionID string) {
 // hash transactionID using python ionhash
}

func (client) InsertInto (statement string, params string) {
    // MarshalText using ion module in aws-sdk
    ionParam := ion.MarshalText(params)

    // hash statement using python executable
    client.statementHash = python.ion_hash(statement)

    // hash parameters using python executable (only one parameter)
    client.paramHash = python.ion_hash(ionParam)

    // dot paramHash with statement hash
    client.statementHash = client.statementHash.dot(client.paramHash)

    // dot statement hash with transactionhash - this transaction hash matches the python calculation!
    client.transactionHash = client.transactionHash.dot(statementHash)
}

func (client) Commit() {
    res, err := client.execute(statement) // compares calculated transaction hash with AWS calculated transaction hash
    if err != nil {
        log.Prinln(err)
}

代码在提交步骤中失败并出现以下错误:

{
  Code_: "412",
  Message_: "Digests don't match"
}
2020/03/22 11:16:41 xxxx.go:xxx: BadRequestException: Digests don't match
{
  Code_: "412",
  Message_: "Digests don't match"
}

我不明白为什么在提交期间摘要不匹配,当此实现生成与确实提交的 python 代码相同的摘要时。为什么 python 代码在生成与 go 代码相同的提交时不会抱怨摘要不匹配?更重要的是,如何通过 Go(不是 python 或节点驱动程序?)成功插入到 QLDB?

【问题讨论】:

    标签: python amazon-web-services go hash amazon-qldb


    【解决方案1】:

    不确定这是否仍然有用,但亚马逊最近发布了 QLDB Go 驱动程序的预览版 (https://github.com/awslabs/amazon-qldb-driver-go)。

    它具有 Ion 和 Ion Hash 作为其依赖项,因此这应该会让您在使用 QLDB 时更轻松。

    【讨论】:

      【解决方案2】:

      ion-hash-go 不可用的理解是正确的。

      在计算哈希时可能需要检查的几件事:

      1. 哈希值以交易 ID 的离子哈希为种子。所以 从技术上讲,两个交易的最终哈希值永远不会相同。
      2. 如您所见,哈希值是使用 QLDB 的“点”运算符更新的。 点运算符是 QLDB 合并哈希值的方式,并被定义 作为两个散列连接的散列,由 (signed, little-endian) 两个散列之间的逐字节比较。 参考 - https://github.com/awslabs/amazon-qldb-driver-python/blob/39fecdf2ed0521ae1d19f342a4cab38846b96c9a/pyqldb/util/qldb_hash.py#L99
      3. 哈希算法需要是 SHA 256。
      4. 在使用参数对查询进行散列时,正确的实现是采用 离子哈希 任何语句(可能包含其中的任何 PartiQL 文字) 然后是作为参数传入的每个 IonValue 的 IonHash (结合点运算符)。

      从你的伪代码中我可以猜到你可能缺少 1) 和 2)。更具体地说,我的意思是说伪表明哈希没有使用事务 id 播种,并且点运算符没有按正确的顺序应用于哈希。

      有关 QLDB 哈希计算的更多详细信息,请参阅 Marc 的回答 - How to get/compute CommitDigest when committing a transaction in AWS QLDB?

      愿意进一步帮助。

      更新:

      Ion hash go 现已推出 - https://github.com/amzn/ion-hash-go

      还发布了与QLDB交互的驱动程序-https://github.com/awslabs/amazon-qldb-driver-go

      它们目前都是测试版。

      【讨论】:

      • > 哈希值以交易 id 的离子哈希为种子。因此,从技术上讲,两个交易的最终哈希值永远不会相同。没错,但我确实通过硬编码事务 ID 来控制运行,因此它们在计算过程中是相同的 :) > 没有按正确的顺序应用于哈希。我认为情况可能是这样。谢谢你的链接!我会用结果更新这条评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2018-04-20
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多