Есть ли быстрый способ выполнять транзакции, зная только закрытый ключ (секретный показатель) и адрес назначения, предпочтительно из утилиты командной строки, такой как pycoin?
Я использую Debian/Ubuntu и Python 2.7.
Чтобы создать транзакцию, вам нужна цепочка блоков или, по крайней мере, транзакции в цепочке блоков, которые принадлежат определенному адресу (технический термин — неизрасходованные выходы транзакций или UTXO для определенного скрипта). Это может произойти тремя способами:
У вас установлен локальный биткойн или btcd, который позволит вам запрашивать транзакции за счет загрузки всего блокчейна.
Вы используете электрум или какой-либо другой сервер SPV для запроса транзакций за счет подключения к этим узлам.
Вы используете централизованную службу, такую как blockchain.info, для сбора всех транзакций за счет необходимости доверять централизованной службе, чтобы она работала все время и не была повреждена.
В любом случае вы не сможете получить данные транзакции из библиотеки Python, которая не подключается к какой-либо другой службе. Следовательно, такие инструменты, как pybitcointools или pycoin, не дадут вам того, что вам нужно. sx имеет несколько инструментов для поиска utxos с помощью метода №3.
Вы можете установить Armory или bitcoind и импортировать закрытый ключ и использовать метод № 1 выше или использовать что-то вроде pi-wallet и использовать метод № 2.
Для Ubuntu, Python 2.7 (такая же установка, как у меня) я настоятельно рекомендую:
Оба являются интерфейсами командной строки, и оба работают одинаково, позволяя передавать переменные и т. д. Однако pybitcointools , похоже, поддерживает функцию истории адресов (вызов API для Blockchain.info/Blockr.io), а документация поддержки для pybitcointools кажется более понятной, чем краткое руководство по сексу .
Использование инструментов SX.
В командной строке bash создайте файл закрытого ключа WIF с именем private.key
1MBngSqZbMydscpzSoehjP8kznMaHAzh9y со следующими данными внутри: 5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
. К вашему сведению, закрытый ключ (как обсуждалось здесь ) — это мозговой кошелек mrbubbymrbubbymrbubby! (что круто, т.к. 1МБ ≈ фраза брейнволнета)
Хорошо, теперь мы запускаем эти псевдонимы/команды в точном указанном порядке (комментарии узла объясняют каждый шаг):
DECODED_ADDR=$(cat private.key | sx addr | sx decode-addr) # hash160
PREVOUT_SCRIPT=$(sx rawscript dup hash160 [ $DECODED_ADDR ] equalverify checksig) # hash160 + script padding
SIGNATURE=$(cat private.key | sx sign-input txfile.tx 0 $PREVOUT_SCRIPT) # 72 digit der signature
SIGNATURE_AND_PUBKEY_SCRIPT=$(sx rawscript [ $SIGNATURE ] [ $(cat private.key | sx pubkey) ]) # 278 digit script/sig/pubkey
sx set-input txfile.tx 0 $SIGNATURE_AND_PUBKEY_SCRIPT > txfile.tx.signed # 192 digit signed txn
В этом случае псевдонимы дают следующее:
DECODED_ADDR=dd6cce9f255a8cc17bda8ba0373df8e861cb866e
PREVOUT_SCRIPT=76a914dd6cce9f255a8cc17bda8ba0373df8e861cb866e88ac
SIGNATURE=3045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e01
SIGNATURE_AND_PUBKEY_SCRIPT=483045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
ОКОНЧАТЕЛЬНЫЙ ПОДПИСАННЫЙ TXN:
Вот окончательный необработанный Txn, который отправляет BTC на 14zWNsgUMmHhYx4suzc2tZD6HieGbkQi5s.
0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396000000008b483045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
Содержимое файла:
private.key = 5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
txfile.tx = 0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d53960000000000ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
rawscript.sigpubkey.tx = 473044022054f60e8ae19411541597167362d12fc132e081a546c766bfd69c16d9d58e268a022048055c7fd8bf78e48543e8756bb3b26336df35b812a184119ba0e9d525bbb8aa0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
signed.tx =0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396000000000b00000c0000000000000000ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
вот пример транзакции на testnet
( https://github.com/suhailvs/bitcoin-code/tree/testnet ) , которая вам нужна private key
и имеет выходной адрес, который относится к данному приватному ключу:destination address
previous transacion hash
import hashlib
import txnUtils
from keyUtils import keyToAddr, addrToScriptPubkey
# From --> one input
privateKey = hashlib.sha256('abcdefghijklmnop').hexdigest() # mpSyb71528U8dQjuTCeDCcJqH8dQTyY13c
from_address= keyToAddr(privateKey,testnet=True)
txn_hash = "3c24ca820100153fb43434191d10464dd2dcd13f0c9aa07d15f7330e8bcd0596"
# To --> android testnet wallet
to_address = 'miD4PnSDWC2M725hvFBoBhNn8fbowoHnnS'
# Sign the Transction
signed_txn = txnUtils.makeSignedTransaction(
privateKey, txn_hash, 0, addrToScriptPubkey(from_address), # input: has balance 0.01btc
[[900000,addrToScriptPubkey(to_address)]] # outputs: 0.009btc
)
print 'SIGNED TXN', signed_txn
# Broadcast this transaction(ie: signed_txn) at:
# https://testnet.blockexplorer.com/tx/send
Волшебник Оззи
Себи