minimal functions

This commit is contained in:
Jay Graber 2017-04-11 17:13:25 -07:00
commit d2bbf926bd
13 changed files with 230 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
Python API for ZCash
Forked from 5a1t, last updated for v1.0.8 rpc interface. Incomplete

0
__init__.py Normal file
View File

0
pyZcash/__init__.py Normal file
View File

BIN
pyZcash/__init__.pyc Normal file

Binary file not shown.

View File

View File

@ -0,0 +1,64 @@
import os.path
import sys
import time
from pyzcash.rpc.ZDaemon import *
from pyzcash.settings import *
#Sweeps all unspent transparent txs, cleaning them through a temporary zaddr.
def clean_and_collect_all(taddress=TEST_TADDR, fee=DEFAULT_FEE):
zd = ZDaemon()
print "Checking balance..."
tx_unspents = zd.getUnspentTxs()
if not len(tx_unspents):
print "No spendable txs available - visit a faucet or mine!"
exit()
print "Generating temporary zaddress for tx..."
zaddress_full = zd.getNewRawZAddress()
zaddress = zaddress_full.get('zcaddress')
zsecret = zaddress_full.get('zcsecretkey')
print "Generated: " + zaddress
print "Secret: " + zsecret
print "Gathering and transmitting unspent txs..."
print "Please wait..."
notes = zd.pourAllUnspentTxs(zaddress)
encnote1 = notes.get('encryptednote1')
print "Found a note to use: \n--------------------------------------------\n" + encnote1 + "\n--------------------------------------------"
print "Waiting for note to show in blockchain before spendable..."
print "This may take a few minutes..."
while zd.receiveTx(zsecret, encnote1).get('exists') is not True:
print zd.receiveTx(zsecret,encnote1)
time.sleep(5)
print "Found note in blockchain!"
total = zd.receiveTx(zsecret, encnote1).get('amount')
print "Examined note and found total: " + str(total)
print "Spending note to target transparent address..."
tx_response = zd.sendNoteToAddress(encnote1, zsecret, taddress, total-fee, zaddress)
print "Sent! Check " + taddress + " shortly."
if __name__ == "__main__":
if len(sys.argv) <= 1:
print "Usage: python sweep_all.py <transparent address>"
print "Ex: python sweep_all.py mfu8LbjAq15zmCDLCwUuay9cVc2FcGuY4d"
exit()
taddr = sys.argv[1]
if len(taddr) != len('mfu8LbjAq15zmCDLCwUuay9cVc2FcGuY4d'):
print "That doesn't look like a transparent address.. Maybe you are trying to use a zaddress?"
exit()
print "Address looks good!"
clean_and_collect_all(taddr)

39
pyZcash/examples/tests.py Normal file
View File

@ -0,0 +1,39 @@
import os.path
import sys
from pyzcash.rpc.ZDaemon import *
from pyzcash.settings import *
def test_daemon():
zd = ZDaemon()
print zd.getBlockHash(100)
print zd.getBlockByHash(zd.getBlockHash(100))
print zd.getBlockByHeight(100)
print zd.getNetworkHeight()
print zd.getNetworkDifficulty()
print zd.getTotalBalance()
print zd.getConnectionCount()
print zd.getNewAddress()
print zd.getNewZAddress()
print zd.getUnspentTxs()
tx_amount = zd.getTxInfo(TEST_TXID).get('details')[0].get('amount')
tx = zd.createNewRawTxFromTxid(TEST_TXID)
pourtx = zd.pourRawTx(tx, TEST_ZADDR, tx_amount)
hextx = zd.signRawTx(pourtx.get('rawtxn'))
print zd.sendRawTx(hextx.get('hex'))
print pourtx
print hextx
# print zd.sendNoteToAddress(encnote, TEST_ZSECRET, TEST_TADDR, 0.33, TEST_ZADDR)
# print zd.sendNoteToAddress(encnote, TEST_ZSECRET, faucet_addr, 0.33, TEST_ZADDR)
if __name__ == "__main__":
test_daemon()

93
pyZcash/rpc/ZDaemon.py Normal file
View File

@ -0,0 +1,93 @@
import requests
import json
from pyZcash.settings import *
class ZDaemon(object):
id_count = 0
def __init__(self, url=ZURL, user=RPCUSER, password=RPCPASSWORD, timeout=TIMEOUT):
#TODO: check utf safety
self.url = 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.url, 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']
#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))
#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 getTotalBalance(self, account=""):
if account:
return self._call('getbalance', account)
else:
return self._call('getbalance')
def getUnspentTxs(self, minconf=1):
return self._call('listunspent', minconf)
#Raw Txs
def getTxInfo(self, txid):
return self._call('gettransaction', txid)
# taddr methods
def getNewAddress(self, account=""):
if account:
return self._call('getnewaddress', account)
else:
return self._call('getnewaddress')
def sendTransparent(self, taddress, amount):
return self._call('sendtoaddress', taddress, amount)
# zaddr methods
def z_getnewaddress(self):
return self._call('z_getnewaddress')
def z_listaddresses(self):
return self._call('z_listaddresses')
def z_listreceivedbyaddress(self, zaddr):
return self._call('z_listreceivedbyaddress', zaddr)

BIN
pyZcash/rpc/ZDaemon.pyc Normal file

Binary file not shown.

0
pyZcash/rpc/__init__.py Normal file
View File

BIN
pyZcash/rpc/__init__.pyc Normal file

Binary file not shown.

31
pyZcash/settings.py Normal file
View File

@ -0,0 +1,31 @@
import os, re
#ZCASH RPC
# Address and port of local zcashd testnet rpc
ZURL = "http://localhost:18232"
#Timeout needs to be high for any pour operations
TIMEOUT = 600
#Default fee to use on network for txs.
DEFAULT_FEE = 0.01
zcashconf = os.path.expanduser('~/.zcash/zcash.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(zcashconf)
# from zcash conf
RPCUSER = config[0]
RPCPASSWORD = config[1]
#TESTS
#for tests (sample data here - replace with your own)
TEST_TXID = ''
TEST_ZADDR = ""
TEST_TADDR = ""
TEST_ZSECRET = ""

BIN
pyZcash/settings.pyc Normal file

Binary file not shown.