def setUp(self): self.directory_node, self.onion_nodes = generate_nodes() self.directory_node.start() for node in self.onion_nodes: node.connect(DIR_IP, DIR_PORT) node.start() # Start the test website, that listens on port 80. self.website = TestingWebsite(port=WEBSITE_PORT) self.website.start() time.sleep(1) # Give enough time for the local network to be setup
def tx_inputs(txhash): txdata=tx_lookup(txhash) global prevtxidsq automatic=False txins=txdata['vin'] prevtxids=[] for x in txins: if 'txid' in x: #is normal transaction, not automatic block reward prevtxids.append([x['txid'],x['vout']]) else: height=node.connect('getblock',[txdata['blockhash']])['height'] prevtxids.append(height) automatic=True answer={} if automatic==False: #who was the destination of that txid,outputn pair? answer['inputs']=[] for a in prevtxids: data=tx_lookup(a[0]) address=data['vout'][a[1]]['scriptPubKey']['addresses'][0] #ONLY ONE ADDRESS PER OUTPUT!!! amount=data['vout'][a[1]]['value'] f={} f['address']=address f['amount']=amount f['txid']=a[0] answer['inputs'].append(f) else: answer['block']=prevtxids[0] return answer
def tx_inputs(txhash): txdata = tx_lookup(txhash) global prevtxidsq automatic = False txins = txdata['vin'] prevtxids = [] for x in txins: if 'txid' in x: #is normal transaction, not automatic block reward prevtxids.append([x['txid'], x['vout']]) else: height = node.connect('getblock', [txdata['blockhash']])['height'] prevtxids.append(height) automatic = True answer = {} if automatic == False: #who was the destination of that txid,outputn pair? answer['inputs'] = [] for a in prevtxids: data = tx_lookup(a[0]) address = data['vout'][a[1]]['scriptPubKey']['addresses'][ 0] #ONLY ONE ADDRESS PER OUTPUT!!! amount = data['vout'][a[1]]['value'] f = {} f['address'] = address f['amount'] = amount f['txid'] = a[0] answer['inputs'].append(f) else: answer['block'] = prevtxids[0] return answer
def blocks_outputs(blockend): lastblockprocessed=databases.dbexecute("SELECT * FROM META;",True) currentblock=node.connect('getblockcount',[]) if blockend>currentblock: blockend=currentblock for i in range(lastblockprocessed[0][0]+1,blockend+1): add_output_db(i) print "processed block "+str(i) databases.dbexecute("UPDATE META SET lastblockdone='"+str(i)+"';",False)
def more_blocks(moreblocks): currentblock=node.connect('getblockcount',[]) lastblockprocessed=databases.dbexecute("SELECT * FROM META;",True) nextblock=lastblockprocessed[0][0]+moreblocks if nextblock>currentblock: nextblock=currentblock for i in range(lastblockprocessed[0][0]+1, nextblock+1): try: output_db(i) print "processed block "+str(i) databases.dbexecute("UPDATE META SET lastblockdone='"+str(i)+"';",False) except: print "error updating db" elif nextblock<=currentblock: for i in range(lastblockprocessed[0][0]+1, nextblock+1): #try: output_db(i) print "processed block "+str(i) databases.dbexecute("UPDATE META SET lastblockdone='"+str(i)+"';",False)
def create_raw_tx(fromaddr, outs, fee): global ins, rawtx unspent=addresses.getunspent(fromaddr) ins=[] totaloutgoing=0 for out in outs: totaloutgoing=totaloutgoing+outs[out]*100000000 #IN SATOSHI totalin=0 for x in unspent: r={} r['txid']=x['tx_hash'] r['vout']=x['tx_output_n'] totalin=totalin+x['value'] #IN SATOSHI ins.append(r) difference=totalin-totaloutgoing-fee*100000000 outs['fromaddr']=difference/100000000.0 rawtx=node.connect('createrawtransaction',[ins,outs]) return rawtx
def pushtx_local(rawtx): print "Trying to push: " + str(rawtx) response = node.connect('sendrawtransaction', [rawtx]) print "Push Response was " + str(response) return response
def tx_lookup(txhash): print txhash c = node.connect('getrawtransaction', [txhash, 1]) return c
def getrawtx(txhash): txdata = node.connect('getrawtransaction', [txhash]) return txdata
def getblockmeta(n): #get hash of block at height n blockhash = node.connect('getblockhash', [n]) blockdata = node.connect('getblock', [blockhash]) return blockdata
def connectNodes(self, labelA, labelB): connect(self.nodes[labelA], self.nodes[labelB])
def pushtx(rawtx): print "Trying to push: "+ str(rawtx) response=node.connect('sendrawtransaction',[rawtx]) print "Push Response was "+str(response) return response
def get_current_block_localnode(): count = node.connect("getblockcount", []) return int(count)
def getblockcount(): count = node.connect("getblockcount", []) response = make_response(str(count), 200) response.headers['Access-Control-Allow-Origin'] = '*' return response
def getblockmeta(n): #get hash of block at height n blockhash=node.connect('getblockhash',[n]) blockdata=node.connect('getblock',[blockhash]) return blockdata
def getblockcount(): count=node.connect("getblockcount",[]) response=make_response(str(count), 200) response.headers['Access-Control-Allow-Origin']= '*' return response
def getrawtx(txhash): txdata=node.connect('getrawtransaction',[txhash]) return txdata
def tx_lookup(txhash): print txhash c=node.connect('getrawtransaction',[txhash,1]) return c
def get_current_block_localnode(): count=node.connect("getblockcount",[]) return int(count)
def pushtx(rawtx): response=node.connect('sendrawtransaction',[rawtx]) return response
def main(): """ Use: > python create_node.py -port 12346 [-dirIP '185.172.0.3' -dirPort 12345] """ directory_node_ip = None directory_node_port = None try: with open("config.json") as config_file: print("Loading Directory Node Info from 'config.json' file...") config = json.load(config_file) directory_node_ip = config['DIR_NODE_IP'] directory_node_port = config['DIR_NODE_PORT'] except FileNotFoundError: raise RuntimeWarning("'config.json' file not found") parser = argparse.ArgumentParser( description='Initialize a node in the onion_routing network.') parser.add_argument('-ip', action='store', dest='ip', type=str, default=socket.gethostname(), help='the ip to create the node on.') parser.add_argument('-port', action='store', dest='port', type=str, help='the port to create the node on.') parser.add_argument('-dirIP', action='store', dest='dirIP', type=str, default=directory_node_ip, help='the IP address of the Directory Node.') parser.add_argument('-dirPort', action='store', dest='dirPort', type=int, default=directory_node_port, help='the Port the Directory Node is listening on.') args = parser.parse_args() ip = args.ip port = int(args.port) print("Using Directory Node IP:", args.dirIP) print("Using Directory Node PORT:", args.dirPort) if args.port is None: raise RuntimeError("Invalid 'port' argument") print("Creating an Onion Node at ", ip, ":", port) node = OnionNode(ip, port) node.connect(directory_node_ip, int(directory_node_port)) node.start() while ("exit" not in input()): time.sleep(1) print("Closing Node") node.stop()