2018-10-15 23:16:43 +02:00
|
|
|
import asyncio
|
2018-07-10 06:30:13 +02:00
|
|
|
import logging
|
2018-06-12 17:53:29 +02:00
|
|
|
from binascii import unhexlify
|
|
|
|
|
2018-11-25 22:42:25 +01:00
|
|
|
from lbrynet.schema.validator import validate_claim_id
|
2018-11-09 20:02:03 +01:00
|
|
|
from torba.client.baseledger import BaseLedger
|
2018-09-17 22:31:44 +02:00
|
|
|
from lbrynet.schema.error import URIParseError
|
|
|
|
from lbrynet.schema.uri import parse_lbry_uri
|
2018-11-09 20:02:03 +01:00
|
|
|
from lbrynet.extras.wallet.dewies import dewies_to_lbc
|
|
|
|
from lbrynet.extras.wallet.resolve import Resolver
|
|
|
|
from lbrynet.extras.wallet.account import Account
|
|
|
|
from lbrynet.extras.wallet.network import Network
|
|
|
|
from lbrynet.extras.wallet.database import WalletDatabase
|
|
|
|
from lbrynet.extras.wallet.transaction import Transaction
|
|
|
|
from lbrynet.extras.wallet.header import Headers, UnvalidatedHeaders
|
2018-04-30 09:04:52 +02:00
|
|
|
|
|
|
|
|
2018-07-10 06:30:13 +02:00
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
2018-06-14 06:53:38 +02:00
|
|
|
class MainNetLedger(BaseLedger):
|
2018-06-12 17:53:29 +02:00
|
|
|
name = 'LBRY Credits'
|
|
|
|
symbol = 'LBC'
|
2018-06-14 06:53:38 +02:00
|
|
|
network_name = 'mainnet'
|
2018-06-12 17:53:29 +02:00
|
|
|
|
2018-10-15 23:16:43 +02:00
|
|
|
headers: Headers
|
|
|
|
|
2018-07-05 04:16:02 +02:00
|
|
|
account_class = Account
|
2018-06-12 17:53:29 +02:00
|
|
|
database_class = WalletDatabase
|
|
|
|
headers_class = Headers
|
|
|
|
network_class = Network
|
|
|
|
transaction_class = Transaction
|
|
|
|
|
2018-10-15 23:16:43 +02:00
|
|
|
secret_prefix = bytes((0x1c,))
|
|
|
|
pubkey_address_prefix = bytes((0x55,))
|
|
|
|
script_address_prefix = bytes((0x7a,))
|
2018-07-01 23:21:18 +02:00
|
|
|
extended_public_key_prefix = unhexlify('0488b21e')
|
|
|
|
extended_private_key_prefix = unhexlify('0488ade4')
|
2018-06-14 06:53:38 +02:00
|
|
|
|
|
|
|
max_target = 0x0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
|
|
|
genesis_hash = '9c89283ba0f3227f6c03b70216b9f665f0118d5e0fa729cedf4fb34d6a34f463'
|
|
|
|
genesis_bits = 0x1f00ffff
|
|
|
|
target_timespan = 150
|
|
|
|
|
2018-06-12 17:53:29 +02:00
|
|
|
default_fee_per_byte = 50
|
|
|
|
default_fee_per_name_char = 200000
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
2018-07-22 00:34:59 +02:00
|
|
|
super().__init__(*args, **kwargs)
|
2018-06-12 17:53:29 +02:00
|
|
|
self.fee_per_name_char = self.config.get('fee_per_name_char', self.default_fee_per_name_char)
|
|
|
|
|
2018-08-28 02:03:08 +02:00
|
|
|
@property
|
|
|
|
def resolver(self):
|
|
|
|
return Resolver(self.headers.claim_trie_root, self.headers.height, self.transaction_class,
|
|
|
|
hash160_to_address=self.hash160_to_address, network=self.network)
|
|
|
|
|
2018-10-15 23:16:43 +02:00
|
|
|
async def resolve(self, page, page_size, *uris):
|
2018-07-10 06:30:13 +02:00
|
|
|
for uri in uris:
|
|
|
|
try:
|
2018-11-25 22:42:25 +01:00
|
|
|
parsed_uri = parse_lbry_uri(uri)
|
|
|
|
if parsed_uri.claim_id:
|
|
|
|
validate_claim_id(parsed_uri.claim_id)
|
2018-07-10 06:30:13 +02:00
|
|
|
except URIParseError as err:
|
2018-10-15 23:16:43 +02:00
|
|
|
return {'error': err.args[0]}
|
2018-11-25 22:31:38 +01:00
|
|
|
except Exception as e:
|
|
|
|
return {'error': str(e)}
|
2018-11-25 22:42:25 +01:00
|
|
|
try:
|
2018-12-14 20:29:46 +01:00
|
|
|
resolver = self.resolver
|
2018-11-25 22:42:25 +01:00
|
|
|
resolutions = await self.network.get_values_for_uris(self.headers.hash().decode(), *uris)
|
2018-12-14 20:29:46 +01:00
|
|
|
return await resolver._handle_resolutions(resolutions, uris, page, page_size)
|
2018-11-25 22:42:25 +01:00
|
|
|
except Exception as e:
|
|
|
|
return {'error': str(e)}
|
2018-10-15 23:16:43 +02:00
|
|
|
|
|
|
|
async def get_claim_by_claim_id(self, claim_id):
|
|
|
|
result = (await self.network.get_claims_by_ids(claim_id)).pop(claim_id, {})
|
|
|
|
return await self.resolver.get_certificate_and_validate_result(result)
|
|
|
|
|
|
|
|
async def get_claim_by_outpoint(self, txid, nout):
|
|
|
|
claims = (await self.network.get_claims_in_tx(txid)) or []
|
2018-08-28 02:03:08 +02:00
|
|
|
for claim in claims:
|
|
|
|
if claim['nout'] == nout:
|
2018-10-15 23:16:43 +02:00
|
|
|
return await self.resolver.get_certificate_and_validate_result(claim)
|
2018-08-28 02:03:08 +02:00
|
|
|
return 'claim not found'
|
2018-06-12 17:53:29 +02:00
|
|
|
|
2018-10-15 23:16:43 +02:00
|
|
|
async def start(self):
|
|
|
|
await super().start()
|
|
|
|
await asyncio.gather(*(a.maybe_migrate_certificates() for a in self.accounts))
|
|
|
|
await asyncio.gather(*(a.save_max_gap() for a in self.accounts))
|
|
|
|
await self._report_state()
|
|
|
|
|
|
|
|
async def _report_state(self):
|
2018-10-12 23:11:47 +02:00
|
|
|
for account in self.accounts:
|
2018-10-15 23:16:43 +02:00
|
|
|
total_receiving = len((await account.receiving.get_addresses()))
|
|
|
|
total_change = len((await account.change.get_addresses()))
|
|
|
|
channel_count = await account.get_channel_count()
|
|
|
|
claim_count = await account.get_claim_count()
|
2018-11-07 14:39:13 +01:00
|
|
|
balance = dewies_to_lbc(await account.get_balance())
|
|
|
|
log.info("Loaded account %s with %s LBC, %d receiving addresses (gap: %d), "
|
|
|
|
"%d change addresses (gap: %d), %d channels, %d certificates and %d claims. ",
|
|
|
|
account.id, balance, total_receiving, account.receiving.gap, total_change, account.change.gap,
|
2018-10-12 23:11:47 +02:00
|
|
|
channel_count, len(account.certificates), claim_count)
|
2018-07-12 05:18:59 +02:00
|
|
|
|
2018-06-12 17:53:29 +02:00
|
|
|
|
2018-06-14 06:53:38 +02:00
|
|
|
class TestNetLedger(MainNetLedger):
|
2018-06-12 17:53:29 +02:00
|
|
|
network_name = 'testnet'
|
2018-10-15 23:16:43 +02:00
|
|
|
pubkey_address_prefix = bytes((111,))
|
|
|
|
script_address_prefix = bytes((196,))
|
2018-06-12 17:53:29 +02:00
|
|
|
extended_public_key_prefix = unhexlify('043587cf')
|
|
|
|
extended_private_key_prefix = unhexlify('04358394')
|
2018-04-30 09:04:52 +02:00
|
|
|
|
|
|
|
|
2018-06-14 06:53:38 +02:00
|
|
|
class RegTestLedger(MainNetLedger):
|
2018-06-12 17:53:29 +02:00
|
|
|
network_name = 'regtest'
|
2018-08-16 07:38:28 +02:00
|
|
|
headers_class = UnvalidatedHeaders
|
2018-10-15 23:16:43 +02:00
|
|
|
pubkey_address_prefix = bytes((111,))
|
|
|
|
script_address_prefix = bytes((196,))
|
2018-06-12 17:53:29 +02:00
|
|
|
extended_public_key_prefix = unhexlify('043587cf')
|
|
|
|
extended_private_key_prefix = unhexlify('04358394')
|
2018-04-30 09:04:52 +02:00
|
|
|
|
|
|
|
max_target = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
|
|
|
genesis_hash = '6e3fcf1299d4ec5d79c3a4c91d624a4acf9e2e173d95a1a0504f677669687556'
|
|
|
|
genesis_bits = 0x207fffff
|
|
|
|
target_timespan = 1
|