Торговый автомат с биткойнами

Если бы я хотел построить торговый автомат, в котором можно было бы купить колу, заплатив биткойнами, был бы следующий сценарий типичным способом сделать это?

  1. Покупатель подходит к автомату и выбирает продукт (независимо от способа - кнопка рядом с изображением продукта или ввод соответствующего цифрового идентификатора на клавиатуре)
  2. Машина генерирует биткойн-адрес для этой транзакции и отображает на экране QR-код адреса и буквенно-цифровое представление, а также сумму, подлежащую оплате в биткойнах.
  3. Клиент использует свой смартфон (или любое другое устройство с биткойн-клиентом) для сканирования кода, вводит сумму и отправляет транзакцию.
  4. Торговый автомат ожидает поступления ожидаемой суммы на счет и
    • доставляет товар, если сумма соответствует ожидаемой
    • отправляет деньги обратно, если сумма не соответствует ожидаемой
    • тайм-ауты, если ничего не приходит в течение 2 минут
    • возвращает деньги, если возникли технические проблемы с доставкой товара
  5. Чтобы избежать необходимости хранить закрытые ключи для каждой успешной транзакции, торговый автомат отправляет только что собранную сумму на адрес агрегации и забывает временный адрес.

Ответы (3)

Это звучит хорошо, в общих чертах. Есть несколько вещей, на которые я бы обратил внимание:

  • Возврат может быть сложным. Люди, использующие веб-кошельки, могут не иметь собственных адресов; оператор кошелька имеет большой пул адресов и отслеживает балансы клиентов внутри компании. Когда клиент хочет произвести платеж, оператор платит с одного из адресов пула и списывает средства со счета клиента. Таким образом, если вы попытаетесь отправить возврат средств такому клиенту, он вернется на адрес оператора, но у них может не быть возможности / мотивации для повторного кредитования клиента. Они могут даже выбросить закрытый ключ после того, как монеты будут потрачены (и сдача будет отправлена ​​на новый адрес пула), и в этом случае возвращенные монеты будут потеряны навсегда. В любом случае, клиент в тупике. Дополнительную информацию можно найти в разделе Существует ли стандартная процедура возврата биткойн-транзакций? и БИП 70— это предлагаемое решение (где клиент явно указывает отдельный адрес для возврата), но, поскольку это включает в себя некоторые внеполосные сообщения по HTTPS, на стороне сервера требуется дополнительная инфраструктура.

  • Возможно, вы захотите отказаться от доставки продукта через 2 минуты, но вы можете не захотеть отказываться от оплаты. Например, если у вашего компьютера или мобильного устройства клиента есть проблемы с подключением к Интернету, платеж может быть создан, но не передан (или не получен вами) намного позже. Клиента, вероятно, уже нет рядом, чтобы получить свою банку Tab, но вы, возможно, захотите вернуть его деньги в любом случае. Так что вы должны держать закрытый ключ рядом. (На самом деле, нет никакой веской причины их выбрасывать: если вы отправляете деньги обратно в штаб-квартиру, они обычно не содержат монет, так что это не проблема, если они украдены, но если кто-то по какой-то причине отправит им лишние монеты, вы хотелось бы их иметь)

  • Точно так же, если вы отправляете возмещение, вы можете убедиться, что тратите ту же транзакцию, которая пришла. Это защитит вас в случае, если клиент попытается совершить двойную трату.

  • Сумма платежа может быть встроена в QR-код. Это избавляет клиента от необходимости печатать.

  • Быстрая отправка входящих платежей в штаб-квартиру на хранение — хорошая идея, но это будет стоить вам комиссии за каждую транзакцию. Вы можете группировать их и отправлять пару раз в день или всякий раз, когда они достигают некоторой пороговой суммы. В качестве альтернативы у вас может быть система, в которой вы генерируете кучу адресов в штаб-квартире, храните там закрытые ключи (возможно, даже в автономном режиме) и просто даете машине адреса. ( BIP 32 обеспечивает более изящный способ добиться этого.) Машина по-прежнему может обнаруживать входящие платежи, но если требуется возмещение, она должна будет отправить запрос обратно в штаб-квартиру.

Это действительно хорошие моменты, спасибо. Я предполагаю, что всегда могут быть некоторые редкие ситуации, когда монеты собраны, но товар не отдан и/или монеты не собраны, но продукт взят, что технически неизбежно. Цель состоит в том, чтобы свести эту вероятность к минимуму. В конце концов, торговые автоматы с наличными также иногда ошибаются, и для решения этой проблемы существует некоторая резервная процедура, выполняемая человеком.
Для описания полного торгового автомата, который мы построили для исследования, вы можете посмотреть tik.ee.ethz.ch/file/848064fa2e80f88a57aef43d7d5956c6/…
Если у вас есть камера на вашем торговом автомате, он может запросить адрес возврата в случае технических проблем, которые покупатель может предоставить, показав QR-код со своим адресом.

Это звучит разумно. Я бы добавил, что, поскольку вы, скорее всего, захотите принимать неподтвержденные транзакции, было бы неплохо проверить список доверенных узлов (например, крупных пулов майнинга), получили ли они транзакцию. Это не полностью устраняет риск двойной траты, но снижает его.

Есть ли список «крупных пулов майнинга» в Интернете? :) А как бы вы проверили, что на узле есть эта транзакция? Ждать сообщения "inv" от каждого?
Это хороший момент, что должны быть какие-то меры для защиты от двойных расходов. Однако я не уверен, как это реализовать. Я предполагаю, что есть какой-то метод, с которым согласилось сообщество, который обеспечивает разумную уверенность.

В качестве меры предосторожности я думаю, что вы никогда не должны удалять временные адреса. Может быть, хранить их в базе данных, потому что никогда не знаешь, когда кто-то может снова случайно отправить биткойны на тот же адрес.

Ну да, чтобы защитить глупого покупателя от какой-нибудь случайной глупости. Т.е. владелец магазина также откажет рассеянному покупателю в наличных, если он вернется в магазин и скажет: «Извините, кажется, я не заплатил». Но, возможно, не навсегда, это не должно быть обязанностью продавца.