У меня есть сложный объект (в частности, вывод метода build_send_kin
в документации Kin Python SDK )
Мне нужно base64-кодировать этот объект Builder, поэтомуможно превратить в QR-код.QR-код будет подписан существующим и стандартизированным методом, поэтому я не думаю, что смогу каким-либо образом изменить объект Builder перед его кодированием в base64.Я пробовал несколько разных подходов, каждый со своими ошибками.Вот разбивка ключевых подходов, которые я использовал.
Чтобы начать, я просто хотел понять, что даст мне вывод метода build_send_kin
, поэтому я запустил
builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
print(builder)
это напечатано: <kin_base.builder.Builder object at 0x10fbb7e48>
.Это похоже на указатель на пространство в памяти, которое содержит более сложную структуру данных.Более сложная структура данных - это то, к чему я стремлюсь кодировать с помощью base64.
Итак, во-первых, я попробовал непосредственно кодировать с помощью base-64:
builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
encoded_builder = base64.b64encode(builder)
print(encoded_builder)
Это приводит к ошибке: a bytes-like object is required, not 'Builder'
, если я сначала пробую конструктор с преобразованием байтов, как показано ниже:
builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
encoded_builder = base64.b64encode( bytes(builder))
print(encoded_builder)
Я получаю ошибку: cannot convert 'Builder' object to bytes
.
Затем я попробовал другой подход напрямуюbase64-кодирование это;Я думал, что это может быть обработано с xdrlib
.Чтобы понять, как может выглядеть распакованный объект Builder, я запустил:
builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
encoded_builder = xdrlib.Unpacker(builder)
print(encoded_builder)
, который напечатал: <xdrlib.Unpacker object at 0x10ebb8dd8>
- он по-прежнему выглядит как указатель на пробел в памяти, на этот раз распаковщик xdrlibобъект (я действительно ничего не знаю об объектах такого типа)
Задаваясь вопросом, может ли это быть закодировано в base-64, я попытался закодировать в base-64 объект распаковщика, что привело к: a bytes-like object is required, not 'Unpacker'
Я попытался преобразовать его в байты, как я это делал с исходным объектом Builder, но у меня была ошибка, аналогичная той, что была при попытке сделать это с объектом Builder.
Я также пытался распаковать xdr с помощью Unpacker.unpack_bytes()
Unpacker.unpack_string()
и Unpacker.unpack_opaque()
и полученная ошибка: 'Builder' object is not subscriptable
во всех трех случаях.Это дало мне понять, что JSON-кодирование, мои следующие амбиции, вероятно, также потерпит неудачу, но я попытался, тем не менее, использовать json.dumps с некоторым переформатированием здесь и там, что привело к ошибкам not subscriptable
или другим подобным ошибкам, которые я виделдо.Аналогичные результаты при попытке засолки.
Я видел, что могут быть некоторые способы написания пользовательских сценариев для JSON-кодирования данных такого типа, но, поскольку мне понадобятся данные, чтобы сохранить их целостность при кодировании QRпоэтому его можно проанализировать и подписать мобильным устройством конечного пользователя, я не думаю, что смогу изменить эти данные.
Наконец, поскольку Kin построен на Stellar, я попытался этот ответ StackOverflow , но похоже, что объект Builder в Kin отличается от объекта транзакции в Stellar, поскольку он не предоставляет методы toEnvelope или toXDR.
В любом случае, поскольку объект Builder существует какПредставление байтов где-то в памяти, о чем свидетельствует его каноническое строковое представление <kin_base.builder.Builder object at 0x10fbb7e48>
, я предполагаю, что должен быть какой-то простой способ QR-кодирования этого неподписанного компоновщика.Любая помощь очень ценится!