Я пытаюсь вставить запись в книгу 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 или драйверы узла?)