XDai blockchain support

pull/615/head
kompotkot 2022-05-24 08:21:53 +00:00
rodzic 311c627af8
commit 942eca1330
3 zmienionych plików z 36 dodań i 8 usunięć

Wyświetl plik

@ -11,6 +11,9 @@ from moonstreamdb.models import (
PolygonBlock, PolygonBlock,
PolygonLabel, PolygonLabel,
PolygonTransaction, PolygonTransaction,
XDaiBlock,
XDaiLabel,
XDaiTransaction,
) )
from psycopg2.errors import UniqueViolation # type: ignore from psycopg2.errors import UniqueViolation # type: ignore
from sqlalchemy import Column, desc, func from sqlalchemy import Column, desc, func
@ -28,6 +31,7 @@ from .settings import (
MOONSTREAM_CRAWL_WORKERS, MOONSTREAM_CRAWL_WORKERS,
MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI, MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI,
MOONSTREAM_POLYGON_WEB3_PROVIDER_URI, MOONSTREAM_POLYGON_WEB3_PROVIDER_URI,
MOONSTREAM_XDAI_WEB3_PROVIDER_URI,
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -62,6 +66,8 @@ def connect(
web3_uri = MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI web3_uri = MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI
elif blockchain_type == AvailableBlockchainType.POLYGON: elif blockchain_type == AvailableBlockchainType.POLYGON:
web3_uri = MOONSTREAM_POLYGON_WEB3_PROVIDER_URI web3_uri = MOONSTREAM_POLYGON_WEB3_PROVIDER_URI
elif blockchain_type == AvailableBlockchainType.XDAI:
web3_uri = MOONSTREAM_XDAI_WEB3_PROVIDER_URI
else: else:
raise Exception("Wrong blockchain type provided for web3 URI") raise Exception("Wrong blockchain type provided for web3 URI")
@ -91,6 +97,8 @@ def get_block_model(
block_model = EthereumBlock block_model = EthereumBlock
elif blockchain_type == AvailableBlockchainType.POLYGON: elif blockchain_type == AvailableBlockchainType.POLYGON:
block_model = PolygonBlock block_model = PolygonBlock
elif blockchain_type == AvailableBlockchainType.XDAI:
block_model = XDaiBlock
else: else:
raise Exception("Unsupported blockchain type provided") raise Exception("Unsupported blockchain type provided")
@ -109,6 +117,8 @@ def get_label_model(
label_model = EthereumLabel label_model = EthereumLabel
elif blockchain_type == AvailableBlockchainType.POLYGON: elif blockchain_type == AvailableBlockchainType.POLYGON:
label_model = PolygonLabel label_model = PolygonLabel
elif blockchain_type == AvailableBlockchainType.XDAI:
label_model = XDaiLabel
else: else:
raise Exception("Unsupported blockchain type provided") raise Exception("Unsupported blockchain type provided")
@ -127,6 +137,8 @@ def get_transaction_model(
transaction_model = EthereumTransaction transaction_model = EthereumTransaction
elif blockchain_type == AvailableBlockchainType.POLYGON: elif blockchain_type == AvailableBlockchainType.POLYGON:
transaction_model = PolygonTransaction transaction_model = PolygonTransaction
elif blockchain_type == AvailableBlockchainType.XDAI:
transaction_model = XDaiTransaction
else: else:
raise Exception("Unsupported blockchain type provided") raise Exception("Unsupported blockchain type provided")
@ -138,27 +150,27 @@ def add_block(db_session, block: Any, blockchain_type: AvailableBlockchainType)
Add block if doesn't presented in database. Add block if doesn't presented in database.
block: web3.types.BlockData block: web3.types.BlockData
- BlockData.extraData - doesn't exist at Polygon mainnet
- Nonce - doesn't exist at XDai blockchain
""" """
block_model = get_block_model(blockchain_type) block_model = get_block_model(blockchain_type)
# BlockData.extraData doesn't exist at Polygon mainnet
extra_data = None
if block.get("extraData", None) is not None:
extra_data = block.get("extraData").hex()
block_obj = block_model( block_obj = block_model(
block_number=block.number, block_number=block.number,
difficulty=block.difficulty, difficulty=block.difficulty,
extra_data=extra_data, extra_data=None
if block.get("extraData", None) is None
else block.get("extraData").hex(),
gas_limit=block.gasLimit, gas_limit=block.gasLimit,
gas_used=block.gasUsed, gas_used=block.gasUsed,
base_fee_per_gas=block.get("baseFeePerGas", None), base_fee_per_gas=block.get("baseFeePerGas", None),
hash=block.hash.hex(), hash=block.hash.hex(),
logs_bloom=block.logsBloom.hex(), logs_bloom=block.logsBloom.hex(),
miner=block.miner, miner=block.miner,
nonce=block.nonce.hex(), nonce=None if block.get("nonce", None) is None else block.get("nonce").hex(),
parent_hash=block.parentHash.hex(), parent_hash=block.parentHash.hex(),
receipt_root=block.get("receiptRoot", ""), receipt_root=block.get("receiptsRoot", ""),
uncles=block.sha3Uncles.hex(), uncles=block.sha3Uncles.hex(),
size=block.size, size=block.size,
state_root=block.stateRoot.hex(), state_root=block.stateRoot.hex(),
@ -166,6 +178,11 @@ def add_block(db_session, block: Any, blockchain_type: AvailableBlockchainType)
total_difficulty=block.totalDifficulty, total_difficulty=block.totalDifficulty,
transactions_root=block.transactionsRoot.hex(), transactions_root=block.transactionsRoot.hex(),
) )
if blockchain_type == AvailableBlockchainType.XDAI:
block_obj.author = block.author
block_obj.signature = block.signature
block_obj.step = block.step
db_session.add(block_obj) db_session.add(block_obj)
@ -194,6 +211,9 @@ def add_block_transactions(
transaction_type=int(tx["type"], 0) if tx["type"] is not None else None, transaction_type=int(tx["type"], 0) if tx["type"] is not None else None,
value=tx.value, value=tx.value,
) )
if blockchain_type == AvailableBlockchainType.XDAI:
tx_obj.data = tx.data
db_session.add(tx_obj) db_session.add(tx_obj)

Wyświetl plik

@ -9,6 +9,7 @@ from pydantic import BaseModel, Field
class AvailableBlockchainType(Enum): class AvailableBlockchainType(Enum):
ETHEREUM = "ethereum" ETHEREUM = "ethereum"
POLYGON = "polygon" POLYGON = "polygon"
XDAI = "xdai"
class StatsUpdateRequest(BaseModel): class StatsUpdateRequest(BaseModel):

Wyświetl plik

@ -37,12 +37,19 @@ MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI = os.environ.get(
) )
if MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI == "": if MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI == "":
raise Exception("MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI env variable is not set") raise Exception("MOONSTREAM_ETHEREUM_WEB3_PROVIDER_URI env variable is not set")
MOONSTREAM_POLYGON_WEB3_PROVIDER_URI = os.environ.get( MOONSTREAM_POLYGON_WEB3_PROVIDER_URI = os.environ.get(
"MOONSTREAM_POLYGON_WEB3_PROVIDER_URI", "" "MOONSTREAM_POLYGON_WEB3_PROVIDER_URI", ""
) )
if MOONSTREAM_POLYGON_WEB3_PROVIDER_URI == "": if MOONSTREAM_POLYGON_WEB3_PROVIDER_URI == "":
raise Exception("MOONSTREAM_POLYGON_WEB3_PROVIDER_URI env variable is not set") raise Exception("MOONSTREAM_POLYGON_WEB3_PROVIDER_URI env variable is not set")
MOONSTREAM_XDAI_WEB3_PROVIDER_URI = os.environ.get(
"MOONSTREAM_XDAI_WEB3_PROVIDER_URI", ""
)
if MOONSTREAM_XDAI_WEB3_PROVIDER_URI == "":
raise Exception("MOONSTREAM_XDAI_WEB3_PROVIDER_URI env variable is not set")
MOONSTREAM_CRAWL_WORKERS = 4 MOONSTREAM_CRAWL_WORKERS = 4
MOONSTREAM_CRAWL_WORKERS_RAW = os.environ.get("MOONSTREAM_CRAWL_WORKERS") MOONSTREAM_CRAWL_WORKERS_RAW = os.environ.get("MOONSTREAM_CRAWL_WORKERS")
try: try: