scripts/ reorganization: - Sort 14 loose root scripts into subfolders: blockchain/ (genesis, proposer, mock chain, testnet BTC) dev/ (CLI wrapper, dev services, OpenAPI gen, systemd setup, domain proxy) ops/ (coordinator proxy, remote tunnel) gpu/ (miner workflow) - Merge scripts/testing/ into scripts/test/ (eliminate duplicate folder) - Create scripts/examples/ for usage demos and simulations Root-level cleanup: - Move home/ (12 simulation scripts) → scripts/examples/ - Move dev-utils/ (2 files) → scripts/dev/ - Move protocols/receipts/sample → tests/fixtures/ - Delete stale src/ (duplicate of apps/blockchain-node/src/) - Remove empty home/, dev-utils/, protocols/ directories Documentation updates: - Update docs/6_architecture/8_codebase-structure.md tree and table - Update root README.md tree to reflect new structure
75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Simple test for block import endpoint without transactions
|
|
"""
|
|
|
|
import json
|
|
import hashlib
|
|
import requests
|
|
|
|
BASE_URL = "https://aitbc.bubuit.net/rpc"
|
|
CHAIN_ID = "ait-devnet"
|
|
|
|
def compute_block_hash(height, parent_hash, timestamp):
|
|
"""Compute block hash using the same algorithm as PoA proposer"""
|
|
payload = f"{CHAIN_ID}|{height}|{parent_hash}|{timestamp}".encode()
|
|
return "0x" + hashlib.sha256(payload).hexdigest()
|
|
|
|
def test_simple_block_import():
|
|
"""Test importing a simple block without transactions"""
|
|
|
|
print("Testing Simple Block Import")
|
|
print("=" * 40)
|
|
|
|
# Get current head
|
|
response = requests.get(f"{BASE_URL}/head")
|
|
head = response.json()
|
|
print(f"Current head: height={head['height']}, hash={head['hash']}")
|
|
|
|
# Create a new block
|
|
height = head["height"] + 1
|
|
parent_hash = head["hash"]
|
|
timestamp = "2026-01-29T10:20:00"
|
|
block_hash = compute_block_hash(height, parent_hash, timestamp)
|
|
|
|
print(f"\nCreating test block:")
|
|
print(f" height: {height}")
|
|
print(f" parent_hash: {parent_hash}")
|
|
print(f" hash: {block_hash}")
|
|
|
|
# Import the block
|
|
response = requests.post(
|
|
f"{BASE_URL}/blocks/import",
|
|
json={
|
|
"height": height,
|
|
"hash": block_hash,
|
|
"parent_hash": parent_hash,
|
|
"proposer": "test-proposer",
|
|
"timestamp": timestamp,
|
|
"tx_count": 0
|
|
}
|
|
)
|
|
|
|
print(f"\nImport response:")
|
|
print(f" Status: {response.status_code}")
|
|
print(f" Body: {response.json()}")
|
|
|
|
if response.status_code == 200:
|
|
print("\n✅ Block imported successfully!")
|
|
|
|
# Verify the block was imported
|
|
response = requests.get(f"{BASE_URL}/blocks/{height}")
|
|
if response.status_code == 200:
|
|
imported = response.json()
|
|
print(f"\n✅ Verified imported block:")
|
|
print(f" height: {imported['height']}")
|
|
print(f" hash: {imported['hash']}")
|
|
print(f" proposer: {imported['proposer']}")
|
|
else:
|
|
print(f"\n❌ Could not retrieve imported block: {response.status_code}")
|
|
else:
|
|
print(f"\n❌ Import failed: {response.status_code}")
|
|
|
|
if __name__ == "__main__":
|
|
test_simple_block_import()
|