|
Shawshank
Legendary
Offline
Activity: 1623
Merit: 1608
|
|
July 03, 2016, 05:02:28 AM |
|
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. 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/pycoinDe 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 . 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/bitcoinjshttps://www.npmjs.com/package/bitcoinjs-lib
|
|
|
|
xcbtrader
|
|
July 03, 2016, 09:07:43 AM |
|
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
|
|
|
|
jza (OP)
|
|
July 03, 2016, 09:28:24 AM |
|
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_apiHaciendo 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
|
|
|
|
Shawshank
Legendary
Offline
Activity: 1623
Merit: 1608
|
|
July 03, 2016, 11:33:29 AM |
|
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. 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.
|
|
|
|
xcbtrader
|
|
July 03, 2016, 12:26:07 PM |
|
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/sendMe dice: {"status":404,"url":"/api/tx/send/01000000017b6915d835d1c9e3b858ecba1a63648a1a22f9db8287b397bd20b593d1d54546000000008a47304402205b5fa7bf2b9746212daa86746d37b389ff52f0ac6f5812b3b4e2f0f05116151602202503da6c4cbb4089339708b99c4d2462009119fc1579fed3adeaaa2b4f34d8cb0141044d5aa66d51b7552e0fbedf44862a232300cc1f9d54ae6563e4454315d573d44d5dc63868561603ca3634324e1a906580b92c8dfec642490b26a297571bc7080affffffff0128230000000000001976a91462737b6bc55ab51b1526571113b37c52e1919b0388ac00000000","error":"Not found"} ¿Alguna idea de lo que hago mal? Un saludo
|
|
|
|
Shawshank
Legendary
Offline
Activity: 1623
Merit: 1608
|
|
July 03, 2016, 02:24:48 PM |
|
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.inEstá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. 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
|
|
|
|
xcbtrader
|
|
July 03, 2016, 02:39:15 PM |
|
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/pybitcointoolsTambién muy buena... Muchas gracias por vuestras respuestas. Un saludo
|
|
|
|
jza (OP)
|
|
July 03, 2016, 02:42:10 PM |
|
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.
|
|
|
|
jza (OP)
|
|
July 03, 2016, 02:43:06 PM |
|
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/pybitcointoolsTambién muy buena... Muchas gracias por vuestras respuestas. Un saludo Puedes postear el codigo por aqui? Sharing is caring.
|
|
|
|
xcbtrader
|
|
July 03, 2016, 02:56:07 PM |
|
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/pybitcointoolsTambién muy buena... Muchas gracias por vuestras respuestas. Un saludo Puedes postear el codigo por aqui? 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/194Aquí el código funcionando: # -*- 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
|
|
|
|
xcbtrader
|
|
July 03, 2016, 05:19:32 PM |
|
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/pybitcointoolsTambién muy buena... Muchas gracias por vuestras respuestas. Un saludo Puedes postear el codigo por aqui? 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/194Aquí el código funcionando: # -*- 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) 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
|
|
|
|
xcbtrader
|
|
July 03, 2016, 10:08:24 PM |
|
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: 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)
|
|
|
|
|