¿Existe una forma rápida de realizar transacciones conociendo solo la clave privada (exponente secreto) y la dirección de destino, preferiblemente desde una utilidad de línea de comandos como pycoin?
Estoy usando Debian/Ubuntu y Python 2.7.
Para crear una transacción, necesita la cadena de bloques, o al menos las transacciones en la cadena de bloques que pertenecen a una dirección en particular (el término técnico sería salidas de transacciones no gastadas o UTXO para una secuencia de comandos en particular). Hay tres maneras en que esto puede suceder:
Tiene instalado un bitcoind o btcd local que le permitiría consultar transacciones, a expensas de descargar toda la cadena de bloques.
Utiliza un electrum o algún otro servidor SPV para consultar transacciones, a expensas de conectarse a estos nodos.
Utiliza un servicio centralizado como blockchain.info para recopilar todas las transacciones a expensas de tener que confiar en que el servicio centralizado esté activo todo el tiempo y no sea corrupto.
De cualquier forma que lo corte, no puede obtener los datos de transacción de una biblioteca de Python que no se conecta a algún otro servicio. Por lo tanto, herramientas como pybitcointools o pycoin no le darán lo que necesita. sx tiene algunas herramientas para buscar utxos usando el método #3.
Puede instalar Armory o bitcoind e importar la clave privada y usar el método n. ° 1 anterior o usar algo como pi-wallet y usar el método n. ° 2.
Para Ubuntu, Python 2.7 (la misma configuración que yo) recomiendo:
Ambos son CLI, y ambos funcionan de manera similar, lo que permite canalizar variables, etc. Sin embargo, pybitcointools parece admitir la función de historial de direcciones (llamada API a Blockchain.info/Blockr.io) y la documentación de soporte para pybitcointools parece ser más autoexplicativa que el breve tutorial sx .
Uso de herramientas SX.
En la línea de comandos de bash, cree un archivo de clave privada WIF llamado private.key
1MBngSqZbMydscpzSoehjP8kznMaHAzh9y con estos datos dentro: 5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
. FYI, la clave privada (como se discutió aquí ) es un brainwallet de mrbubbymrbubbymrbubby. (lo cual es genial, porque 1 MB ≈ frase de billetera cerebral)
Bien, ahora ejecutamos estos alias/comandos en el orden exacto dado (comentarios del nodo que explican cada paso):
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
En este caso, los alias dan lo siguiente:
DECODED_ADDR=dd6cce9f255a8cc17bda8ba0373df8e861cb866e
PREVOUT_SCRIPT=76a914dd6cce9f255a8cc17bda8ba0373df8e861cb866e88ac
SIGNATURE=3045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e01
SIGNATURE_AND_PUBKEY_SCRIPT=483045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
TXN FIRMADO FINAL:
Aquí está el Txn sin procesar final que envía BTC a 14zWNsgUMmHhYx4suzc2tZD6HieGbkQi5s.
0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396000000008b483045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
Contenido del archivo:
private.key = 5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
txfile.tx = 0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d53960000000000ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
rawscript.sigpubkey.tx = 473044022054f60e8ae19411541597167362d12fc132e081a546c766bfd69c16d9d58e268a022048055c7fd8bf78e48543e8756bb3b26336df35b812a184119ba0e9d525bbb8aa0141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
firmado.tx =0100000001be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396000000000b00000c0000000000000000ffffffff0123ce0100000000001976a9142bc89c2702e0e618db7d59eb5ce2f0f147b4075488ac00000000
aquí hay un ejemplo de transacción en testnet
( https://github.com/suhailvs/bitcoin-code/tree/testnet ), que necesita private key
, destination address
y previous transacion hash
que tiene una dirección de salida que se relaciona con la clave privada dada:
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
mago de ozzie
Sebí