Создайте сервис онлайн-кошелька с помощью Bitcoind, можно ли его масштабировать? Если нет, что можно сделать?

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

  1. Новый пользователь с электронной почтой bob@g.comможет получить новую учетную запись (в биткойнах) с новым адресом, позвонивgetnewaddress bob@g.com

  2. Затем мы можем начать опрос listsinceblock xxx, чтобы получить все новые транзакции. Если мы получаем новую входящую транзакцию, сохраняем ее txidв базе данных, а затем итеративно вызываем gettransaction txidвсе неподтвержденные транзакции. Когда количество подтверждений превышает определенный порог, кредитуйте учетную запись в базе данных, а затем позвоните move bob@g.com safe, просто чтобы упростить следующий шаг.

  3. Когда safeсчет превышает, скажем, 50 BTC, отправьте их в автономный кошелек.

  4. Когда пользователь хочет вывести средства, пополните safeпри необходимости, отправьте монеты из safe, и обновите баланс пользователя в базе данных.

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

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

  2. Включаем blocknotifyполучение нового хэша блока blkhash.

  3. Вызовите getblock blkhash, чтобы получить все хэши транзакций в новом блоке.

  4. Позвоните getrawtransaction txid, чтобы узнать, получили ли мы входящую транзакцию на наши адреса. Если это так, сохраните txidи продолжайте опрос gettransaction txid, чтобы обновить номер подтверждения.

  5. Позвоните signrawtransaction, sendrawtransactionчтобы перевести средства на офлайн-кошелек.

Мои вопросы,

  • Считаете ли вы мои предложения разумными?
  • Какие нюансы в операциях выше? Например,

    • переводя все средства на один счет, а затем отправляя деньги, считается ли это одной транзакцией или одной транзакцией для каждого счета? Тарифы на транзакции такие же?
    • при выполнении getrawtransactionв voutмассиве каждый объект представляет пункт назначения, но каждый из них имеет addressesмассив. Бывают случаи, когда он содержит несколько адресов. Означает ли это, что это транзакция с мультиподписью? Или это связано с reqSigsполем? Как мы поступаем в таких случаях?

Я прочитал следующие вопросы, но не нашел ответа:

Может ли исходный биткойн-клиент содержать миллионы адресов?

Биткойн-клиент API-RPC: эффективный способ перечисления транзакций из списка адресов

Пожалуйста, помогите.. Большое спасибо!

Очень трудно ответить на что-то столь широкое, как вопросы, которые вы упомянули. В основном это больше связано с программной инженерией, чем с биткойнами. Итак, я ответил на ваш вопрос, поскольку я вижу, что он применим к Биткойну и программному обеспечению Биткойн. Прежде всего, убедитесь, что ваша «безопасная» учетная запись может быть перенесена только человеком, и что она находится на отдельной машине, которая обычно отключена и защищена брандмауэром.

Ответы (2)

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

Подумайте очень серьезно о передаче этого на аутсорсинг компании со страховкой для этого. Или оформить страховку самостоятельно. Аутсорсинг также избавляет вас от проблем с производительностью.

Если нет, пожалуйста, не забудьте сделать (действительно) холодные кошельки. Просто поместите эти деньги в другое место.

Возможно, более конкретно, существует несколько биткойн-демонов. Вы также можете создать свой собственный с чем-то вроде bitcoinJ. Я познакомился с ребятами из btcd («BitcoinD in Go») https://github.com/conformal/btcd на Bitcoin2014, их ведущий кодер произвел хорошее впечатление.

Боюсь, на этот вопрос пока нет отложенного ответа. Возможно, лучший совет: «Сделайте это, если вы столкнетесь с проблемой, вы уже добились успеха. У вас будет достаточно времени, чтобы решить ее позже».

Было еще несколько предложений по ответу на этот связанный вопрос: Как правильно масштабировать тысячи биткойн-аккаунтов с помощью bitcoind deamon?

Кто-то уже создал оболочку для биткойн-демона на Java: https://github.com/btc4j/btc4j-daemon — может быть проще использовать ее вместо непосредственного демона и использовать базу данных, чтобы делать то, что было бы неэффективно на блокчейн, например, управление учетными записями пользователей.

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

Если вы хотите напрямую взаимодействовать с демоном биткойн (или как можно ближе к прямому с оболочкой), попробуйте использовать оболочку Java и использовать базу данных для задач, с которыми демон не справляется эффективно. Однако, если вы хотите создать свой онлайн-кошелек с учетом безопасности, я бы посоветовал вам использовать демон Armory: https://bitcointalk.org/index.php?topic=92496.0 . Из того, что я читал, похоже, что этот демон не так полнофункционален, как обычный демон биткойнов, но я сам не пробовал его, поэтому вполне возможно, что его достаточно для ваших нужд. Тем не менее, в области безопасности есть довольно большое преимущество, поскольку вы можете создать кошелек только для просмотра на своем веб-сервере для кошелька клиентов.