亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

插入 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 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號