Дайджест не совпадает при вставке в QLDB - PullRequest
0 голосов
/ 22 марта 2020

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

Нет Go версия IonHa sh пока, тем не менее, поэтому я реализовал шаги StartTransaction, InsertInto и CommitTransaction в Go и включил Python исполняемую реализацию IonHa sh для вычисления IonHashes, используемых для сравнения переварить в конце.

// 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"
}

Я не понимаю, почему дайджесты не совпадают во время фиксации в go, когда эта реализация производит тот же дайджест, что и код python, который выполняет фиксацию. Почему код python не жалуется на несоответствие дайджестов, когда он производит те же коммиты, что и код go? Что еще более важно, как я могу успешно вставить в QLDB через Go (не python или драйверы узла?)

1 Ответ

0 голосов
/ 25 марта 2020

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

Несколько вещей, которые вы можете проверить при вычислении га sh:

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

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

Подробнее о расчете QLDB ha sh см. Ответ Mar c - Как получить / вычислить CommitDigest при совершении транзакции в AWS QLDB?

Готов помочь в этом.

...