Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Биткойн: вступление для разработчиков

Anna | 15.06.2014 | нет комментариев
Одним из основных превосходств Биткойна является то, как легко, легко и комфортно трудиться с ним, с точки зрения разработчика. Биткойн не имеет ни сторонних зависимостей, ни проприетарных API, ни стремительно меняющихся интерфейсов. Каков бы ни был ваш любимый язык программирования, есть недурная вероятность того, что теснее существует простая биткойн-библиотека, которая дозволит вам начать отправку и приобретение биткойнов в течение нескольких часов. Цель этой статьи – представить некоторые из этих библиотек, и показать основы работы с биткойн-адресами и транзакциями на любом языке.

Адреса, Ключи, Транзакции, ого!

Биткойн-протокол дозволено поделить на три логические части: управление адресами и ключами, создание транзакций и добавление транзакций в блоки (майнинг). Аспекты майнинга для начинающего разработчика неактуальны, и тут не освещаются. Это отдельная специализированная область, которая стремительно профессионализируется, а если вы заинтересованы в любительском майнинге – легко приобретете стандартное оборудование биткойн-шахтера. А вот адреса, ключи и транзакции – это то, с чем доводится иметь дело всякому, об этом-то мы и побеседуем.

В плане управления биткойн-ключами, есть три типа объектов, с которыми вам придется иметь дело: тайные ключи, публичные ключи и адреса. Допустимо, вы также видели термины «закрытый ключ” и ” открытый ключ” в контексте криптографии с открытым ключом, так вот это то же самое. Биткойн использует не ветхие криптографические алгорифмы на основе разложения на множители (как RSA), а больше новейший вид криптографии, тот, что именуется эллиптическая криптография, следственно биткойн-ключи немножко отличается от, скажем, PGP-ключей. Тайный ключ выглядит дальнейшим образом:

9d86361789d13823fd888fa45c9b356b76d41a7e33b2b2c3056632721c4c12

А соответствующий ему публичный:

04d8f08938e78447b2b1a629c503d5e17483b0d15751a9e8f83c8460e6ec32fd68d0b4068e83c012f54df995e52ed8bae38056a8d922f9687200ae83e5a6728dff

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

172YRdGzPqyXm9rm1EWKwPXTRsmcApoPQ6

image
Как вы могли бы подметить, биткойн-адрес представлен не в шестнадцатеричном виде, как тайный и публичный ключи. Это потому, что для него Биткойн использует «сжатый» формат представления, знаменитый как base58check. Base58 говорит о том, что в нем применяются 58 разных букв и цифр (нуль, О, l и I опущены, так как их слишком легко перепутать друг с ином). Base58 – это число с основанием 58 — подобно привычному для нас двоичному (основание 2), десятичному (основание 10) либо шестнадцатеричному (основание 16) представлению. Скажем, десятичное число 31337 в двоичном виде будет ’111101001101001′, в шестнадцатеричном — ’7A69′, а в основании 58 это легко ‘AKJ’. Ну а суффикс check в изложении формата обозначает, что к перед переводом числа в base58 к нему еще добавляется четырехбайтовая «чек-сумма». Все биткойн-библиотеки (о которых мы побеседуем чуть позднее) делают перевод в base58check механически, так что вам не придется это намеренно программировать.

Ну а сейчас, побеседуем о транзакциях.

Первое, что нужно иметь в виду, это то, что в биткойне нет представления «счетов» либо «балансов», как в обыкновенной бухгалтерии. Все средства хранятся в объектах, знаменитых как «выходы транзакции». Всякая транзакция имеет один либо несколько «входов», всякий из которых тратит неизрасходованный «выход» больше ранней транзакции («UTXO=unspent transaction output»). Всеобщее число биткойнов во всех входах суммируется, и транзакция может после этого распределить эту сумму на всякое число своих собственных «выходов». Вот как нормальная транзакция выглядит в json формате:

{  "locktime": 0,     
   "ins": [         
       {  "script": "",           
           "outpoint": { 
               "index": 0, 
               "hash": "319ba90f1645eed46a8fd48e9754ca979c3371f59099d32634a8b56549ce02aa"      
           },             
           "sequence": 4294967295      
        }     
     ],     
     "outs": [      
         {  "value": 1000000,  
             "script": "76a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac"       
         },     
         {  "value": 344164, 
             "script": "76a914c4c5d791fcb4654a1ef5e03fe0ad3d9c598f982788ac" 
          }
      ],    
      "version": 1 
}

А если это после этого сериализовать, мы получим:

0100000001aa02ce4965b5a83426d39990f571339c97ca54978ed48f6ad4ee45 160fa99b310000000000ffffffff0230750000000000001976a914a41d15ae65 7ad3bfd0846771a34d7584c37d54a288ac204e0000000000001976a914c4c5d7 91fcb4654a1ef5e03fe0ad3d9c598f982788ac00000000

Параметр всякого выхода «script» это Почаще каждого легко метод представления адреса получателя. Преобразовав два выходных скрипта указанной транзакции в адреса, мы получим “1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq” и “1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T“, соответственно. Исключительный вход в этой транзакции является ссылкой на выход предыдущей транзакции (хэш-код транзакции и индекс выхода в ней). Посмотрев на blockchain.info, мы видим, что выход 0 транзакции с хэш-кодом 319ba90f… имеет 1354164 сатоши (наименьшая стомиллионная доля биткойна), которые дозволено потратить. Два выхода транзакции тратят в сумме 1344164. Куда же деваются еще 10000 сатоши? Они оставлены в качестве оплаты за транзакцию майнеру, тот, что включит эту транзакцию в блок.

Как вы теснее додумались, транзакция может потратить только каждый вход всецело, а не Отчасти. Дабы обойти эту задачу, вводится «сдачи» — один из выходов отправляется получателю, а вот 2-й – возвращает «сдачу» с потраченного входа на свой личный адрес. В нашем примере транзакции, 1-й выход – это 0.01 BTC оплаты, а 2-й выход — сдача. Позже создания транзакции, вам необходимо подписать всякий вход секретным ключом, тот, что соответствует этому адресу. Данный процесс для эллиптической криптографии не так уж и банален – но библиотеки-то нам на что? Они все за нас сделают, только дай верный тайный ключ. Вот как эта наша транзакция выглядит, когда ее подписали:

0100000001aa02ce4965b5a83426d39990f571339c97ca54978ed48f6ad4ee45 160fa99b31000000008b48304502203bcabb367ca84b2af394597bff4a6169fa 55b156708557256d2c584f1bd54e1502210086fdf257e58dbb5e1f3b4686f438 5e86ea89e677a6c90a3c87ce276d88ad2b31014104e6eb4c73192bcc7b63f7e3 c05ed52c0d98abac6f6aa0876e2e57eeda6b60fe03098cb63633d08077b14cc3 0efe9bc5c9866ebc1297c03399e27381539025f887ffffffff0240420f000000 00001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac64400500 000000001976a914c4c5d791fcb4654a1ef5e03fe0ad3d9c598f982788ac0000

Сейчас, наконец, мы можем послать подготовленную транзакцию в сеть, где ее подхватят и включат в блокчейн майнеры. Самый наилучший метод сделать это программно – через интерфейс наblockchain.info/pushtx. И это, в всеобщем-то, все – конец теории, вы сейчас специалист в биткойн-транзакциях! Ну, во каждом случае, это абсолютно рабочий минимум познаний, пока мы не стали рассуждать о платежных скриптах, схемах с арбитражем либо с залогом и прочих продвинутых прелестях биткойн-транзакций. Но все это отменнее оставить для иной статьи.

Bitcoind

Bitcoind является «образцовым заказчиком», сделанным стержневой командой биткойн-разработчиков. Это полновесный биткойн-узел, тот, что загружает всю историю транзакций (blockchain) и обрабатывает транзакции. Bitcoind несколько лимитирован по функциональности, скажем, он не может выдать вам историю транзакций по адресу, тот, что вы не импортировали предварительно. Тем не менее, он предоставляет довольно сильный интерфейс для программиста. Позже загрузки Bitcoind и его инсталляции/сборки, первым шагом является создание файла конфигурации в папке Биткойна ( ~/.bitcoin – чай вы на Линуксе, правильно?) со дальнейшим оглавлением:

rpcuser=user 
rpcpassword=pass 
rpcport=8332 
txindex=1

?сно, стоит заменить user/pass на собственное имя пользователя и пароль. Как только вы сделаете это, перейдите в каталог, содержащий исполняемый файл (/bin если вы инсталлировали готовую сборку, либо куда вы там его сами собрали) и запустите демон:

> ./bitcoind --daemon

Сейчас, у вас есть два пути взаимодействия с демоном bitcoind, Дабы принудить его исполнять ваши команды. 1-й метод примитивней: в командной строке, вводите «bitcoind» с указанием имени команды и доводов. Скажем:

> ./bitcoind getblockhash 1 
   00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048  
> ./bitcoind getblock 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048  
   {  "hash" : "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",     
      "confirmations" : 212362,     
      "size" : 215,     
      "height" : 1,     
      "version" : 1,
      "merkleroot" : "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
      "tx" : [  "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"  ],     
      "time" : 1231469665,     
      "nonce" : 2573394689,
      "bits" : "1d00ffff",
      "difficulty" : 1.00000000,
      "previousblockhash" : "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
      "nextblockhash" : "000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd" 
    }
> ./bitcoind getrawtransaction 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098
 01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000

2-й метод использует JSON-RPC. Это всеобщий интерфейс, тот, что разрешает подключаться к bitcoind и исполнять команды из всякого языка – а допустимо, даже с иного компьютера. В Wiki Биткойна есть страница (https://en.bitcoin.it/wiki/API_reference_(JSON-RPC)) с подробным изложением некоторых методов сделать JSON-RPC-вызов в разных языках программирования. Для краткости я приведу только два.

В Pythone:

import httplib, json, base64 
def mkrequest(url,user,pass,method,params,hasresponse=True):
      connection = httplib.HTTPConnection(url)
      postdata = json.dumps({ "method": method, "params": params }) 
      req = urllib2.Request('http://localhost:8001',postdata, {   
               'Authorization': b'Basic ' base64.b64encode(user ':' pass),
       })
      if hasresponse: return urllib2.urlopen(req).read().strip()

А вот так это дозволено сделать в командной строке с поддержкой curl:

curl --user <user> --pass <pass> --data-binary '{"method": <method>, "params": [<param1>,<param2>...] }' http://localhsot:8332

SX

Есть два альтернативных инструментов командной строки для работы с биткойн-транзакциями: pyBitcointools иSX. SX был сделан Амиром Тааки, pyBitcointools написал Виталик Бутерин. Синтаксис дюже схож, правда есть и различия. Установка SX является касательно простым делом — все, что вам необходимо сделать, это загрузить скрипт install-sx.sh, установить пару библиотек, и запустить данный скрипт. В Ubuntu, скажем, последовательность команд выглядит дальнейшим образом:

wget http://sx.dyne.org/install-sx.sh 
sudo apt-get install git build-essential autoconf libtool libboost-all-dev pkg-config libcurl4-openssl-dev libleveldb-dev libzmq-dev libconfig  -dev libncurses5-dev qrencode 
chmod  x install-sx.sh 
./install-sx.sh

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

> sx history 114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd
Address: 114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd
output: eb84dd62287a1d85e3f31b0de869534a8f800fad559e36f779a45470aa4e8976:0
output_height: 277978
value: 100000
spend: 3216bc4b8294532cddab1ae2a95a336ee841be02e6246c1ad9cf1e7db788d10e:0
spend_height: 277979

Address: 114tTpMrJHJpNvkPZmz8KVcJoQjD5Utosd
output: 5a45c86c5aff8200db4c7f8a91b9a3e51932510cbeb2dc173fc8611bee5aeaaf:1
output_height: 278076
value: 70000
spend: 4817f863ace4337be7ea95476b2c73723fb83fbe0e1a6236fbf30f2a8aa14dee:0 spend_height: 278076

> sx fetch-transaction 516f0bfe2ed3703112434f645fdc7d805bba51c94c9d8f88b666f1c832eb423c

010000000142f2e85e078a214d5c61b58276da5cec01311e026355c570b650c2e665585011010000008a47304402203aa40adefd0dc4a3f960b230a9e1b284d78a4b4dec9119368fdeb006af3b6c7b022071165df64ea4502003d8b6e9c46c28b5c5c748226737b4fe1ee8fc4269b50ee5014104a70f7c8b0a835f549f061b725bd3e06744963a07cb2f76097bafe040f939d6e6d23c6cc89e5b50aa944d26b7d1c8a1f3b8b4e6f7c2f54cf35fb46b0e4b9442e1ffffffff02a0860100000000001976a914ba55b9859c7356c5e5549c8a30c463e3db64e84488ac80054800000000001976a9145a35a4558b8a0140f4a73aaac0be891b99e3790e88ac00000000

Если вы хотите вычислить равновесие адреса, вы обязаны получить всю его историю (ключ –j даст вам итог в легко разбираемом JSON -формате), отфильтровать те входы, которые теснее были потрачены, и суммировать значения 08f977b92e55465e’) ’0100000002b8497b5d250420d0e0ef55150ae49f451846791f54b858e4d7b50e23c087b560010000008c493046022100a49c01bbf7a6200b05c61072f79fbbcbb56182e0082f85734ff501efd8f2180a022100a6d2b19a1023c4197206b1ea0d58165fa4d6170e7823d90d1cdb0f2704ceb5d0014104ba8b7ec1189b046d0f6dc68d2cafa4bfc30ea34b8f52a0f815550ffd5f5dfe12df06f2c9a3c1b206b833fe274601fe19e0afd9c47e251ba247edfa7a0237ab3affffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c000000008c493046022100c7309b13e54896533ebb6c369b1f46992ed7f8d96c8eb606cfd66a06bf6a061d022100e1cb8d32b380dac42584a5e1a6ff00c209767471b8bb82a13bf8d36221a39aa9014104a88f9a448cfcf259df1da679a37dd8e4c148cb6f0ba6a9b1e7d7019b09ef1034495f02d4cdf27d2bab41da3bce3f9508b20f6ad265b5940799610b69a12d02a5ffffffff0250c30000000000001976a9147d13547544ecc1f28eda0c0766ef4eb214de104588ac953d0800000000001976a9145fe616df99d43ae8001ca941f381572cd1cb74b388ac00000000′

Обратите внимание, что pybtctool имеет опцию –s, которую дозволено применять создания цепочки операций:

> pybtctool sha256 'some big long brainwallet password' | pybtctool -s privtoaddr | pybtctool -s history 
[{'output': u'97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}, {'output': u'4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}]  

> pybtctool fetchtx 97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e | pybtctool -s deserialize 
{"locktime": 0, "outs": [{"value": 50000, "script": "76a9147d13547544ecc1f28eda0c0766ef4eb214de104588ac"}, {"value": 540053, "script": "76a9145fe616df99d43ae8001ca941f381572cd1cb74b388ac"}], "version": 1, "ins": [{"script": "493046022100a49c01bbf7a6200b05c61072f79fbbcbb56182e0082f85734ff501efd8f2180a022100a6d2b19a1023c4197206b1ea0d58165fa4d6170e7823d90d1cdb0f2704ceb5d0014104ba8b7ec1189b046d0f6dc68d2cafa4bfc30ea34b8f52a0f815550ffd5f5dfe12df06f2c9a3c1b206b833fe274601fe19e0afd9c47e251ba247edfa7a0237ab3a", "outpoint": {"index": 1, "hash": "60b587c0230eb5d7e458b8541f794618459fe40a1555efe0d02004255d7b49b8"}, "sequence": 4294967295}, {"script": "493046022100c7309b13e54896533ebb6c369b1f46992ed7f8d96c8eb606cfd66a06bf6a061d022100e1cb8d32b380dac42584a5e1a6ff00c209767471b8bb82a13bf8d36221a39aa9014104a88f9a448cfcf259df1da679a37dd8e4c148cb6f0ba6a9b1e7d7019b09ef1034495f02d4cdf27d2bab41da3bce3f9508b20f6ad265b5940799610b69a12d02a5", "outpoint": {"index": 0, "hash": "4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171"}, "sequence": 4294967295}]}

Ну и, безусловно же, вы можете делать транзакции:

> pybtctool mktx 97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0 4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1 16iw1MQ1sy1DtRPYw3ao1bCamoyBJtRB4t:90000 | pybtctool -s sign 0 57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4 

01000000025e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f797000000008b483045022100dd29d89a28451febb990fb1dafa21245b105140083ced315ebcdea187572b3990220713f2e554f384d29d7abfedf39f0eb92afba0ef46f374e49d43a728a0ff6046e01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c0100000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000

После этого вы можете послать транзакцию в сеть с поддержкой pushtx либо eligius_pushtx Дабы послать прямиком на данный пул. Команда eligius_pushtx пригодна для «нестандартных» транзакций которые обыкновенные биткойн-ноды отвергают, но пул Eligius относится к ним лояльно. Скажем, транзакции с несколькими подписями либо с несколькими сторонами транзакции будут приняты тут, но немного где еще.

Библиотеки

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

• БиткойнJS (Javascript): оригинал, либо форк
• python-ecdsa (Python)
• bitcoin-ruby (Ruby)
• Haskoin (Haskell)
• libБиткойн (C )
• БиткойнJ (Java)
• btcd (Go)

Занимайтесь биткойн-программированием в свое наслаждение!

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB