Author

Topic: Programacion sobre bibliotecas de Bitcoin? (Read 925 times)

hero member
Activity: 865
Merit: 1006
July 03, 2016, 05:08:24 PM
#13
He hecho el mismo programa pero sólo con la librería de bitcoin, en lugar de utilizar 2 librerías diferentes.
No he podido probar la parte final, ya que no tenía ninguna dirección en la que hacer la prueba,, pero tendría que funcionar bien.

Está hecho en python 2.7

Para quien quiera probarla / mejorarla:

Code:
def hacer_sweep(addr, dst_address, wif):
err = True
f_Sweep = False
feeMin = 1000
while err:
try:
request = 'https://blockchain.info/q/addressbalance/' + addr
response = requests.get(request)
content = int(response.json())
err = False
if content <= feeMin * 2:
f_Sweep = False
print ('### ERROR - SALDO INSUFICIENTE PARA HACER SWEEP ###')
else:
f_Sweep = True
except KeyboardInterrupt:
exit()
except:
print ('### ERROR DE CONEXION ###')
err = True
time.sleep(10)
if f_Sweep:
try:
h = history(addr)
outs = []
outs.append({'value': content, 'address': dst_address})
tx = mktx(h,outs)
tx2 = sign(tx,0,wif)
tx3 = sign(tx2,1,wif)
pushtx(tx3)
print ('### SWEEP REALIZADO CON EXITO ###')
except:
print ('### ERROR - SWEEP NO REALIZADO ###')

# PROGRAMA PRINCIPAL
import sys
from bitcoin import *
import requests
import json
import time

hacer_sweep(direccion origen, direccion destino, clave privada dir orige)

hero member
Activity: 865
Merit: 1006
Gracias por tu respuesta, pero al final ya lo he solucionado...

El problema principal era que el fee lo ponia en bitcoins, i no en satoshis.
Para subir la transacció a la red he utilizado la instrucción pushtx(tx) de la libreria:

https://github.com/vbuterin/pybitcointools

También muy buena...

Muchas gracias por vuestras respuestas.

Un saludo

Puedes postear el codigo por aqui?  Roll Eyes
Sharing is caring.

Off Course
El código no es 100% mio, la idea principal la he cogido de una pregunta hecha en gitub:
https://github.com/richardkiss/pycoin/issues/194

Aquí el código funcionando:

Code:
# -*- coding: utf8 -*-

from bitcoin import *
from pycoin.key import Key

from pycoin.key.validate import is_address_valid, is_wif_valid
from pycoin.services import spendables_for_address
from pycoin.tx.tx_utils import create_signed_tx

src_address = "1K...DIRECCION DONDE ESTAN LOS FONDOS"
wif = "5J...CLAVE PRIVADA DE LA DIRECCION DE LOS FONDOS"
dst_address = "19...DIRECCION DONDE VAMOS A ENVIAR LOS FONDOS"


spendables = spendables_for_address(src_address,"BTC")
for spendable in spendables:
    print(spendable)

key = Key.from_text(wif)
if src_address not in (key.address(use_uncompressed=False), key.address(use_uncompressed=True)):
    print("** WIF doesn't correspond to %s" % src_address)
print("The secret exponent is %d" % key.secret_exponent())



tx = create_signed_tx(spendables, payables=[dst_address], wifs=[wif], fee=1000)

print("here is the signed output transaction")
print(tx.as_hex())

pushtx(tx.as_hex())

Un saludo

El fee que he puesto es muy bajo: 0.00001 btc (1000 satoshis) por lo tanto la operación tardará mucho en confirmar.

También se puede poner de la siguiente forma: (no probado)

Quote
tx = create_signed_tx(spendables, payables=[dst_address], wifs=[wif], fee='standard')

Con esto se supone que el sistema calcula el mejor fee.
Si alguien lo ha comprobado, que nos explique su opinión.

Un saludo
hero member
Activity: 865
Merit: 1006
Gracias por tu respuesta, pero al final ya lo he solucionado...

El problema principal era que el fee lo ponia en bitcoins, i no en satoshis.
Para subir la transacció a la red he utilizado la instrucción pushtx(tx) de la libreria:

https://github.com/vbuterin/pybitcointools

También muy buena...

Muchas gracias por vuestras respuestas.

Un saludo

Puedes postear el codigo por aqui?  Roll Eyes
Sharing is caring.

Off Course
El código no es 100% mio, la idea principal la he cogido de una pregunta hecha en gitub:
https://github.com/richardkiss/pycoin/issues/194

Aquí el código funcionando:

Code:
# -*- coding: utf8 -*-

from bitcoin import *
from pycoin.key import Key

from pycoin.key.validate import is_address_valid, is_wif_valid
from pycoin.services import spendables_for_address
from pycoin.tx.tx_utils import create_signed_tx

src_address = "1K...DIRECCION DONDE ESTAN LOS FONDOS"
wif = "5J...CLAVE PRIVADA DE LA DIRECCION DE LOS FONDOS"
dst_address = "19...DIRECCION DONDE VAMOS A ENVIAR LOS FONDOS"


spendables = spendables_for_address(src_address,"BTC")
for spendable in spendables:
    print(spendable)

key = Key.from_text(wif)
if src_address not in (key.address(use_uncompressed=False), key.address(use_uncompressed=True)):
    print("** WIF doesn't correspond to %s" % src_address)
print("The secret exponent is %d" % key.secret_exponent())



tx = create_signed_tx(spendables, payables=[dst_address], wifs=[wif], fee=1000)

print("here is the signed output transaction")
print(tx.as_hex())

pushtx(tx.as_hex())

Un saludo
jza
full member
Activity: 126
Merit: 103
Gracias por tu respuesta, pero al final ya lo he solucionado...

El problema principal era que el fee lo ponia en bitcoins, i no en satoshis.
Para subir la transacció a la red he utilizado la instrucción pushtx(tx) de la libreria:

https://github.com/vbuterin/pybitcointools

También muy buena...

Muchas gracias por vuestras respuestas.

Un saludo

Puedes postear el codigo por aqui?  Roll Eyes
Sharing is caring.
jza
full member
Activity: 126
Merit: 103
Que bueno hilo de desdarrollo, aprendi varias cosas. Aun asi me gustaria saber si hay alternativa a usar el blockchain nativo sin depender de una API. Especialmente por que me han mencionado lo del bitcoin purge, si alguien sabe sobre esta funcionalidad en el nodo, al parecer limita el blockchain a un tamanio designado.

No se si necesite usar el cliente de bitcoin, libbitcoind, o algo similar.
hero member
Activity: 865
Merit: 1006
Gracias por tu respuesta, pero al final ya lo he solucionado...

El problema principal era que el fee lo ponia en bitcoins, i no en satoshis.
Para subir la transacció a la red he utilizado la instrucción pushtx(tx) de la libreria:

https://github.com/vbuterin/pybitcointools

También muy buena...

Muchas gracias por vuestras respuestas.

Un saludo
legendary
Activity: 1623
Merit: 1608
Me dice:

{"status":404,"url":"/api/tx/send/01000000017b6915d835d1c9e3b858ecba1a63648a1a22f9db8287b397bd20b593d1d54546000000008a47304402205b5fa7bf2b9746212daa86746d37b389ff52f0ac6f5812b3b4e2f0f05116151602202503da6c4cbb4089339708b99c4d2462009119fc1579fed3adeaaa2b4f34d8cb0141044d5aa66d51b7552e0fbedf44862a232300cc1f9d54ae6563e4454315d573d44d5dc63868561603ca3634324e1a906580b92c8dfec642490b26a297571bc7080affffffff0128230000000000001976a91462737b6bc55ab51b1526571113b37c52e1919b0388ac00000000","error":"Not found"}

¿Alguna idea de lo que hago mal?

¡Perfecto! Ya casi lo tienes.

La raw transaction es correcta y está firmada. Lo he comprobado en https://coinb.in

Estás enviando 0.00009000 BTC a la dirección 19yZZdxnmtULAAv86jrgVAoQzqBrJTrjaQ desde el txid-vout 4645d5d193b520bd97b38782dbf9221a8a64631abaec58b8e3c9d135d815697b-0. Como ese txid-vout contiene también 0.00009000 BTC, no estás poniendo comisión y seguramente no se confirme nunca.

Pero eso es lo de menos. Lo más difícil ya está hecho. HAY QUE TENER CUIDADO CON ESTO, PERO NORMALMENTE POR LO CONTRARIO, POR ENVIAR DEMASIADA COMISIÓN. DE AHÍ APARECEN LAS NOTICIAS DE QUE ALGUIEN POR DESPISTE HA ENVIADO VARIOS BITCOINS DE COMISIÓN QUE MUCHAS VECES YA NO TIENEN VUELTA ATRÁS.

Te está dando error porque no estás enviando la raw transaction como un mensaje POST sino que la estás añadiendo al final de la URL.

Siguiendo en Python, puedes probar a hacer algo parecido a esto para hacer el envío. Utiliza urlfetch que es propio de Google App Engine, pero te puede valer para coger la idea y adaptarlo a tu plataforma.

Code:
  from google.appengine.api import urlfetch
  def pushtxn(raw_tx):
  '''Insight send raw tx API'''
  PUSH_TX_URL='https://insight.bitpay.com/api/tx/send'
  url = PUSH_TX_URL
  payload = urllib.urlencode({
    "rawtx": raw_tx
  })
  result = urlfetch.fetch(url,
    method=urlfetch.POST,
    payload=payload
  )
  
  if result.status_code == 200:  
    j = json.loads(result.content)
    txid = j.get('txid')
    return txid, raw_tx
  else:
    msg = 'Error accessing insight API:'+str(result.status_code)+" "+str(result.content)
    return None, msg
hero member
Activity: 865
Merit: 1006
Quote
Si prefieres usar Python con pycoin:
1. Llama a la función create_signed_tx de https://github.com/richardkiss/pycoin/blob/master/pycoin/tx/tx_utils.py . Esa función devuelve una instacia de Tx.
2. Consigue la raw transaction de ese Tx.
3. Publica esa raw transaction, por ejemplo, mediante un mensaje POST en https://insight.bitpay.com/api/tx/send . Ellos se encargan de publicarla inmediatamente en la red Bitcoin.

Si superas el paso 1, y tienes alguna duda con los pasos 2 a 3, te puedo dar más pistas.

Buenas.

Yo he conseguido superar el punto uno, y si imprimor el tx en hex me da:
01000000017b6915d835d1c9e3b858ecba1a63648a1a22f9db8287b397bd20b593d1d5454600000 0008a47304402205b5fa7bf2b9746212daa86746d37b389ff52f0ac6f5812b3b4e2f0f051161516 02202503da6c4cbb4089339708b99c4d2462009119fc1579fed3adeaaa2b4f34d8cb0141044d5aa 66d51b7552e0fbedf44862a232300cc1f9d54ae6563e4454315d573d44d5dc63868561603ca3634 324e1a906580b92c8dfec642490b26a297571bc7080affffffff0128230000000000001976a9146 2737b6bc55ab51b1526571113b37c52e1919b0388ac00000000

Si copio esto en: https://insight.bitpay.com/api/tx/send

Me dice:

{"status":404,"url":"/api/tx/send/01000000017b6915d835d1c9e3b858ecba1a63648a1a22f9db8287b397bd20b593d1d54546000000008a47304402205b5fa7bf2b9746212daa86746d37b389ff52f0ac6f5812b3b4e2f0f05116151602202503da6c4cbb4089339708b99c4d2462009119fc1579fed3adeaaa2b4f34d8cb0141044d5aa66d51b7552e0fbedf44862a232300cc1f9d54ae6563e4454315d573d44d5dc63868561603ca3634324e1a906580b92c8dfec642490b26a297571bc7080affffffff0128230000000000001976a91462737b6bc55ab51b1526571113b37c52e1919b0388ac00000000","error":"Not found"}

¿Alguna idea de lo que hago mal?

Un saludo
legendary
Activity: 1623
Merit: 1608
Tengo una clave privada en formato WIF_COMPRESSED (las que empiezan por 5)
Las claves privadas WIF_COMPRESSED empiezan por K o por L. Son las claves privadas WIF_UNCOMPRESSED las que empiezan por 5.


Quote from: xcbtrader
Yo también estoy trabajando en diferentes programas en Python que utilizan el protocolo bitcoin.
Lo que no consigo es hacer una transferencia de forma automática...
jza indica utlizar https://blockchain.info/api/blockchain_wallet_api . Probablemente sea lo más sencillo. No puedo comentar mucho. He utilizado su receive payments API, pero nada de la wallet API.

Si prefieres usar Python con pycoin:
1. Llama a la función create_signed_tx de https://github.com/richardkiss/pycoin/blob/master/pycoin/tx/tx_utils.py . Esa función devuelve una instacia de Tx.
2. Consigue la raw transaction de ese Tx.
3. Publica esa raw transaction, por ejemplo, mediante un mensaje POST en https://insight.bitpay.com/api/tx/send . Ellos se encargan de publicarla inmediatamente en la red Bitcoin.

Si superas el paso 1, y tienes alguna duda con los pasos 2 a 3, te puedo dar más pistas.  Smiley
jza
full member
Activity: 126
Merit: 103
En blockchain tienes un metodo llamado Send_To(), si lo quieres ejecutar de forma automatica, creo que deberas hacer algo como un listener, vi daemon, el cual cheque tu log de tansacciones y al tener nuevas transacciones (en la db por ejemplo) pueda tomar el monto y meterlo en el send_to()
https://blockchain.info/api/blockchain_wallet_api

Haciendo el outgoing payback necesitas dar de alta el API del wallet el cual permite operarla remotamente. Yo quiero no tener que hacer eso por eso me gustaria tener un wallet local con el blockchain como pruning. Asi puedo especificar el maximo peso del blockchain a digamos 100-200MB en vez de los gigas.

Aun no lo he hecho si alguien ha hecho esto, me gustaria que diera mas inforamcion de pros y cons.
https://en.bitcoin.it/wiki/Scalability#Storage
hero member
Activity: 865
Merit: 1006
Quote
No conozco pybitcoind pero sí he trabajado con la librería pycoin y está fenomenal. Si quieres trabajar en Python, recomiendo totalmente pycoin. https://github.com/richardkiss/pycoin

Buenas.
Yo también estoy trabajando en diferentes programas en Python que utilizan el protocolo bitcoin.
Lo que no consigo es hacer una transferencia de forma automática...

Me explico ya que es muy simple, pero no lo consigo:

Tengo una clave privada en formato WIF_COMPRESSED (las que empiezan por 5) y lo que quiero es, simplemente hacer una transferencia de los fondos existentes (menos los fees correspondientes) a otra dirección.

He mirado blockchain.info con sus APIs, y otras librerias, pero no lo consigo...

¿Alguna ayudita?

Thanks
legendary
Activity: 1623
Merit: 1608
Saludos si quiero crear un carrito de compras en bitcoin, pero mi primer problema es implementar la libreria sin tener que mantener un blockchain. Usualmente los VPS primarios son solo 500mb y mantener un blockchain en local no es opcion, me pregunto si puedo hacerlo sin el blockchain conectando quizas con algun CDN remoto.
Efectivamente, mantener un nodo completo de Bitcoin en un VPS sale por una pasta. Dudo que encuentres nada por menos de 500 euros al año. La cadena de bloques se está acercando a los 100 GB. En Bitcoin Core existe la posibilidad de mantener una versión "pruned" o "recortada" de la cadena de bloques, pero eso tiene sus limitaciones.

Quote from: jza
No conozco pybitcoind pero sí he trabajado con la librería pycoin y está fenomenal. Si quieres trabajar en Python, recomiendo totalmente pycoin. https://github.com/richardkiss/pycoin

De todas formas, para el caso de la gestión de un carrito de la compra, puede que sea mejor no utilizar una biblioteca (librería) que gestione el protocolo Bitcoin directamente, sino optar por llamadas a servicios JSON que comunican directamente con la red. Existen multitud de ellos. Un ejemplo muy sencillo es https://blockchain.info/api/api_receive .

Quote from: jza
Para Node.js (NPM) he utlizado BitcoinJS. Brutal, excepcional. Todo lo que se diga es poco. Trabajas en servidor y como con todo NPM, cuando lo necesitas, Browserify y al navegador directo.
http://bitcoinjs.org/
https://github.com/bitcoinjs
https://www.npmjs.com/package/bitcoinjs-lib



jza
full member
Activity: 126
Merit: 103
Saludos si quiero crear un carrito de compras en bitcoin, pero mi primer problema es implementar la libreria sin tener que mantener un blockchain. Usualmente los VPS primarios son solo 500mb y mantener un blockchain en local no es opcion, me pregunto si puedo hacerlo sin el blockchain conectando quizas con algun CDN remoto.

En Python he encontrado: https://github.com/saltduck/pybitcoind
y https://github.com/coinforge/bitforge

NPM he visto estos: https://www.npmjs.com/search?q=bitcoin

Gracias.
Jump to: