Я хотел бы создать сервис онлайн-кошелька. Я думаю, что будет легко реализовать все функции, если я выберу Bitcoind. Вот возможный рабочий процесс:
Новый пользователь с электронной почтой bob@g.com
может получить новую учетную запись (в биткойнах) с новым адресом, позвонивgetnewaddress bob@g.com
Затем мы можем начать опрос listsinceblock xxx
, чтобы получить все новые транзакции. Если мы получаем новую входящую транзакцию, сохраняем ее txid
в базе данных, а затем итеративно вызываем gettransaction txid
все неподтвержденные транзакции. Когда количество подтверждений превышает определенный порог, кредитуйте учетную запись в базе данных, а затем позвоните move bob@g.com safe
, просто чтобы упростить следующий шаг.
Когда safe
счет превышает, скажем, 50 BTC, отправьте их в автономный кошелек.
Когда пользователь хочет вывести средства, пополните safe
при необходимости, отправьте монеты из safe
, и обновите баланс пользователя в базе данных.
Однако во всех связанных вопросах, которые я читал, большинство людей говорят, что Биткойн не будет масштабироваться. Об этом говорит даже биткойн-вики. Теперь, если мы будем использовать JSONRPC только для взаимодействия с сетью, я могу представить себе следующий рабочий процесс:
Мы генерируем, скажем, 1 миллион адресов в базе данных. Когда пользователь регистрируется или ему требуется новый адрес, мы назначаем ему один адрес.
Включаем blocknotify
получение нового хэша блока blkhash
.
Вызовите getblock blkhash
, чтобы получить все хэши транзакций в новом блоке.
Позвоните getrawtransaction txid
, чтобы узнать, получили ли мы входящую транзакцию на наши адреса. Если это так, сохраните txid
и продолжайте опрос gettransaction txid
, чтобы обновить номер подтверждения.
Позвоните signrawtransaction
, sendrawtransaction
чтобы перевести средства на офлайн-кошелек.
Мои вопросы,
Какие нюансы в операциях выше? Например,
getrawtransaction
в vout
массиве каждый объект представляет пункт назначения, но каждый из них имеет addresses
массив. Бывают случаи, когда он содержит несколько адресов. Означает ли это, что это транзакция с мультиподписью? Или это связано с reqSigs
полем? Как мы поступаем в таких случаях?Я прочитал следующие вопросы, но не нашел ответа:
Может ли исходный биткойн-клиент содержать миллионы адресов?
Биткойн-клиент API-RPC: эффективный способ перечисления транзакций из списка адресов
Пожалуйста, помогите.. Большое спасибо!
Я ненавижу быть таким парнем, но если вы боретесь с этим, есть вероятность, что вам будет сложно защитить закрытые ключи. Эти закрытые ключи являются ключами к вашей империи, о которых вы даже не хотите думать.
Подумайте очень серьезно о передаче этого на аутсорсинг компании со страховкой для этого. Или оформить страховку самостоятельно. Аутсорсинг также избавляет вас от проблем с производительностью.
Если нет, пожалуйста, не забудьте сделать (действительно) холодные кошельки. Просто поместите эти деньги в другое место.
Возможно, более конкретно, существует несколько биткойн-демонов. Вы также можете создать свой собственный с чем-то вроде 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 . Из того, что я читал, похоже, что этот демон не так полнофункционален, как обычный демон биткойнов, но я сам не пробовал его, поэтому вполне возможно, что его достаточно для ваших нужд. Тем не менее, в области безопасности есть довольно большое преимущество, поскольку вы можете создать кошелек только для просмотра на своем веб-сервере для кошелька клиентов.
Лодевийк