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