Some checks failed
API Endpoint Tests / test-api-endpoints (push) Successful in 15s
Blockchain Synchronization Verification / sync-verification (push) Failing after 1s
CLI Tests / test-cli (push) Failing after 5s
Cross-Chain Functionality Tests / test-cross-chain-sync (push) Successful in 3s
Cross-Chain Functionality Tests / test-cross-chain-transactions (push) Successful in 4s
Cross-Chain Functionality Tests / test-cross-chain-bridge (push) Has been skipped
Cross-Chain Functionality Tests / test-multi-chain-consensus (push) Successful in 3s
Cross-Chain Functionality Tests / aggregate-results (push) Has been skipped
Cross-Node Transaction Testing / transaction-test (push) Successful in 12s
Deploy to Testnet / deploy-testnet (push) Successful in 1m12s
Documentation Validation / validate-docs (push) Successful in 11s
Documentation Validation / validate-policies-strict (push) Successful in 6s
Integration Tests / test-service-integration (push) Successful in 2m39s
Multi-Node Blockchain Health Monitoring / health-check (push) Successful in 2s
Multi-Node Stress Testing / stress-test (push) Successful in 2s
Node Failover Simulation / failover-test (push) Successful in 2s
P2P Network Verification / p2p-verification (push) Successful in 2s
Package Tests / Python package - aitbc-agent-sdk (push) Failing after 30s
Package Tests / Python package - aitbc-core (push) Successful in 14s
Package Tests / Python package - aitbc-crypto (push) Successful in 8s
Package Tests / Python package - aitbc-sdk (push) Successful in 9s
Package Tests / JavaScript package - aitbc-sdk-js (push) Successful in 7s
Package Tests / JavaScript package - aitbc-token (push) Successful in 19s
Python Tests / test-python (push) Successful in 14s
Security Scanning / security-scan (push) Failing after 31s
Deploy to Testnet / notify-deployment (push) Successful in 2s
116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Complete miner workflow - poll for jobs and assign proposer
|
||
"""
|
||
|
||
import httpx
|
||
import json
|
||
import time
|
||
from datetime import datetime
|
||
|
||
# Configuration
|
||
COORDINATOR_URL = "http://localhost:8011"
|
||
MINER_API_KEY = "${MINER_API_KEY}"
|
||
MINER_ID = "localhost-gpu-miner"
|
||
|
||
def poll_and_accept_job():
|
||
"""Poll for a job and accept it"""
|
||
print("🔍 Polling for jobs...")
|
||
|
||
with httpx.Client() as client:
|
||
# Poll for a job
|
||
response = client.post(
|
||
f"{COORDINATOR_URL}/v1/miners/poll",
|
||
headers={
|
||
"Content-Type": "application/json",
|
||
"X-Api-Key": MINER_API_KEY
|
||
},
|
||
json={"max_wait_seconds": 5}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
job = response.json()
|
||
print(f"✅ Received job: {job['job_id']}")
|
||
print(f" Task: {job['payload'].get('task', 'unknown')}")
|
||
|
||
# Simulate processing
|
||
print("⚙️ Processing job...")
|
||
time.sleep(2)
|
||
|
||
# Submit result
|
||
result_data = {
|
||
"result": {
|
||
"status": "completed",
|
||
"output": f"Job {job['job_id']} completed successfully",
|
||
"execution_time_ms": 2000,
|
||
"miner_id": MINER_ID
|
||
},
|
||
"metrics": {
|
||
"compute_time": 2.0,
|
||
"energy_used": 0.1
|
||
}
|
||
}
|
||
|
||
print(f"📤 Submitting result for job {job['job_id']}...")
|
||
result_response = client.post(
|
||
f"{COORDINATOR_URL}/v1/miners/{job['job_id']}/result",
|
||
headers={
|
||
"Content-Type": "application/json",
|
||
"X-Api-Key": MINER_API_KEY
|
||
},
|
||
json=result_data
|
||
)
|
||
|
||
if result_response.status_code == 200:
|
||
print("✅ Result submitted successfully!")
|
||
return job['job_id']
|
||
else:
|
||
print(f"❌ Failed to submit result: {result_response.status_code}")
|
||
print(f" Response: {result_response.text}")
|
||
return None
|
||
|
||
elif response.status_code == 204:
|
||
print("ℹ️ No jobs available")
|
||
return None
|
||
else:
|
||
print(f"❌ Failed to poll: {response.status_code}")
|
||
return None
|
||
|
||
def check_block_proposer(job_id):
|
||
"""Check if the block now has a proposer"""
|
||
print(f"\n🔍 Checking proposer for job {job_id}...")
|
||
|
||
with httpx.Client() as client:
|
||
response = client.get(f"{COORDINATOR_URL}/v1/explorer/blocks")
|
||
|
||
if response.status_code == 200:
|
||
blocks = response.json()
|
||
for block in blocks['items']:
|
||
if block['hash'] == job_id:
|
||
print(f"📦 Block Info:")
|
||
print(f" Height: {block['height']}")
|
||
print(f" Hash: {block['hash']}")
|
||
print(f" Proposer: {block['proposer']}")
|
||
print(f" Time: {block['timestamp']}")
|
||
return block
|
||
return None
|
||
|
||
def main():
|
||
print("⛏️ AITBC Miner Workflow Demo")
|
||
print(f" Miner ID: {MINER_ID}")
|
||
print(f" Coordinator: {COORDINATOR_URL}")
|
||
print()
|
||
|
||
# Poll and accept a job
|
||
job_id = poll_and_accept_job()
|
||
|
||
if job_id:
|
||
# Check if the block has a proposer now
|
||
time.sleep(1) # Give the server a moment to update
|
||
check_block_proposer(job_id)
|
||
else:
|
||
print("\n💡 Tip: Create a job first using example_client_remote.py")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|