From 75c253994aebfa227e65c99c33d382e083a8159d Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Fri, 12 May 2017 15:59:12 -0700 Subject: [PATCH] Refactor to use python-bitcoinlib rpc proxy --- README.md | 45 +++++ ZBXCAT/BitcoinRPC/BDaemon.py | 103 ----------- ZBXCAT/BitcoinRPC/__init__.py | 0 ZBXCAT/BitcoinRPC/settings.py | 28 --- ZBXCAT/README.md | 1 - ZBXCAT/ZcashRPC/ZDaemon.py | 160 ------------------ ZBXCAT/ZcashRPC/ZDaemon.pyc | Bin 6977 -> 0 bytes ZBXCAT/ZcashRPC/__init__.py | 0 ZBXCAT/ZcashRPC/__init__.pyc | Bin 148 -> 0 bytes .../__pycache__/ZDaemon.cpython-35.pyc | Bin 6263 -> 0 bytes .../__pycache__/__init__.cpython-35.pyc | Bin 144 -> 0 bytes .../__pycache__/settings.cpython-35.pyc | Bin 934 -> 0 bytes ZBXCAT/ZcashRPC/settings.py | 38 ----- ZBXCAT/ZcashRPC/settings.pyc | Bin 1105 -> 0 bytes ZBXCAT/__init__.py | 0 ZBXCAT/__init__.pyc | Bin 136 -> 0 bytes ZBXCAT/__pycache__/__init__.cpython-35.pyc | Bin 140 -> 0 bytes ZBXCAT/examples/__init__.py | 0 ZBXCAT/requirements.txt | 2 - ZBXCAT/tests.py | 38 ----- daemon.py | 35 ---- xcat_htlc_zec.py => protocol-pseudocode.py | 0 redeem-preimage-p2sh.py | 92 ++++------ 23 files changed, 78 insertions(+), 464 deletions(-) create mode 100644 README.md delete mode 100644 ZBXCAT/BitcoinRPC/BDaemon.py delete mode 100644 ZBXCAT/BitcoinRPC/__init__.py delete mode 100644 ZBXCAT/BitcoinRPC/settings.py delete mode 100644 ZBXCAT/README.md delete mode 100644 ZBXCAT/ZcashRPC/ZDaemon.py delete mode 100644 ZBXCAT/ZcashRPC/ZDaemon.pyc delete mode 100644 ZBXCAT/ZcashRPC/__init__.py delete mode 100644 ZBXCAT/ZcashRPC/__init__.pyc delete mode 100644 ZBXCAT/ZcashRPC/__pycache__/ZDaemon.cpython-35.pyc delete mode 100644 ZBXCAT/ZcashRPC/__pycache__/__init__.cpython-35.pyc delete mode 100644 ZBXCAT/ZcashRPC/__pycache__/settings.cpython-35.pyc delete mode 100644 ZBXCAT/ZcashRPC/settings.py delete mode 100644 ZBXCAT/ZcashRPC/settings.pyc delete mode 100644 ZBXCAT/__init__.py delete mode 100644 ZBXCAT/__init__.pyc delete mode 100644 ZBXCAT/__pycache__/__init__.cpython-35.pyc delete mode 100644 ZBXCAT/examples/__init__.py delete mode 100644 ZBXCAT/requirements.txt delete mode 100644 ZBXCAT/tests.py delete mode 100755 daemon.py rename xcat_htlc_zec.py => protocol-pseudocode.py (100%) diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d8e47b --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# ZBXCAT +A work-in-progress for Zcash Bitcoin Cross-Chain Atomic Transactions + +Contains basic scripts we're still testing in regtest mode on both networks. This may all be refactored as we go. + +The ZBXCAT directory contains BitcoinRPC and ZcashRPC, wrappers around the rpc interface that can be imported as Python modules. + +The settings.py file in BitcoinRPC and ZcashRPC parse the config files for username/password and set the network ports. + +Most functions are named exactly the same as the rpc methods, except for a few additional custom functions that do things like return only the version number. + +**EDIT**: The scripts now use the rpc proxy code in python-bitcoinlib, and ZDaemon's functions will be refactored into python-zcashlib (a Zcash fork of python-bitcoinlib) + +## Current status of scripts + +Run `redeem-preimage-p2sh.py` to test. It creates and redeems a p2sh transaction using a preimage. To successfully run it, you need python3, the dependencies installed, and a bitcoin daemon running in regtest mode. + +(Currently only tested on Bitcoin. Need to verify that the Zcash fork of python-bitcoinlib, one of the dependencies, works properly, then figure out the best way to install it.) + +`bitcoin-swap.py` contains all the functions that use a proxy to interact with a Bitcoin daemon. + +Use python3 to test. To create a virtualenv for python3, run this command from the top level of the directory: +``` +virtualenv -p python3 venv +source venv/bin/activate +``` + +Install dependencies for ZBXCAT: `pip install -r requirements.txt` + +## Installing python-zcashlib for testing and editing + +The Zcash fork of python-bitcoinlib that is currently in progress: + +`git clone https://github.com/arcalinea/python-bitcoinlib/tree/zcashlib` + +You can install this module locally through pip, in editable mode, so that changes you make are applied immediately. For install from local filesystem path: + +`pip install --editable (-e) ` + + +## Misc + +`protocol-pseudocode.py` is guaranteed to not run. It was written as a brainstorm/sketch of a hypothetical xcat protocol using @ebfull's fork of Zcash/Bitcoin that supports createhtlc as an rpc command. Including here in case it's useful in any way. + +I used the module [future](http://python-future.org/futurize.html) to make existing python2 code for the rpc interface compatible with python3. diff --git a/ZBXCAT/BitcoinRPC/BDaemon.py b/ZBXCAT/BitcoinRPC/BDaemon.py deleted file mode 100644 index 97f1f66..0000000 --- a/ZBXCAT/BitcoinRPC/BDaemon.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import -import requests -import json - -from .settings import * - -class BDaemon(object): - - id_count = 0 - - def __init__(self, network=NETWORK, user=RPCUSER, password=RPCPASSWORD, timeout=TIMEOUT): - #TODO: check utf safety - url = network_url(network) - print('In mode:', network) - self.network = url - self.user = user.encode('utf8') - self.password = password.encode('utf8') - self.timeout = timeout - - - def _call(self, method, *args): - jsondata = json.dumps({ 'version': '2', - 'method': method, - 'params': args, - 'id': self.id_count}) - - r = requests.post(self.network, auth=(self.user,self.password), data=jsondata, timeout=self.timeout) - - self.id_count += 1 - - resp = json.loads(r.text) - - #TODO: deal with errors better. - error = resp['error'] - if error: - print(error) - - return resp['result'] - - # REGTEST - def generate(self, blocknum): - return self._call('generate', blocknum) - - def importaddress(self, script): - return self._call('importaddress', script) - - #Block Info - def getBlockHash(self, blockheight): - return self._call('getblockhash', blockheight) - - def getBlockByHash(self, blockhash): - return self._call('getblock', blockhash) - - def getBlockByHeight(self, blockheight): - return self.getBlockByHash(self.getBlockHash(blockheight)) - - # Custom methods to get Network Info - def getNetworkHeight(self): - return self._call('getblockcount') - - def getNetworkDifficulty(self): - return self._call('getdifficulty') - - def getVersion(self): - info = self._call('getnetworkinfo') - client = info['subversion'] - version = client.strip('/').split(':')[1] - return version - - def getConnectionCount(self): - return self._call('getconnectioncount') - - # Wallet Info - def getbalance(self): - return self._call('getbalance') - - def listunspent(self, minconf=1): - return self._call('listunspent', minconf) - - #Raw Txs - def gettransaction(self, txid): - return self._call('gettransaction', txid) - - def getrawtransaction(self, txid, verbose=0): - # default verbose=0 returns serialized, hex-encoded data - # verbose=1, returns a JSON obj of tx - return self._call('getrawtransaction', txid, verbose) - - def decoderawtransaction(self, txhex): - return self._call('decoderawtransaction', txhex) - - def sendrawtransaction(self, txhex): - return self._call('sendrawtransaction', txhex) - - def getnewaddress(self): - return self._call('getnewaddress') - - def sendtoaddress(self, taddress, amount): - return self._call('sendtoaddress', taddress, amount) - - def listunspent(self): - return self._call('listunspent') diff --git a/ZBXCAT/BitcoinRPC/__init__.py b/ZBXCAT/BitcoinRPC/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ZBXCAT/BitcoinRPC/settings.py b/ZBXCAT/BitcoinRPC/settings.py deleted file mode 100644 index 1c2868e..0000000 --- a/ZBXCAT/BitcoinRPC/settings.py +++ /dev/null @@ -1,28 +0,0 @@ -import os, re - -TIMEOUT = 100 -#Default fee to use on network for txs. -DEFAULT_FEE = 0.01 -# Default network is testnet -NETWORK = 'TESTNET' -def network_url(network): - if network == 'TESTNET': - return "http://localhost:18332" - if network == 'REGTEST': - return "http://localhost:18332" - if network == 'MAINNET': - return "http://localhost:8332" - -bitcoinconf = os.path.expanduser('~/.bitcoin/bitcoin.conf') -def read_config(filename): - f = open(filename) - for line in f: - if re.match('rpcuser', line): - user = line.strip('\n').split('=')[1] - if re.match('rpcpassword', line): - password = line.strip('\n').split('=')[1] - return (user, password) -config = read_config(bitcoinconf) -# from bitcoin.conf -RPCUSER = config[0] -RPCPASSWORD = config[1] diff --git a/ZBXCAT/README.md b/ZBXCAT/README.md deleted file mode 100644 index c47544f..0000000 --- a/ZBXCAT/README.md +++ /dev/null @@ -1 +0,0 @@ -Python wrapper for bitcoind and zcashd, created for ZBXCAT - Zcash Bitcoin Cross-Chain Atomic Transactions. diff --git a/ZBXCAT/ZcashRPC/ZDaemon.py b/ZBXCAT/ZcashRPC/ZDaemon.py deleted file mode 100644 index cbe9a28..0000000 --- a/ZBXCAT/ZcashRPC/ZDaemon.py +++ /dev/null @@ -1,160 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import -import requests -import json - -from .settings import * - -class ZDaemon(object): - - id_count = 0 - - def __init__(self, network=NETWORK, user=RPCUSER, password=RPCPASSWORD, timeout=TIMEOUT): - #TODO: check utf safety - url = network_url(network) - print('In mode:', network) - self.network = url - self.user = user.encode('utf8') - self.password = password.encode('utf8') - self.timeout = timeout - - - def _call(self, method, *args): - jsondata = json.dumps({ 'version': '2', - 'method': method, - 'params': args, - 'id': self.id_count}) - - print("jsondata", jsondata) - - r = requests.post(self.network, auth=(self.user,self.password), data=jsondata, timeout=self.timeout) - - self.id_count += 1 - - resp = json.loads(r.text) - - #TODO: deal with errors better. - error = resp['error'] - if error: - print(error) - - return resp['result'] - - # REGTEST - def generate(self, blocknum): - return self._call('generate', blocknum) - - def importaddress(self, script): - return self._call('importaddress', script) - - #Block Info - def getBlockHash(self, blockheight): - return self._call('getblockhash', blockheight) - - def getBlockByHash(self, blockhash): - return self._call('getblock', blockhash) - - def getBlockByHeight(self, blockheight): - return self.getBlockByHash(self.getBlockHash(blockheight)) - - # Custom methods to get Network Info - def getNetworkHeight(self): - return self._call('getblockcount') - - def getNetworkDifficulty(self): - return self._call('getdifficulty') - - def getVersion(self): - info = self._call('getnetworkinfo') - client = info['subversion'] - version = client.strip('/').split(':')[1] - return version - - def getConnectionCount(self): - return self._call('getconnectioncount') - - # Wallet Info (transparent) - def getbalance(self): - return self._call('getbalance') - - def listunspent(self, minconf=1): - return self._call('listunspent', minconf) - - #Raw Txs - def gettransaction(self, txid): - return self._call('gettransaction', txid) - - def getrawtransaction(self, txid, verbose=0): - # default verbose=0 returns serialized, hex-encoded data - # verbose=1, returns a JSON obj of tx - return self._call('getrawtransaction', txid, verbose) - - def decoderawtransaction(self, txhex): - return self._call('decoderawtransaction', txhex) - - def sendrawtransaction(self, txhex): - return self._call('sendrawtransaction', txhex) - - # taddr methods - def getnewaddress(self): - return self._call('getnewaddress') - - def sendtoaddress(self, taddress, amount): - return self._call('sendtoaddress', taddress, amount) - - def listunspent(self): - return self._call('listunspent') - - # Custom method to find a taddr with spendable utxos for z_sendmany - def find_taddr_with_unspent(self): - unspent = self._call('listunspent') - for utxo in unspent: - if utxo['spendable'] == True and utxo['amount'] > 0.1: - # Check that it's not a coinbase tx - tx = zd.gettransaction(utxo['txid']) - if 'generated' not in tx: - return tx['address'] - - def sweep_coinbase(self, zaddr): - cb = [] - utxos = self.listunspent() - for utxo in utxos: - tx = self.gettransaction(utxo['txid']) - if 'generated' in tx and tx['generated'] == True: - cb.append(utxo) - for coin in cb: - amount = coin['amount'] - 0.0001 - opid = self.z_sendmany(coin['address'], zaddr, amount) - print("OPID of z_sendmany: ", opid) - status = self.z_getoperationstatus(opid) - print("Status: ", status[0]['status']) - - # zaddr methods - def z_gettotalbalance(self): - return self._call('z_gettotalbalance') - - def z_getnewaddress(self): - return self._call('z_getnewaddress') - - def z_listaddresses(self): - return self._call('z_listaddresses') - - def z_listreceivedbyaddress(self, zaddr, minconf=1): - return self._call('z_listreceivedbyaddress', zaddr, minconf) - - def z_getoperationstatus(self, opid): - return self._call('z_getoperationstatus', ["{0}".format(opid)]) - - def z_getoperationresult(self, opid): - return self._call('z_getoperationresult', ["{0}".format(opid)]) - - # With addition of encrypted memo field - def z_sendmany(self, sender, receiver, amount=0.0001, memo=''): - amts_array = [] - if memo == '': - amounts = {"address": receiver, "amount": amount} - else: - memo = memo.encode('hex') - amounts = {"address": receiver, "amount": amount, "memo": memo} - amts_array.append(amounts) - return self._call('z_sendmany', sender, amts_array) diff --git a/ZBXCAT/ZcashRPC/ZDaemon.pyc b/ZBXCAT/ZcashRPC/ZDaemon.pyc deleted file mode 100644 index 0b074e6a56dff6d4c1f35fc25dd6741c427f0734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6977 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 TCwyke&F8c+jnk%TR?PnaQThe} diff --git a/ZBXCAT/ZcashRPC/__pycache__/__init__.cpython-35.pyc b/ZBXCAT/ZcashRPC/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index 4edf66416533d4fce183dc910216c10b43202948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmWgV<>l(<7mQ>8g2x~N1{i@12OutH0TL+;48fX=ek&P@K*9*(m#uzAer~FMR$`@o zRB~c*hJHb1Nk)F2v2I0jVu^l1QGQ8&a()g_6e3$xkgOjcpP83g5+AQuP$l%)p3$6@RKMj`Rd~* zOUp~++kfdw{#W|S%1V5QXYPNz^?mEd`26{}^~qTr2Ywkj3KxSc?FB?`h>wAxV{BlQ zX9yf%0`eTE1WpDpA<%yN4o)@T1O{jkfr$oZ8WdZS4A3r|;*u`iLxS$jpH{B3jqB{z zf3kIW--3fl1tvQ5G_=Fqp;nOx$0aKSu`kKmg>0ABQOo_Z{E!vlf+6%QXQ|K%CXAua zgGd-9FX9|Oc@lF>sP^K7rT&l!(i3_Tr%dRoX7#$tHz=mD^5vQnWkco+{E62860iIvXk}$3-N)jGA8&kn@%`ldnOZ=JPtMXw6sp8wT#AZ(5DD}*&@8ldH1!!l z15AKQIu&qK!bCvtT>_^DXaOT^m4Jx>X9iR+iHxvqIK?H4x`+h3xOi$pj!Jbv<04?; z9|0D;U!bu!F=1lCz`*`AF`F$tg;AdmHJRrahIymR8CRK zT+7~n^kVBV1Jw$Ml zVl16ecFZ9k83ZM;V7wfnh(`dd0b~N!}x$sBOT6>+BMP?ZP5|) z;x5`fk&>q_mspohlS?avIY{ zcVlh$wSTbTx?F4->O|Y9ERV`CkGb|1PWk3gs$Pe-rQ@j+XGL#keYfv=tcZMPt>4Gp zdYU4Ax9=bL`v>mGpQrRi)T@1W-E)0z@D=<=tLf|>kBj&)lTYd9s5=O^ W&8EPg(KOMFd85^88@8}5_KIK1v+LLZ diff --git a/ZBXCAT/__init__.py b/ZBXCAT/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ZBXCAT/__init__.pyc b/ZBXCAT/__init__.pyc deleted file mode 100644 index 3e2ddb4e2e404ff9e2c8bc9ac84af9ef3fb52bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmZSn%*)l!FBqB300oRd+5w1*S%5?e14FO|NW@PANHCxg#fCsJ{fzwFRQ;^PO8uzh z#NrJ7isZx+{eq(WlKkZS9Q}eyh-iF#W?p7Ve7s&kWeEpRmrZVdN@-529mworAZ7pn D3iTWf diff --git a/ZBXCAT/__pycache__/__init__.cpython-35.pyc b/ZBXCAT/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index 6565f3fbe921ede65e6891382ec85dd16fbd1ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWgV<>l(<7mQ>8g2x~N1{i@12OutH0TL+;48fX=ek&P@K*9*(m!*D2er~FMR$`@o zRB~c*hJHb1Nk)F2v2I0jVu^l1QGQ8&a()g_6e1fRpP83g5+AQuP