为了账号安全,请及时绑定邮箱和手机立即绑定

插入 QLDB 时摘要不匹配

插入 QLDB 时摘要不匹配

Go
慕森王 2022-05-23 16:17:05
我正在尝试使用 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 ionimport python_hash_module as pythonfunc (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 成功插入 QLDB(不是 python 或节点驱动程序?)
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2022-05-23
?
当年话下

TA贡献1890条经验 获得超9个赞

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

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

  1. 哈希值以交易 id 的离子哈希为种子。因此,从技术上讲,两个交易的最终哈希值永远不会相同。

  2. 正如您所注意到的,哈希值是使用 QLDB 的“点”运算符更新的。点运算符是 QLDB 合并散列值的方式,它被定义为两个散列连接的散列,按两个散列之间的(有符号,小端)字节比较排序。参考 - https://github.com/awslabs/amazon-qldb-driver-python/blob/39fecdf2ed0521ae1d19f342a4cab38846b96c9a/pyqldb/util/qldb_hash.py#L99

  3. 哈希算法需要是 SHA 256。

  4. 在使用参数进行散列查询时,正确的实现是获取任何语句的 ion 散列(可能包含其中的任何 PartiQL 文字),然后将每个 IonValue 的 IonHash 作为参数传入(结合点运算符)。

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

有关 QLDB 哈希计算的更多详细信息,请参阅 Marc 的回答 -如何在 AWS QLDB 中提交事务时获取/计算 CommitDigest?

愿意进一步帮助。

更新:

Ion hash go 现在可用 - https://github.com/amzn/ion-hash-go

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

他们俩目前都是测试版。


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号