mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-09-01 09:45:18 +00:00
sadsadasdas
This commit is contained in:
parent
90c8e4450e
commit
b8aee9940d
1 changed files with 42 additions and 6 deletions
|
@ -177,7 +177,7 @@ class Blockchain(util.PrintError):
|
||||||
p = self.path()
|
p = self.path()
|
||||||
self._size = os.path.getsize(p)//HEADER_SIZE if os.path.exists(p) else 0
|
self._size = os.path.getsize(p)//HEADER_SIZE if os.path.exists(p) else 0
|
||||||
|
|
||||||
def verify_header(self, header: dict, prev_hash: str, target: int, expected_header_hash: str=None) -> None:
|
def verify_header(self, header: dict, prev_hash: str, target: int, bits: int, expected_header_hash: str=None) -> None:
|
||||||
_hash = hash_header(header)
|
_hash = hash_header(header)
|
||||||
if expected_header_hash and expected_header_hash != _hash:
|
if expected_header_hash and expected_header_hash != _hash:
|
||||||
raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash))
|
raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash))
|
||||||
|
@ -185,7 +185,6 @@ class Blockchain(util.PrintError):
|
||||||
raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash')))
|
raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash')))
|
||||||
if constants.net.TESTNET:
|
if constants.net.TESTNET:
|
||||||
return
|
return
|
||||||
bits = self.target_to_bits(target)
|
|
||||||
if bits != header.get('bits'):
|
if bits != header.get('bits'):
|
||||||
raise Exception("bits mismatch: %s vs %s" % (bits, header.get('bits')))
|
raise Exception("bits mismatch: %s vs %s" % (bits, header.get('bits')))
|
||||||
if int('0x' + _hash, 16) > target:
|
if int('0x' + _hash, 16) > target:
|
||||||
|
@ -195,7 +194,7 @@ class Blockchain(util.PrintError):
|
||||||
num = len(data) // HEADER_SIZE
|
num = len(data) // HEADER_SIZE
|
||||||
start_height = index * 2016
|
start_height = index * 2016
|
||||||
prev_hash = self.get_hash(start_height - 1)
|
prev_hash = self.get_hash(start_height - 1)
|
||||||
target = self.get_target(index-1)
|
bits, target = self.get_target2(index-1)
|
||||||
for i in range(num):
|
for i in range(num):
|
||||||
height = start_height + i
|
height = start_height + i
|
||||||
try:
|
try:
|
||||||
|
@ -204,7 +203,7 @@ class Blockchain(util.PrintError):
|
||||||
expected_header_hash = None
|
expected_header_hash = None
|
||||||
raw_header = data[i*HEADER_SIZE : (i+1)*HEADER_SIZE]
|
raw_header = data[i*HEADER_SIZE : (i+1)*HEADER_SIZE]
|
||||||
header = deserialize_header(raw_header, index*2016 + i)
|
header = deserialize_header(raw_header, index*2016 + i)
|
||||||
self.verify_header(header, prev_hash, target, expected_header_hash)
|
self.verify_header(header, prev_hash, target, bits, expected_header_hash)
|
||||||
prev_hash = hash_header(header)
|
prev_hash = hash_header(header)
|
||||||
|
|
||||||
def path(self):
|
def path(self):
|
||||||
|
@ -383,6 +382,43 @@ class Blockchain(util.PrintError):
|
||||||
bnNew = ArithUint256(self.MAX_TARGET)
|
bnNew = ArithUint256(self.MAX_TARGET)
|
||||||
return bnNew.GetCompact(), bnNew._value
|
return bnNew.GetCompact(), bnNew._value
|
||||||
|
|
||||||
|
def get_target2(self, index, chain='main'):
|
||||||
|
"""
|
||||||
|
this follows the calculations in lbrycrd/src/lbry.cpp
|
||||||
|
Returns: (bits, target)
|
||||||
|
"""
|
||||||
|
|
||||||
|
if index == 0:
|
||||||
|
return self.GENESIS_BITS, self.MAX_TARGET
|
||||||
|
first = self.read_header(index * 2016)
|
||||||
|
last = self.read_header(index * 2016 + 2015)
|
||||||
|
assert last is not None, "Last shouldn't be none"
|
||||||
|
# bits to target
|
||||||
|
bits = last.get('bits')
|
||||||
|
# print_error("Last bits: ", bits)
|
||||||
|
self.check_bits(bits)
|
||||||
|
|
||||||
|
# new target
|
||||||
|
nActualTimespan = last.get('timestamp') - first.get('timestamp')
|
||||||
|
nTargetTimespan = self.N_TARGET_TIMESPAN
|
||||||
|
nModulatedTimespan = nTargetTimespan - (nActualTimespan - nTargetTimespan) / 8
|
||||||
|
nMinTimespan = nTargetTimespan - (nTargetTimespan / 8)
|
||||||
|
nMaxTimespan = nTargetTimespan + (nTargetTimespan / 2)
|
||||||
|
if nModulatedTimespan < nMinTimespan:
|
||||||
|
nModulatedTimespan = nMinTimespan
|
||||||
|
elif nModulatedTimespan > nMaxTimespan:
|
||||||
|
nModulatedTimespan = nMaxTimespan
|
||||||
|
|
||||||
|
bnOld = ArithUint256.SetCompact(bits)
|
||||||
|
bnNew = bnOld * nModulatedTimespan
|
||||||
|
# this doesn't work if it is nTargetTimespan even though that
|
||||||
|
# is what it looks like it should be based on reading the code
|
||||||
|
# in lbry.cpp
|
||||||
|
bnNew /= nModulatedTimespan
|
||||||
|
if bnNew > self.MAX_TARGET:
|
||||||
|
bnNew = ArithUint256(self.MAX_TARGET)
|
||||||
|
return bnNew.GetCompact(), bnNew._value
|
||||||
|
|
||||||
def bits_to_target(self, bits: int) -> int:
|
def bits_to_target(self, bits: int) -> int:
|
||||||
bitsN = (bits >> 24) & 0xff
|
bitsN = (bits >> 24) & 0xff
|
||||||
if not (bitsN >= 0x03 and bitsN <= 0x1f):
|
if not (bitsN >= 0x03 and bitsN <= 0x1f):
|
||||||
|
@ -422,12 +458,12 @@ class Blockchain(util.PrintError):
|
||||||
return False
|
return False
|
||||||
self.print_error("4")
|
self.print_error("4")
|
||||||
try:
|
try:
|
||||||
target = self.get_target(height // 2016 - 1)
|
bits, target = self.get_target2(height // 2016 - 1)
|
||||||
except MissingHeader:
|
except MissingHeader:
|
||||||
return False
|
return False
|
||||||
self.print_error("5")
|
self.print_error("5")
|
||||||
try:
|
try:
|
||||||
self.verify_header(header, prev_hash, target)
|
self.verify_header(header, prev_hash, target, bits)
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
self.print_error(e)
|
self.print_error(e)
|
||||||
return False
|
return False
|
||||||
|
|
Loading…
Add table
Reference in a new issue