Building MultiVM dApp

Details are provisional and may be updated during development.

Choosing the Optimal VM for Each Component

The key to maximizing performance on Arichain is understanding the strengths of each virtual machine and routing workloads accordingly.

Use EVM for:

  • Complex state management and data structures

  • Integration with existing DeFi protocols and libraries

  • Governance and compliance requirements

  • Rich smart contract interactions

  • Mature tooling and debugging capabilities

Use SVM for:

  • High-frequency operations (>1000 TPS requirements)

  • Real-time gaming and interactive applications

  • Simple but frequent transactions (payments, transfers)

  • Parallel processing requirements

  • Predictable cost structures

Performance Optimization Patterns

// Pattern 1: Route by Operation Type
class OptimizedTradingDApp {
    constructor() {
        this.evmProvider = new ethers.JsonRpcProvider(EVM_RPC);
        this.svmConnection = new Connection(SVM_RPC);
        this.arichain = new ArichainClient({ evmRpc: EVM_RPC, svmRpc: SVM_RPC });
    }
    
    async executeTrade(tradeParams) {
        // Route based on trade characteristics
        if (tradeParams.isHighFrequency && tradeParams.isSimple) {
            // Use SVM for high-frequency simple trades
            return this.executeOnSVM(tradeParams);
        } else if (tradeParams.requiresComplexLogic) {
            // Use EVM for complex DeFi integrations
            return this.executeOnEVM(tradeParams);
        } else {
            // Use unified approach for hybrid trades
            return this.executeHybridTrade(tradeParams);
        }
    }
    
    async executeHybridTrade(params) {
        // Step 1: Complex calculation on EVM
        const calculation = await this.evmContract.calculateOptimalRoute(params);
        
        // Step 2: High-speed execution on SVM
        const execution = await this.svmProgram.methods
            .executeCalculatedTrade(calculation)
            .rpc();
        
        // Step 3: Unified result tracking
        return this.arichain.trackTradeResult(calculation.id, execution);
    }
}

// Pattern 2: Batch Operations for Efficiency
class BatchOptimizedDApp {
    async processBatchOperations(operations) {
        // Group operations by VM for optimal batching
        const evmOps = operations.filter(op => op.complexity === 'high');
        const svmOps = operations.filter(op => op.frequency === 'high');
        
        // Execute batches in parallel
        const [evmResults, svmResults] = await Promise.all([
            this.executeBatchOnEVM(evmOps),
            this.executeBatchOnSVM(svmOps)
        ]);
        
        // Combine results with unified interface
        return this.arichain.combineResults(evmResults, svmResults);
    }
}

Gas Optimization Strategies

// EVM Gas Optimization (same as Ethereum)
contract GasOptimizedContract {
    // Use packed structs for storage efficiency
    struct PackedData {
        uint128 value1;
        uint128 value2;
        bool flag;
    }
    
    // Batch operations to reduce transaction costs
    function batchUpdate(uint256[] calldata ids, uint256[] calldata values) external {
        require(ids.length == values.length, "Length mismatch");
        
        for (uint256 i = 0; i < ids.length; i++) {
            // Update multiple values in single transaction
            _updateValue(ids[i], values[i]);
        }
    }
}

// SVM Compute Optimization (same as Solana)
#[program]
pub mod compute_optimized {
    pub fn batch_process(
        ctx: Context<BatchProcess>,
        operations: Vec<Operation>
    ) -> Result<()> {
        // Process multiple operations in single transaction
        // to minimize compute unit usage
        for operation in operations.iter() {
            process_single_operation(ctx.accounts, operation)?;
        }
        Ok(())
    }
}

Real-World Examples

Example 1: Hybrid Gaming Platform

A gaming platform that maximizes performance by using SVM for real-time gameplay and EVM for complex economic systems.

// SVM: Real-time game logic (high performance required)
#[program]
pub mod realtime_game {
    pub fn process_player_action(
        ctx: Context<ProcessAction>,
        action: PlayerAction,
        timestamp: i64
    ) -> Result<()> {
        let game_state = &mut ctx.accounts.game_state;
        
        // Process action with sub-second latency
        match action {
            PlayerAction::Move { x, y } => {
                // Update position instantly
                game_state.player_position = Position { x, y };
                game_state.last_action_time = timestamp;
            },
            PlayerAction::Attack { target_id } => {
                // Process attack with parallel execution
                process_attack(game_state, target_id, timestamp)?;
            }
        }
        
        // Emit real-time event
        emit!(PlayerActionProcessed {
            player_id: ctx.accounts.player.key(),
            action,
            timestamp
        });
        
        Ok(())
    }
}
// EVM: Complex economic system (rich libraries needed)
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract GameEconomy is ERC20, Ownable {
    using SafeMath for uint256;
    
    struct PlayerEconomics {
        uint256 totalEarnings;
        uint256 investmentLevel;
        uint256 lastRewardTime;
        mapping(address => uint256) tokenBalances;
    }
    
    mapping(address => PlayerEconomics) public playerEconomics;
    
    function calculateComplexReward(
        address player,
        uint256 gameScore,
        uint256 timePlayed
    ) external returns (uint256 reward) {
        PlayerEconomics storage playerEcon = playerEconomics[player];
        
        // Complex reward calculation using battle-tested libraries
        uint256 baseReward = gameScore.mul(REWARD_MULTIPLIER);
        uint256 timeBonus = calculateTimeBonus(timePlayed);
        uint256 investmentBonus = calculateInvestmentBonus(playerEcon.investmentLevel);
        
        reward = baseReward.add(timeBonus).add(investmentBonus);
        
        // Update player economics
        playerEcon.totalEarnings = playerEcon.totalEarnings.add(reward);
        playerEcon.lastRewardTime = block.timestamp;
        
        // Mint reward tokens
        _mint(player, reward);
        
        emit RewardCalculated(player, gameScore, reward);
    }
}
// Client: Unified gaming experience
class HybridGameClient {
    constructor() {
        // SVM for real-time operations
        this.svmConnection = new Connection('https://svm-rpc.arichain.network (TBD)');
        this.gameProgram = new Program(gameIdl, gameProgramId, { 
            connection: this.svmConnection 
        });
        
        // EVM for economic operations
        this.evmProvider = new ethers.JsonRpcProvider('https://evm-rpc.arichain.network (TBD)');
        this.economyContract = new ethers.Contract(economyAddress, economyAbi, this.evmProvider);
        
        // Unified data layer
        this.arichain = new ArichainClient({
            evmRpc: 'https://evm-rpc.arichain.network (TBD)',
            svmRpc: 'https://svm-rpc.arichain.network (TBD)'
        });
    }
    
    async processGameSession(playerId, gameActions) {
        const startTime = Date.now();
        
        // Real-time game processing on SVM
        const gameResults = [];
        for (const action of gameActions) {
            const result = await this.gameProgram.methods
                .processPlayerAction(action, Date.now())
                .accounts({
                    player: playerId,
                    gameState: gameStateAccount
                })
                .rpc();
                
            gameResults.push(result);
        }
        
        const endTime = Date.now();
        const totalScore = gameResults.reduce((sum, result) => sum + result.score, 0);
        
        // Complex reward calculation on EVM
        const rewardTx = await this.economyContract.calculateComplexReward(
            playerId,
            totalScore,
            endTime - startTime
        );
        
        // Unified result tracking
        const sessionResult = await this.arichain.trackGameSession({
            playerId,
            gameResults,
            economicResult: rewardTx,
            totalScore,
            duration: endTime - startTime
        });
        
        return sessionResult;
    }
    
    async getPlayerStatus(playerId) {
        // Get unified player data across both VMs
        const [gameStats, economicStats] = await Promise.all([
            this.gameProgram.account.playerStats.fetch(playerId),
            this.economyContract.playerEconomics(playerId)
        ]);
        
        return {
            ...gameStats,
            ...economicStats,
            totalAssets: await this.arichain.getUnifiedAssets(playerId)
        };
    }
}

Example 2: High-Performance DeFi with Real-Time Components

A DeFi protocol that uses EVM for complex financial logic and SVM for high-frequency trading operations.

// EVM: Complex DeFi protocol logic
contract LiquidityProtocol {
    using SafeMath for uint256;
    
    function calculateOptimalLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint256 slippage
    ) external view returns (
        uint256 optimalAmountA,
        uint256 optimalAmountB,
        uint256 expectedLiquidity
    ) {
        // Complex calculations using battle-tested DeFi libraries
        IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(tokenA, tokenB));
        (uint256 reserveA, uint256 reserveB,) = pair.getReserves();
        
        // Sophisticated optimization algorithms
        (optimalAmountA, optimalAmountB) = calculateOptimalAmounts(
            amountA, amountB, reserveA, reserveB, slippage
        );
        
        expectedLiquidity = calculateExpectedLiquidity(
            optimalAmountA, optimalAmountB, pair.totalSupply()
        );
    }
}
// SVM: High-frequency trading execution
#[program]
pub mod hft_execution {
    pub fn execute_optimal_trade(
        ctx: Context<ExecuteTrade>,
        trade_params: OptimalTradeParams
    ) -> Result<()> {
        let trading_state = &mut ctx.accounts.trading_state;
        
        // High-frequency execution with parallel processing
        for trade in trade_params.trades.iter() {
            // Execute trades with minimal latency
            execute_single_trade(
                ctx.accounts,
                trade,
                &mut trading_state.liquidity_pool
            )?;
        }
        
        // Update state atomically
        trading_state.last_execution_time = Clock::get()?.unix_timestamp;
        trading_state.total_volume = trading_state.total_volume
            .checked_add(trade_params.total_volume)
            .unwrap();
        
        Ok(())
    }
}

App Examples

Starter Templates

We provide comprehensive starter templates that demonstrate best practices for MultiVM development.

# EVM Starter Template
npx create-arichain-app my-defi-app --template evm-defi
cd my-defi-app
npm install
npm run deploy:arichain

# SVM Starter Template  
npx create-arichain-app my-game-app --template svm-game
cd my-game-app
anchor build
anchor deploy --provider.cluster arichain

# Hybrid Template
npx create-arichain-app my-hybrid-app --template multivm-hybrid
cd my-hybrid-app
npm run setup:multivm
npm run deploy:both

Complete Example Applications

1. MultiVM DEX Template

  • EVM contracts for complex AMM logic

  • SVM programs for high-frequency order matching

  • Unified frontend with cross-VM asset management

2. GameFi Platform Template

  • SVM programs for real-time gameplay

  • EVM contracts for NFT marketplace and governance

  • Cross-VM asset transfers and unified wallet integration

3. Payment Processing Template

  • SVM programs for high-throughput payments

  • EVM contracts for complex settlement logic

  • Real-time transaction monitoring across both VMs

Last updated