Bitcoin Forum

Local => Кодеры => Topic started by: Lomov on December 21, 2011, 10:28:52 PM



Title: -
Post by: Lomov on December 21, 2011, 10:28:52 PM
-


Title: Re: Как принимать BTC на сайте?
Post by: LZ on December 22, 2011, 12:01:35 AM
1. Закреплять при регистрации за каждым пользователем свой постоянный "адрес для приема БТС"?
Да, иначе придется каждый раз вручную возвращать недошедшие средства.

2. Использовать шлюз? Какой лучше и надежней?
Даже такой надежный как mybitcoin.com был взломан с потерей половины средств.

3. Если самим, то какой алгоритм?
Запрос адреса для некоего пользователя login01:
Code:
bitcoind.getaccountaddress('login01')
Пользователь нажимает кнопку "Новый адрес":
Code:
bitcoind.getnewaddress('login01')
Проверяем правильность структуры адреса:
Code:
bitcoind.validateaddress('lalala')
Если запрашиваем подтвержденный баланс:
Code:
bitcoind.getbalance('login01')
Делаем копию файла кошелька wallet.dat:
Code:
bitcoind.backupwallet('wallet.bak')
Внутренний перевод между аккаунтами:
Code:
bitcoind.move('login01','login02','1.00')
Выводим средства на указанный адрес:
Code:
bitcoind.sendfrom('login01','1inux7eD8H13GrvBvdPjUbW7oSz8osgD8','1.00')
Кидаем на биты всех пользователей:
Code:
bitcoind.sendtoaddress('1inux6wWiTBsQwU3pPG856rSvPVi8evX4',bitcoind.getbalance())
Выводим список юзеров и балансов:
Code:
bitcoind.listaccounts()

Обращаем внимание на то, что демон не будет спрашивать об оплате комиссии, а сразу заплатит.


Title: Re: Как принимать BTC на сайте?
Post by: LZ on December 22, 2011, 12:34:44 AM
Вообще, где копать, чтобы надежно и просто подключить БТС?
https://en.bitcoin.it/wiki/ (https://en.bitcoin.it/wiki/)


Title: Re: Как принимать BTC на сайте?
Post by: N.Z. on December 22, 2011, 01:00:21 AM
Вообще вопрос интересный. Не в плане реализации как таковой, а в плане "Сколько будет стоить система приема биткоинов на сайт". И кто возьмется. Так глядишь больше сервисов появится. Lomov, сколько там у вас по смете стоит этот пункт при условии, что делать сами будете, если не секрет?


Title: Re: Как принимать BTC на сайте?
Post by: LZ on December 22, 2011, 01:52:48 PM
Ващее тупо?
Да, не стоит так делать, запутаетсь. Вы не упростили, а усложнили.
Поймите, что пользователи будут называть чужие трансакции своими.
К тому же большинство пользователей Bitcoin понятия не имеют с каких
адресов они отправляли биткоины (следствие сильной паранои клиента).
А суммы могут и совпадать, что приведет к настоящему хаосу с оплатой.


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on December 22, 2011, 11:36:22 PM
1. Чтобы делать свой прием платежей БТС надо на сервере сайта запустить bitcoind
2. wallet.dat будет на сервере (он сам создастся или туда надо положить? )
3. дальше все рулится с помощью JSON-RPC?

Тогда алгоритм для сервиса следующий:

1. Пользователь регистрируется на сайте
2. Нажимает "Оплатить услугу" - появляется форма для ввода суммы и адрес для транзакции
3. Он отсылает БТС на этот адрес - система открывает доступ к услуге, но в тоже время ждет подтверждения платежа (если что блокирует услугу/аккаунт)
4. Как только приход БТС подтвердился - система пересылает содержимое кошелька на сервере на кошелек, который находится допустим в офисе/дома. Тем самым - кошелек на сервере практически всегда пустой
1 - да, если не использовать сторонние сервисы.
2 - сам создастся.
3 - да.

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

Я, кстати, тоже думал о том, чтобы поднять сервис приёма платежей. Благо биткойндов и так много крутится на серверах :)


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on December 22, 2011, 11:40:08 PM
1. Закреплять при регистрации за каждым пользователем свой постоянный "адрес для приема БТС"?
Да, иначе придется каждый раз вручную возвращать недошедшие средства.
Возвращать вручную надо только если софт по какой-то причине не может это учитывать сам.
Не представляю, с чего бы вдруг автор не стал бы это реализовывать.

2. Использовать шлюз? Какой лучше и надежней?
Даже такой надежный как mybitcoin.com был взломан с потерей половины средств.
На этот счёт есть разные мнения. Некоторые считают что его никто не взломал, просто автор сбежал с половиной средств.


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on December 23, 2011, 12:22:13 AM
Это как?
Не уловил первый абзац
Можно создать приватный ключ и публичный ключ вообще не связываясь с биткойновой сетью. Просто сгенерировать их.
А потом, когда надо будет забрать деньги - импортировать приватный ключ в свой клиент и подписать нужные транзакции.
Хотя импорт большого количества ключей, возможно, будет тормозить.


Title: Re: Как принимать BTC на сайте?
Post by: LZ on December 23, 2011, 04:15:06 AM
Возвращать вручную надо только если софт по какой-то причине не может это учитывать сам.
Не представляю, с чего бы вдруг автор не стал бы это реализовывать.
Далеко не всегда действительно необходимо оперировать на уровне транзакций.

На этот счёт есть разные мнения. Некоторые считают что его никто не взломал, просто автор сбежал с половиной средств.
Может я чего не понимаю, но труЪ мошенники не возвращают половину средств!

Это как?
Не уловил первый абзац
Использование нестандартных подходов таит опасности. Mt.Gox уже отличился... (https://bitcointalk.org/index.php?topic=50441.0)


Title: Re: Как принимать BTC на сайте?
Post by: LZ on December 23, 2011, 05:02:23 AM
Рассмотрим несколько вариантов.

1. Демон запущен на том же сервере, что и сайт.
ПЛЮС: самый простой вариант, минимум действий.
МИНУС: при взломе сервера пропадут все средства.

2. То же самое, но с bitcoind.encryptwallet('password').
ПЛЮС: если хакер не сможет найти скрипт с паролем
в открытом виде, то он уже не украдет все средства.
МИНУС: непонятно, как это можно надежно спрятать.

3. Демон запущен на другом сервере, настроен на SSL.
ПЛЮС: если хакер не сможет найти ключи SSL, то уже
он не сможет украсть все средства (аналогично SSH).
МИНУС: точно такой минус, как и у второго варианта.

4. То же самое, но команды фильтруются скриптом.
ПЛЮС: захватив сервер, хакер не сможет выполнять
нежелательные команды, например - отправка битов.
МИНУС: нужно хитроумно проводить выводы средств.

5. Сгенерировать много ключей на самом вебсервере.
ПЛЮС: тулзы vanitygen и pywallet спешат на помощь.
МИНУС: хакера позабавит, что все ключи на виду...

6. Сгенерировать много ключей и хранить их оффлайн.
ПЛЮС: все закрытые ключи принципиально не в сети.
МИНУС: все то же самое, что и в четвертом варианте.

Так как у Вас не планируется вывод средств самими
пользователями, то хитроумный вывод не требуется,
просто импортируете ключи с помощью pywallet или
запрашиваете множество ключей с помощью самого
клиента Bitcoin. На сервере выдаете адреса из уже
заготовленного списка, BlockExplorer'ом проверяете
баланс каждого адреса скриптом или же вручную.


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on December 23, 2011, 08:59:31 AM
Возвращать вручную надо только если софт по какой-то причине не может это учитывать сам.
Не представляю, с чего бы вдруг автор не стал бы это реализовывать.
Далеко не всегда действительно необходимо оперировать на уровне транзакций.
Переплату можно обнаружить легко и на уровне адресов.
Это же так просто - отправить обратно.

На этот счёт есть разные мнения. Некоторые считают что его никто не взломал, просто автор сбежал с половиной средств.
Может я чего не понимаю, но труЪ мошенники не возвращают половину средств!
Разве ? А как же btcex, например ?


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on December 23, 2011, 09:03:18 AM
1. Демон запущен на том же сервере, что и сайт.
ПЛЮС: самый простой вариант, минимум действий.
МИНУС: при взломе сервера пропадут все средства.
Скрипту ничего не мешает раз в час или по мере необходимости отправлять все средства на кошелёк автора или вообще в оффлайн.
Таким образом риск снимается.

Так как у Вас не планируется вывод средств самими пользователями, то хитроумный вывод не требуется,
просто импортируете ключи с помощью pywallet или запрашиваете множество ключей с помощью самого
клиента Bitcoin. На сервере выдаете адреса из уже заготовленного списка, BlockExplorer'ом проверяете
баланс каждого адреса скриптом или же вручную.
Вручную - как-то не модно в наш век высоких технологий. На то они и электронные платежи чтобы всё работало само.
Можно автоматически по блокэксплореру или с использованием специального сервиса.


Title: Re: Как принимать BTC на сайте?
Post by: N.Z. on December 23, 2011, 11:17:01 AM
Quote
Так как у Вас не планируется вывод средств самими
пользователями, то хитроумный вывод не требуется,
просто импортируете ключи с помощью pywallet или
запрашиваете множество ключей с помощью самого
клиента Bitcoin. На сервере выдаете адреса из уже
заготовленного списка, BlockExplorer'ом проверяете
баланс каждого адреса скриптом или же вручную
Строить такую конструкцию и надеяться на сторонний BlockExplorer как-то не комильфо. Тогда уж еще проще. Сгенерировать 1000 адресов, список - на сайт, на отдельном серваке с bitcoind проверять приход, в случае успеха посылать команду на сайт "Бабло пришло" и включать услугу. <paranoia>Команду посылать через Tor, чтобы злые хакеры не догадались, откуда она идет</paranoia>  Серваком может быть хоть впс за 10 долларов, кто-то даже предлагает вроде с настроенным кошельком уже, хоть домашний компьютер.


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 12, 2012, 03:35:56 PM
Подскажите правильно ли я мыслю. Необходимо обеспечить пополнение баланса некоторых игровых аккаунтов через BTC. Т.е. игроки платят через BTC, и мы аккумулируем полученные средства на определенном своем кошельке, а игроку выдаем соответствующий баланс в игровой валюте по курсу.

Порядок действий такой.
Игрок в личном кабинете переходит на станицу оплаты BTC (жмет кнопку оплатить через BTC).
Скрипт проверяет, есть ли в базе для этого игрока уникальный BTC счет , если нет, тогда генерит его используя bitcoind.getnewaddress('login01') и сохраняет в базе (счет навсегда закрепляется за этим логином), иначе извлекает старый.
Далее игроку высвечивается этот адрес для пополнения и соотношение 1 btc = единиц игровой валюты.
Игрок платит на этот BTC счет, и через какое-то время (необходимое для прохождения транзакции) жмет кнопку проверить баланс.
В этот момент скрипт делает bitcoind.getbalance('login01') ,если там любой ненулевой баланс,тогда запоминает сумму, и обнуляет баланс путем перевода на основной кошелек (если мы храним все на одном сервере bitcoind.move('login01','login02','1.00') ) или  переводит всю сумму на наш кошелек, который спрятан в надежном месте bitcoind.sendfrom('login01','1inux7eD8H13GrvBvdPjUbW7oSz8osgD8','1.00') , далее проверяется обнулился ли баланс , если да, эта запомненная сумма перемножается на курс игровой валюты и зачисляется на баланс игрока.
Оплата окончена.

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

В качестве rpc сервера используем линуксовый bitoind, в качестве клиента пхп скрипт https://en.bitcoin.it/wiki/PHP_developer_intro

Все ли я правильно делаю? Есть ли ограничение на количество созданных счетов на один аккаунт?


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 13, 2012, 01:45:12 AM
Проверил вышенаписанное на практике, полет нормальный. Запустил службу на linux серваке, дождался пока скачались все блоки.
Написал php скрипт, который проверяет по базе есть ли уже адрес у игрока, если нет, выдает.
В том же скрипте реализовал функции проверки баланса (чтобы игрок видел поступили средства или нет тыкая ajax кнопочку) и функции пополнения игрового аккаунта (в этот момент все поступившие средства переводятся с внутреннего btc  аккаунта игрока , на общий btc аккаунт сервера и btc игрока обнуляется, а игровой пополняется соответствующей суммой (тут проверка обнулился ли игровой акк).

Плюсы у данного алгоритма такие:
+ минимум кода и таблиц БД (всего одна простая с полями login - btc_address), ну еще одна будет наверное хранить историю пополнений
+ нет необходимости контролировать и хранить выписанные счета и суммы на них (только для истории)
+ пополнение доступно на любую сумму. Т.е. сколько btc игрок пополнит, столько по курсу игровой валюты и получит.
+ независимость, обошлись без сторонних сервисов

Минусы:
- нужен отдельный linux сервер (по скорости не важно, но место нужно гигабайта полтора для начала)
- rpc вызов из пхп . Не очень я люблю такие шаманства , при большом числе запросов любая сетевая ошибка связи с rpc сервером может вылезти боком (кучей зависших процессов, которые с удовольствием слопают все ресурсы сервера). Но тут число запросов будет по числу платежей, так что проблем не должно быть, накрайняк переписать основной код под nodejs , темболее есть клиентский пакет , так что даже код особо не изменится.

Для rpc использовал этот http://code.gogulski.com/bitcoin-php/ класс-обертку, достаточно добротно сделано и хорошо задокументированно.

Если кому интересно , код причешу хоть немного и выложу. А чуть позже наверное сделаю статью , ибо мануалов по этому поводу катострофически не хватает.

Оптимально , теперь найти сервис, который просто , без лишних регистраций и телодвижений с минимальным %, позволяет пополнить указанный btc кошелек на определенную сумму стандартными валютами , и многие , даже не зная что это за биткоин такой пополнять ваш сервис, а мы получаем анонимность платежей и полную защиту от призвола wm и yd .


Title: Re: Как принимать BTC на сайте?
Post by: promankirov on January 13, 2012, 10:29:15 AM
Проверил вышенаписанное на практике, полет нормальный. Запустил службу на linux серваке, дождался пока скачались все блоки.
Написал php скрипт, который проверяет по базе есть ли уже адрес у игрока, если нет, выдает.
В том же скрипте реализовал функции проверки баланса (чтобы игрок видел поступили средства или нет тыкая ajax кнопочку) и функции пополнения игрового аккаунта (в этот момент все поступившие средства переводятся с внутреннего btc  аккаунта игрока , на общий btc аккаунт сервера и btc игрока обнуляется, а игровой пополняется соответствующей суммой (тут проверка обнулился ли игровой акк).


Если кому интересно , код причешу хоть немного и выложу. А чуть позже наверное сделаю статью , ибо мануалов по этому поводу катострофически не хватает.

Мне очень интересно. Готов отблагодарить небольшим BTC переводом.


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 13, 2012, 12:10:07 PM
Проверил вышенаписанное на практике, полет нормальный. Запустил службу на linux серваке, дождался пока скачались все блоки.
Написал php скрипт, который проверяет по базе есть ли уже адрес у игрока, если нет, выдает.
В том же скрипте реализовал функции проверки баланса (чтобы игрок видел поступили средства или нет тыкая ajax кнопочку) и функции пополнения игрового аккаунта (в этот момент все поступившие средства переводятся с внутреннего btc  аккаунта игрока , на общий btc аккаунт сервера и btc игрока обнуляется, а игровой пополняется соответствующей суммой (тут проверка обнулился ли игровой акк).


Если кому интересно , код причешу хоть немного и выложу. А чуть позже наверное сделаю статью , ибо мануалов по этому поводу катострофически не хватает.

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


Title: Re: Как принимать BTC на сайте?
Post by: N.Z. on January 13, 2012, 12:24:03 PM
Quote
Если кому интересно , код причешу хоть немного и выложу.
Естественно!
Quote
а мы получаем анонимность платежей и полную защиту от призвола wm и yd .
И киви (https://bitcointalk.org/index.php?topic=58426) с некоторых пор :)
Quote
мне нужен кто-то в редакторы, чтобы проверил и поправил если я в чем-то ошибаюсь, ибо в реальной работе пока не могу все протестировать.
Где ж ты раньше был, только-только свободный сервак припахал  :-\ А что нужно конкретно?


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 13, 2012, 12:33:41 PM
Где ж ты раньше был, только-только свободный сервак припахал  :-\ А что нужно конкретно?
Я сделаю статью с подробным описанием и кодом как осуществить пополнение баланса (игрового/неигрового) при помощи btc, на гитхаб выложу исходники.
Потом размещу на хабре (с которого тут же перепечатают еще в 10-ок источников) и еще некоторых ресурсах уже непосредственно посвященных BTC.
Все что мне нужно будет, чтобы кто-то проверил готовую статью, дабы не было каких-то неточностей и явных косяков, просто привык такие дела делать с долей ответственности, ибо если сделаю какой-то косяк, потом много народу будет бестолку долбаться.


Title: Re: Как принимать BTC на сайте?
Post by: N.Z. on January 13, 2012, 01:19:33 PM
Все равно не понял - тебе орфографию, код проверить или на практике попользоаться? Если на практике, то я так понял сервер с bitcoind нужен? Кто хотел отблагодарить рублем биткоином, могут скинуться на вот это вот (http://www.microthosting.com/bitcoin-servers.html): "The cost of this service is $5.26 a month, ONLY! "

В любом случае до публикации на хабре можно отписаться здесь в раздел "Кодеры", а то и в английской ветке. Если кто и сможет помочь, то тусуются они тут на форуме.


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 13, 2012, 01:55:40 PM
Все равно не понял - тебе орфографию, код проверить или на практике попользоаться?
Нет, посмотреть нет ли явных косяков, просто я особо не вникал в теорию работы демона, вдруг я что не так понял.

К примеру вот есть один момент, я когда зачисляю баланс игроку, все btc скидываю с адреса игрока, на основной накопительный адрес. Затем проверяю, если на счете игрока 0 btc (т.е. транзакция по переводу прошла успешно), тогда выдаю ему игровую валюту.

Но без глубокого понимания теории , можно сильно накосячить, ибо float числа нельзя сравнивать с 0, они никогда таковыми ни бывают. Хотя на тестах у меня все работает,т.е. если на счету 0,000234 BTC и перевести на другой аккаунт 0,000234 BTC на счету будет 0 ($balance == 0 - true). В реальности же может быть иначе. Может вообще нельзя так делать и нужно еще параллельно вести баланс в отдельной таблице.

Если на практике, то я так понял сервер с bitcoind нужен? Кто хотел отблагодарить рублем биткоином, могут скинуться на вот это вот (http://www.microthosting.com/bitcoin-servers.html): "The cost of this service is $5.26 a month, ONLY! "
Да сервак не нужен, если что, для тестов, на каком-то амазоне в облаке подниму.

В любом случае до публикации на хабре можно отписаться здесь в раздел "Кодеры", а то и в английской ветке. Если кто и сможет помочь, то тусуются они тут на форуме.
Да, думаю обращусь туда.

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


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 14, 2012, 03:34:46 AM
Немного переделал скрипт, добавил ajax плюшек, шаблонизатор, проверки на доступность сервера (обрабатывается критическая ситуация его недоступности, т.е. если bitcoind упадет, это не уложит на лопатки весь пхп демон из-за повисших воркеров), поверки на ошибки.

Полностью ушел от идеи хранить параллельно в базе адреса аккаунтов, надеюсь это ни где боком не вылезет. Т.е. все привязанные к логинам адреса хранятся прямо в wallet.dat.

По быстродействию хз как оно будет, но работает достаточно шустро. На 200 тыс сгренерированных тестовых адресов, wallet.dat разросся на 140 мб, а скорость выборки уменьшилась с 5 до 50 мс на виртуалке, что в целом приемлемо.

Выглядит так:
http://img683.imageshack.us/img683/590/bitpay.png

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

Код разместил тут  http://github.com/Lexiks/Bitpay (http://github.com/Lexiks/Bitpay)
полностью рабочий, постараюсь повесить демку куда-то.


Title: Re: Как принимать BTC на сайте?
Post by: DeepBit on January 18, 2012, 05:56:49 PM
По быстродействию хз как оно будет, но работает достаточно шустро. На 200 тыс сгренерированных тестовых адресов, wallet.dat разросся на 140 мб, а скорость выборки уменьшилась с 5 до 50 мс на виртуалке, что в целом приемлемо.
Надо ещё учитывать то, каким образом потом эти полученные платежи использовать.
А то основной рост wallet.dat и задержки будут от накопления транзакций, а не адресов.


Title: Re: Как принимать BTC на сайте?
Post by: Lexiko on January 18, 2012, 08:04:47 PM
По быстродействию хз как оно будет, но работает достаточно шустро. На 200 тыс сгренерированных тестовых адресов, wallet.dat разросся на 140 мб, а скорость выборки уменьшилась с 5 до 50 мс на виртуалке, что в целом приемлемо.
Надо ещё учитывать то, каким образом потом эти полученные платежи использовать.
А то основной рост wallet.dat и задержки будут от накопления транзакций, а не адресов.
Думаю в среднем для большинства сервисов будет 1-10 тыс клиентов и 1-20 операций пополнения, так что , думаю, особых проблем быть не должно.

Или вы все же не рекомендуете использовать штатные средства bitcoin базы для хранения баланса по аккаунтам и операций?
Пул с огромным количеством выплат и микротранзакций это понятно, но нужен ли свой велосипед для большинства пунктов приема BTC, где оборот будет не столь велик ?

P.S. кстати, сделал демку к коду, что выше, кому интересно, см. тут https://bitcointalk.org/index.php?topic=60144.0


Title: Re: Как принимать BTC на сайте?
Post by: qdi on February 02, 2012, 09:48:04 AM
отличное дело вечером задонейтю :)