101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
from gzip import READ
|
|
from operator import truediv
|
|
from optparse import AmbiguousOptionError
|
|
|
|
REWARD_VALUE = 25.0
|
|
NORMAL = 0
|
|
REWARD = 1
|
|
|
|
from Signature import *
|
|
|
|
class Tx:
|
|
def __init__(self, type = NORMAL):
|
|
|
|
self.type = type
|
|
self.inputs = []
|
|
self.outputs = []
|
|
self.sigs = []
|
|
self.reqd = []
|
|
|
|
def add_input(self, from_addr, amount):
|
|
self.inputs.append((from_addr, amount))
|
|
|
|
def add_output(self, to_addr, amount):
|
|
self.outputs.append((to_addr, amount))
|
|
|
|
def add_reqd(self, addr):
|
|
self.reqd.append(addr)
|
|
|
|
def sign(self, private):
|
|
message = self.__gather()
|
|
newsig = sign(message, private)
|
|
self.sigs.append(newsig)
|
|
|
|
def is_valid(self):
|
|
|
|
if self.type == REWARD:
|
|
if len(self.inputs)!=0 and len(self.outputs)!=1:
|
|
return False
|
|
return True
|
|
|
|
else:
|
|
total_in = 0
|
|
total_out = 0
|
|
message = self.__gather()
|
|
for addr,amount in self.inputs:
|
|
found = False
|
|
for s in self.sigs:
|
|
if verify(message, s, addr):
|
|
found = True
|
|
if not found:
|
|
# print ("No good sig found for " + str(message))
|
|
return False
|
|
if amount < 0:
|
|
return False
|
|
total_in = total_in + amount
|
|
for addr in self.reqd:
|
|
found = False
|
|
for s in self.sigs:
|
|
if verify(message, s, addr):
|
|
found = True
|
|
if not found:
|
|
return False
|
|
for addr,amount in self.outputs:
|
|
if amount < 0:
|
|
return False
|
|
total_out = total_out + amount
|
|
|
|
if total_out > total_in:
|
|
# print("Outputs exceed inputs")
|
|
return False
|
|
return True
|
|
|
|
def __gather(self):
|
|
data=[]
|
|
data.append(self.inputs)
|
|
data.append(self.outputs)
|
|
data.append(self.reqd)
|
|
return data
|
|
|
|
def __repr__(self):
|
|
|
|
repr_str = "INPUTS:\n"
|
|
for addr, amt in self.inputs:
|
|
repr_str = repr_str + str(amt) + "from" + str(addr) + "\n"
|
|
|
|
repr_str += "OUTPUTS:\n"
|
|
for addr, amt in self.outputs:
|
|
repr_str = repr_str + str(amt) + "to" + str(addr) + "\n"
|
|
|
|
repr_str += "EXTRA REQUIRED SIGNATURES:\n"
|
|
for req_sig in self.reqd:
|
|
repr_str = repr_str + str(req_sig) + "\n"
|
|
|
|
repr_str += "SIGNATURES:\n"
|
|
for sig in self.sigs:
|
|
repr_str = repr_str + str(sig) + "\n"
|
|
|
|
repr_str += "END\n"
|
|
|
|
return repr_str
|