Дайджест не совпадает при вставке в QLDB

Я пытаюсь вставить запись в книгу QLDB, используя AWS SDK в Go. В качестве примера я использовал драйвер Python QLDB и записал полученный там окончательный хэш транзакции. Это используется во время фиксации транзакции для сравнения с хэшем, созданным на стороне QLDB, чтобы проверить транзакцию и разрешить ее фиксацию, что успешно делает драйвер python.

Однако пока нет версии IonHash для Go, поэтому я реализовал шаги StartTransaction, InsertInto и CommitTransaction в Go и включил исполняемую реализацию IonHash на Python для вычисления 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? Что еще более важно, как я могу успешно вставить в QLDB через Go (не python или драйверы узла?)


person Carlo Mannino    schedule 22.03.2020    source источник


Ответы (2)


Не уверен, что это все еще полезно, но Amazon недавно выпустил предварительную версию драйвера QLDB Go Driver (https://github.com/awslabs/amazon-qldb-driver-go).

В качестве зависимостей он имеет Ion и Ion Hash, так что это должно значительно упростить вам работу с QLDB.

person Matthew Hsu    schedule 26.08.2020

Понимание того, что ion-hash-go недоступен, правильное.

Несколько вещей, которые вы, возможно, захотите проверить при вычислении хэша:

  1. Хэш-значение заполняется ионным хешем идентификатора транзакции. Таким образом, технически окончательный хэш двух транзакций никогда не будет одинаковым.
  2. Как вы заметили, значение хэша обновляется с помощью оператора «точка» QLDB. Оператор точки — это способ, с помощью которого QLDB объединяет хеш-значения, и определяется как хэш конкатенации двух хэшей, упорядоченный побайтовым сравнением между двумя хэшами (со знаком, с прямым порядком байтов). ref – https://github.com/awslabs/amazon-qldb-driver-python/blob/39fecdf2ed0521ae1d19f342a4cab38846b96c9a/pyqldb/util/qldb_hash.py#L99
  3. Алгоритм хеширования должен быть SHA 256.
  4. При хешировании запросов с параметрами правильная реализация состоит в том, чтобы взять ионный хэш любого оператора (с любыми литералами PartiQL, которые могут быть там), а затем IonHash каждого IonValue, переданного в качестве параметра (в сочетании с оператором точки).

Из вашего псевдокода я могу догадаться, что вам может не хватать 1) и 2). В частности, я хочу сказать, что псевдо предполагает, что хэш не содержит идентификатор транзакции, а оператор точки не применяется к хэшам в правильном порядке.

Для получения более подробной информации о вычислении хэша QLDB обратитесь к ответу Марка - Как получить/вычислить CommitDigest при фиксации транзакции в AWS QLDB?

Открыт для помощи в этом.

Обновлять:

Ion hash go теперь доступен — https://github.com/amzn/ion-hash-go

Также выпущен драйвер go для взаимодействия с QLDB — https://github.com/awslabs/amazon-qldb-driver-go

Оба они в настоящее время находятся в стадии бета-тестирования.

person Saurabh    schedule 25.03.2020
comment
› Хэш-значение содержит ионный хэш идентификатора транзакции. Таким образом, технически окончательный хэш двух транзакций никогда не будет одинаковым. Это правильно, но я выполнял контролируемые прогоны, жестко кодируя идентификаторы транзакций, чтобы они были одинаковыми во время расчета :) › не применяется к хэшам в правильном порядке. Я думаю, что это может быть так. Спасибо за эту ссылку! Я обновлю этот комментарий с результатом. - person Carlo Mannino; 25.03.2020