def update(self): x = ''.join( chain(str(self.author), str(self.index), [str(f) for f in self.froms], [str(f) for f in self.outs], [str(f) for f in self.outns], str(self.timestamp))) self.hash = cg.h(str(x)) return self.hash
def update(self): """Updates hash""" self.sort() h = ''.join([str(self.prevhash)] + [str(self.powhash)] + [str(t.hash) for t in self.txs] + [str(sc) for sc in self.contracts] + [str(e) for e in self.powminers] + [str(e) for e in self.pocminers]) self.h = cg.h(str(h))
def poc_mining(b, bch): """Proofs-of-capacity mining""" # miner[0] - n, miner[1] - miner's public key, miner[2] - xs miner has calculated miners = bch[-1].pocminers if len(miners) == 0: raise NoValidMinersError for i in range(len(miners)): miners[i] = [len(miners[i][2]) * 20 + miners[i][0]] + miners[i] miners.sort() try: i = ((int(bch[-1].txs[-1].hash) + int(bch[-1].txs[-2].hash)) % int(len(miners)**0.5))**2 except IndexError: raise TooLessTxsError i1 = i miner = miners[i] y = [((int(bch[-1].txs[-1].hash) * k + k)**k) % miner[1] for k in range(100)] v = True while v: for x, k in miner[3]: print(86, k, x, (int(cg.h(str(x + len(bch)))) + int(cg.h(str(miner[2])))) % miner[1], y[k], len(bch), miner[1]) if (int(cg.h(str(x + len(bch)))) + int(cg.h(str(miner[2])))) % miner[1] != y[k]: break else: v = False if v: miners.remove(miner) if i == i1: raise NoValidMinersError if i == len(bch): i = i - len(bch) + 1 miner = miners[i] y = [((int(bch[-1].txs[-1].hash) * i + i)**i) % miner[1] for i in range(100)] b.creators.append(miner[2]) b.update() return b
def poc_mine(n, bch, myaddr): xs = [] file = open('poc_mining.txt', 'w') file.close() file = open('poc_mining.txt', 'a') f = [] y = [((int(bch[-1].txs[-1].hash) * k + k)**k) % n for k in range(100)] for i in range(n): f.append( str((int(cg.h(str(i + len(bch)))) + int(cg.h(str(myaddr)))) % n) + '\n') file.writelines(f) file.close() with open('poc_mining.txt', 'r') as file: f = [int(i) for i in file.readlines()] for i in range(len(y)): try: xs.append([f.index(y[i]), i]) except: pass return xs
def validate_poc(bch, n): bl = bch[n] miners = bch[n - 1].pocminers if n < 0: n = len(bch) + n for i in range(len(miners)): miners[i] = [len(miners[i][2]) * 20 + miners[i][0]] + miners[i] miners.sort() print(bch[n - 1].txs) i = ((int(bch[n - 1].txs[-1].hash) + int(bch[n - 1].txs[-2].hash)) % int(len(miners)**0.5))**2 i1 = i miner = miners[i] y = [((int(bch[n - 1].txs[-1].hash) * k + k)**k) % miner[1] for k in range(100)] v = True while v: for p in miners[i][3]: x = p[0] k = p[1] if (int(cg.h(str(x + n))) + int(cg.h(str(miner[2])))) % miner[1] != y[k]: print(i, k, x, (int(cg.h(str(x + n))) + int(cg.h(str(miner[2])))) % miner[1], y[k], n, miner[1]) break else: v = False if v: miners.remove(miner) if i == i1: raise NoValidMinersError if i == len(bch): i = i - len(bch) + 1 miner = miners[i] y = [((int(bch[n - 1].txs[-1].hash) * i + i)**i) % miner[1] for i in range(100)] if not miners[i][2] == bl.creators[1]: return False return True
def calc_pow_hash(self): try: h = ''.join([str(self.timestamp), str(self.n), self.creators[0]]) except IndexError: h = ''.join([str(self.timestamp), str(self.n)]) return cg.h(str(h))