Skip to main content

Blockchain Integration Solution

Connect directly to the Provenance blockchain with NUVA Labs' comprehensive blockchain integration APIs. This solution covers everything from node connectivity to transaction broadcasting and event monitoring.

Overview

The Blockchain Integration solution provides APIs for:

  • Node Connectivity: Connect to blockchain nodes
  • Transaction Broadcasting: Send transactions to the network
  • Event Monitoring: Monitor blockchain events in real-time
  • Consensus Participation: Participate in network consensus
  • Blockchain Data Access: Access raw blockchain data

Key Features

🔗 Node Connectivity

  • Connect to multiple blockchain nodes
  • Load balancing and failover
  • Connection health monitoring
  • Automatic reconnection

📡 Transaction Broadcasting

  • Send transactions to the network
  • Transaction status tracking
  • Confirmation monitoring
  • Error handling and retries

👁️ Event Monitoring

  • Real-time blockchain event monitoring
  • Custom event filtering
  • Event history and replay
  • WebSocket event streams

🏗️ Consensus Participation

  • Validator node management
  • Staking and delegation
  • Governance participation
  • Network health monitoring

Quick Start

1. Connect to Blockchain

import { NUClient } from '@nu/sdk';

const client = new NUClient({
clientId: process.env.NU_CLIENT_ID,
clientSecret: process.env.NU_CLIENT_SECRET,
environment: 'production',
});

await client.authenticate();

// Connect to blockchain
const connection = await client.connectToBlockchain({
nodeUrl: 'https://pio-mainnet-1-rpc.provlabs.com',
timeout: 30000,
});

console.log('Connected to blockchain:', connection.nodeInfo);

2. Broadcast Transaction

// Create and broadcast transaction
const transaction = await client.broadcastTransaction({
type: 'transfer',
from: 'acc_1234567890',
to: 'acc_0987654321',
amount: 100,
assetId: 'asset_1234567890',
memo: 'Payment',
});

console.log('Transaction broadcasted:', transaction.txHash);

3. Monitor Events

// Monitor blockchain events
const ws = client.createBlockchainWebSocket();

ws.on('newBlock', (block) => {
console.log('New block:', block.height);
});

ws.on('transactionConfirmed', (tx) => {
console.log('Transaction confirmed:', tx.txHash);
});

ws.on('validatorUpdate', (validator) => {
console.log('Validator update:', validator.address);
});

API Reference

Blockchain Integration Endpoints

EndpointMethodDescription
/blockchain/connectPOSTConnect to blockchain
/blockchain/statusGETGet blockchain status
/blockchain/broadcastPOSTBroadcast transaction
/blockchain/eventsGETGet event history
/blockchain/subscribePOSTSubscribe to events

Node Connectivity

Connect to Node

const connection = await client.connectToBlockchain({
nodeUrl: 'https://pio-mainnet-1-rpc.provlabs.com',
timeout: 30000,
retries: 3,
});

console.log('Node info:', connection.nodeInfo);
console.log('Network:', connection.network);
console.log('Chain ID:', connection.chainId);

Get Node Status

const status = await client.getBlockchainStatus();
console.log('Sync status:', status.syncInfo);
console.log('Validator info:', status.validatorInfo);
console.log('Network info:', status.networkInfo);

Health Check

const health = await client.getBlockchainHealth();
console.log('Node health:', health.status);
console.log('Uptime:', health.uptime);
console.log('Last block:', health.lastBlockTime);

Transaction Broadcasting

Broadcast Transaction

const result = await client.broadcastTransaction({
type: 'transfer',
from: 'acc_1234567890',
to: 'acc_0987654321',
amount: 100,
assetId: 'asset_1234567890',
memo: 'Payment',
});

console.log('Transaction hash:', result.txHash);
console.log('Block height:', result.blockHeight);
console.log('Gas used:', result.gasUsed);

Check Transaction Status

const status = await client.getTransactionStatus('tx_1234567890');
console.log('Status:', status.status);
console.log('Confirmations:', status.confirmations);
console.log('Block height:', status.blockHeight);

Get Transaction Details

const tx = await client.getTransaction('tx_1234567890');
console.log('Transaction details:', tx);
console.log('Events:', tx.events);
console.log('Logs:', tx.logs);

Event Monitoring

Subscribe to Events

// Subscribe to specific events
await client.subscribeToEvents({
events: ['newBlock', 'transactionConfirmed', 'validatorUpdate'],
filters: {
blockHeight: { $gte: 1000000 },
},
});

Get Event History

const events = await client.getEventHistory({
eventType: 'newBlock',
startBlock: 1000000,
endBlock: 1000100,
limit: 100,
});

console.log('Events found:', events.length);

Real-time Event Stream

const ws = client.createBlockchainWebSocket();

ws.on('newBlock', (block) => {
console.log('New block:', block.height, block.hash);
});

ws.on('transactionConfirmed', (tx) => {
console.log('Transaction confirmed:', tx.txHash);
});

ws.on('validatorUpdate', (validator) => {
console.log('Validator update:', validator.address);
});

Consensus Participation

Get Validator Info

const validator = await client.getValidator('val_1234567890');
console.log('Validator address:', validator.address);
console.log('Voting power:', validator.votingPower);
console.log('Commission:', validator.commission);

Get Validator Set

const validators = await client.getValidatorSet();
console.log('Total validators:', validators.length);
console.log(
'Active validators:',
validators.filter((v) => v.status === 'active').length
);

Get Staking Info

const staking = await client.getStakingInfo('acc_1234567890');
console.log('Delegated amount:', staking.delegated);
console.log('Rewards:', staking.rewards);
console.log('Unbonding:', staking.unbonding);

Advanced Features

Multi-Node Connection

const connections = await client.connectToMultipleNodes([
'https://pio-mainnet-1-rpc.provlabs.com',
'https://pio-mainnet-2-rpc.provlabs.com',
'https://pio-mainnet-3-rpc.provlabs.com',
]);

console.log('Connected to', connections.length, 'nodes');

Transaction Batching

const batch = await client.broadcastTransactionBatch([
{
type: 'transfer',
from: 'acc_1234567890',
to: 'acc_0987654321',
amount: 100,
},
{
type: 'transfer',
from: 'acc_1234567890',
to: 'acc_1122334455',
amount: 50,
},
]);

console.log('Batch broadcasted:', batch.txHashes);

Custom Event Filters

const events = await client.getEventHistory({
eventType: 'transactionConfirmed',
filters: {
amount: { $gte: 1000 },
assetId: 'asset_1234567890',
timestamp: { $gte: '2024-01-01' },
},
});

Use Cases

1. Blockchain Monitor

class BlockchainMonitor {
constructor(client) {
this.client = client;
}

async startMonitoring() {
const ws = this.client.createBlockchainWebSocket();

ws.on('newBlock', (block) => {
console.log(`New block: ${block.height} at ${block.timestamp}`);
});

ws.on('transactionConfirmed', (tx) => {
console.log(`Transaction confirmed: ${tx.txHash}`);
});

ws.on('validatorUpdate', (validator) => {
console.log(`Validator update: ${validator.address}`);
});
}
}

2. Transaction Tracker

class TransactionTracker {
constructor(client) {
this.client = client;
}

async trackTransaction(txHash) {
const status = await this.client.getTransactionStatus(txHash);

if (status.status === 'confirmed') {
console.log('Transaction confirmed!');
return status;
} else if (status.status === 'failed') {
console.log('Transaction failed:', status.error);
return status;
} else {
// Still pending, check again later
setTimeout(() => this.trackTransaction(txHash), 5000);
}
}
}

3. Validator Monitor

class ValidatorMonitor {
constructor(client) {
this.client = client;
}

async monitorValidators() {
const validators = await this.client.getValidatorSet();

validators.forEach((validator) => {
console.log(`Validator: ${validator.address}`);
console.log(` Voting Power: ${validator.votingPower}`);
console.log(` Commission: ${validator.commission}%`);
console.log(` Status: ${validator.status}`);
});
}
}

Best Practices

1. Connection Management

  • Use connection pooling for multiple requests
  • Implement proper error handling and retries
  • Monitor connection health regularly
  • Handle network interruptions gracefully

2. Transaction Broadcasting

  • Validate transactions before broadcasting
  • Implement proper error handling
  • Monitor transaction status
  • Handle confirmation requirements

3. Event Monitoring

  • Use appropriate event filters
  • Implement proper error handling
  • Handle connection drops gracefully
  • Monitor subscription limits

4. Performance

  • Use batch operations when possible
  • Implement proper caching
  • Monitor API usage
  • Use compression for large datasets

Error Handling

Common Errors

try {
const result = await client.broadcastTransaction(txData);
} catch (error) {
switch (error.code) {
case 'INVALID_TRANSACTION':
console.error('Invalid transaction data');
break;
case 'INSUFFICIENT_FUNDS':
console.error('Insufficient funds for transaction');
break;
case 'NETWORK_ERROR':
console.error('Network connection error');
break;
case 'TIMEOUT':
console.error('Transaction timeout');
break;
default:
console.error('Unexpected error:', error.message);
}
}

Integration Examples

React Blockchain Component

import React, { useState, useEffect } from 'react';
import { NUClient } from '@nu/sdk';

function BlockchainStatus() {
const [status, setStatus] = useState(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
const client = new NUClient({
clientId: process.env.REACT_APP_NU_CLIENT_ID,
clientSecret: process.env.REACT_APP_NU_CLIENT_SECRET,
environment: 'production',
});

const loadStatus = async () => {
try {
await client.authenticate();
const blockchainStatus = await client.getBlockchainStatus();
setStatus(blockchainStatus);
} catch (error) {
console.error('Failed to load blockchain status:', error);
} finally {
setLoading(false);
}
};

loadStatus();
}, []);

if (loading) return <div>Loading blockchain status...</div>;

return (
<div>
<h2>Blockchain Status</h2>
<div>
<p>Network: {status?.network}</p>
<p>Block Height: {status?.latestBlockHeight}</p>
<p>Chain ID: {status?.chainId}</p>
</div>
</div>
);
}

Next Steps


Ready to start building? Let's explore our API Reference for complete endpoint documentation!