⛓️

HyperBEAM デバイスシステム詳細ガイド

に公開

HyperBEAM デバイスシステム詳細ガイド 🔧

このガイドでは、HyperBEAMの核心であるデバイスシステムについて詳しく解説します。デバイスの仕組み、各種デバイスの機能、カスタムデバイスの作成方法まで包括的にカバーします。

📚 目次

  1. デバイスシステムの概念
  2. デバイスの基本構造
  3. 主要デバイス詳細解説
  4. デバイス間の連携
  5. パス指定とルーティング
  6. カスタムデバイスの作成
  7. 実践的な使用例
  8. ベストプラクティス

デバイスシステムの概念

🎯 デバイスとは?

デバイスは、HyperBEAMとAO-Coreにおける機能的なユニットです。レゴブロックのように組み合わせて、複雑な分散システムを構築できます。

🏗️ デバイスの特徴

  1. 自己完結型: 各デバイスは独立して動作
  2. モジュラー: プラグイン式で追加・削除可能
  3. 専門化: 特定の機能に特化
  4. 分散対応: 複数ノード間での協調動作

📁 ファイル構造

HyperBEAM/
├── src/
│   ├── dev_lua.erl          # Luaデバイス
│   ├── dev_wasm.erl         # WebAssemblyデバイス
│   ├── dev_process.erl      # プロセス管理デバイス
│   ├── dev_scheduler.erl    # スケジューラデバイス
│   ├── dev_message.erl      # メッセージ操作デバイス
│   ├── dev_json_iface.erl   # JSON処理デバイス
│   ├── dev_meta.erl         # メタデータデバイス
│   └── dev_relay.erl        # リレーデバイス
└── docs/devices/
    ├── lua-at-5-3a.md       # Luaデバイス詳細
    ├── wasm64-at-1-0.md     # WASMデバイス詳細
    └── ...

デバイスの基本構造

🔧 必須関数(三本柱)

すべてのデバイスは以下の3つの関数を実装する必要があります:

-module(dev_example).
-export([info/1, init/3, compute/3]).

%% 1. info/1 - デバイス情報の提供
info(_) ->
    #{
        variant => <<"Example/1.0">>,      % デバイス名とバージョン
        exports => [compute, hello],       % エクスポート関数一覧
        excludes => [private_function],    % 除外関数
        default => fun compute/3           % デフォルトハンドラ
    }.

%% 2. init/3 - デバイスの初期化
init(BaseMessage, RequestMessage, Options) ->
    % 初期化処理
    ?event(info, device_initialized),
    {ok, BaseMessage#{<<"initialized">> => true}}.

%% 3. compute/3 - メイン処理
compute(BaseMessage, RequestMessage, Options) ->
    % 実際の処理ロジック
    Result = process_request(BaseMessage, RequestMessage),
    {ok, Result}.

📥 メッセージフロー


主要デバイス詳細解説

🐍 ~lua@5.3a デバイス

役割: Luaスクリプトの実行と管理

主要機能

% 使用可能な関数
Functions = [
    init,       % Lua環境初期化
    compute,    % Lua関数実行(デフォルト)
    snapshot,   % 現在の状態キャプチャ
    functions   % グローバル関数一覧取得
].

サンドボックス機能

-- 制限される関数(セキュリティのため)
io.*          -- ファイル入出力
os.execute    -- システムコマンド実行
require       -- モジュール読み込み

実用例

POST /MyProcess~process@1.0/schedule
Content-Type: application/json

{
  "Device": "process@1.0",
  "Execution-Device": "stack@1.0",
  "Execution-Stack": ["scheduler@1.0", "lua@5.3a"],
  "Script": "function balance() return 100 end"
}

🌐 ~wasm64@1.0 デバイス

役割: WebAssemblyバイナリの実行

ライフサイクル

設定例

% WASM プロセス定義
#{
    <<"Device">> => <<"process@1.0">>,
    <<"Execution-Device">> => <<"stack@1.0">>,
    <<"Execution-Stack">> => [<<"scheduler@1.0">>, <<"wasm64@1.0">>],
    <<"WASM-Image">> => <<"<WASMバイナリのTxID>">>
}

📊 ~process@1.0 デバイス

役割: プロセス管理とオーケストレーション

主要エンドポイント

# スケジュール確認
GET /<ProcessID>~process@1.0/schedule

# メッセージ追加
POST /<ProcessID>~process@1.0/schedule

# 状態計算
GET /<ProcessID>~process@1.0/compute/<Target>

# 最新状態
GET /<ProcessID>~process@1.0/now

プロセス定義例

{
  "Device": "process@1.0",
  "Scheduler-Device": "scheduler@1.0",
  "Execution-Device": "stack@1.0",
  "Execution-Stack": ["scheduler@1.0", "lua@5.3a"]
}

⏰ ~scheduler@1.0 デバイス

役割: メッセージのスケジューリングと順序管理

スロットシステム

スロット 0: [Message A] ← 最初に実行
スロット 1: [Message B]
スロット 2: [Message C]
...

主要機能

Functions = [
    schedule,   % 保留中のアサインメント一覧
    register,   % 新しいメッセージの登録
    next,       % 次のアサインメント取得
    slot        % 特定スロットの情報クエリ
].

💌 ~message@1.0 デバイス

役割: メッセージの操作と変換

基本操作

# キー値取得
GET /~message@1.0&hello=world&Key=Value/key
# 結果: "Value"

# キー設定(深いマージサポート)
GET /~message@1.0/set&user.name=Alice&user.age+integer=25

# キー一覧
GET /~message@1.0/keys

予約キー

ReservedKeys = [
    get,     % キー値取得(デフォルト)
    set,     % キー値設定
    remove,  % キー削除
    keys,    % 公開キー一覧
    id,      % メッセージID計算
    commit,  % コミット(署名)作成
    verify   % コミット検証
].

🔄 ~json@1.0 デバイス

役割: JSON形式でのデータシリアライゼーション

# メタデバイスの情報をJSON形式で取得
GET /~meta@1.0/info/~json@1.0/serialize

# プロセス状態をJSON形式で取得
GET /<ProcessID>~process@1.0/now/~json@1.0/serialize

📡 ~relay@1.0 デバイス

役割: 外部APIとの通信リレー

機能

# 同期HTTP要求
GET /~relay@1.0/call?method=GET&path=https://api.example.com/data

# 非同期HTTP要求
GET /~relay@1.0/cast?method=POST&path=https://webhook.example.com

🔍 ~meta@1.0 デバイス

役割: ノードのメタデータ管理

設定パラメータ

MetaConfig = #{
    port => 1984,                    % HTTPサーバーポート
    priv_wallet => "wallet.json",    % 秘密鍵ファイル
    operator => "node-operator",     % オペレーター名
    routes => [...],                 % ルーティングテーブル
    store => #{...}                  % ストレージ設定
}.

デバイス間の連携

🔗 スタック実行

デバイスは「スタック」として組み合わせて実行できます:

ExecutionStack = [
    "scheduler@1.0",  % 1. スケジューリング
    "lua@5.3a",       % 2. Lua実行
    "process@1.0"     % 3. プロセス管理
].

🛤️ HyperPATHチェーン

複数のデバイスを順次実行:

/<ProcessID>~process@1.0/compute/balance/~json@1.0/serialize

実行フロー:

  1. ~process@1.0 でプロセス処理
  2. /balance で残高データ取得
  3. ~json@1.0 でJSON形式に変換

🔄 メッセージ解決チェーン


パス指定とルーティング

🛣️ HyperPATH構造

https://node.example.com/<ProcessID>~device@version/function/subkey?params

構成要素:

  • ノードURL: node.example.com
  • プロセスID: <ProcessID>
  • デバイス指定: ~device@version
  • 関数名: /function
  • サブキー: /subkey
  • パラメータ: ?params

🎯 パス解決プロセス

🔤 型キャスティング

クエリパラメータで型を指定:

/~message@1.0&count+integer=42&items+list="a",1,"b"&flag+boolean=true/get
  • count+integer=42 → 整数 42
  • items+list="a",1,"b" → リスト ["a", 1, "b"]
  • flag+boolean=true → ブール値 true

カスタムデバイスの作成

📝 ステップ1: 基本構造の作成

-module(dev_calculator).
-export([info/1, init/3, add/3, multiply/3, factorial/3]).

info(_) ->
    #{
        variant => <<"Calculator/1.0">>,
        exports => [add, multiply, factorial],
        default => fun add/3
    }.

init(Base, _Req, _Opts) ->
    ?event(info, calculator_device_initialized),
    {ok, Base#{<<"calculator_ready">> => true}}.

🧮 ステップ2: 機能の実装

add(Base, Req, _Opts) ->
    A = hb_ao:get(<<"a">>, Req, 0),
    B = hb_ao:get(<<"b">>, Req, 0),
    Result = A + B,
    {ok, Base#{<<"result">> => Result}}.

multiply(Base, Req, _Opts) ->
    A = hb_ao:get(<<"a">>, Req, 1),
    B = hb_ao:get(<<"b">>, Req, 1),
    Result = A * B,
    {ok, Base#{<<"result">> => Result}}.

factorial(Base, Req, _Opts) ->
    N = hb_ao:get(<<"n">>, Req, 1),
    Result = calculate_factorial(N),
    {ok, Base#{<<"result">> => Result}}.

%% ヘルパー関数
calculate_factorial(0) -> 1;
calculate_factorial(N) when N > 0 -> N * calculate_factorial(N - 1).

🧪 ステップ3: テストの作成

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

add_test() ->
    Base = #{},
    Req = #{<<"a">> => 5, <<"b">> => 3},
    {ok, Result} = add(Base, Req, #{}),
    ?assertEqual(8, maps:get(<<"result">>, Result)).

factorial_test() ->
    Base = #{},
    Req = #{<<"n">> => 5},
    {ok, Result} = factorial(Base, Req, #{}),
    ?assertEqual(120, maps:get(<<"result">>, Result)).
-endif.

🚀 ステップ4: 使用例

# 足し算
GET /MyCalculator~calculator@1.0/add?a=10&b=5
# 結果: {"result": 15}

# 掛け算
GET /MyCalculator~calculator@1.0/multiply?a=6&b=7
# 結果: {"result": 42}

# 階乗
GET /MyCalculator~calculator@1.0/factorial?n=5
# 結果: {"result": 120}

実践的な使用例

🎮 ゲームロジック(Lua)

-- ゲーム状態管理
local game_state = {
    players = {},
    score = {},
    round = 1
}

function join_game(player_id)
    if not game_state.players[player_id] then
        game_state.players[player_id] = true
        game_state.score[player_id] = 0
        return "joined"
    end
    return "already_joined"
end

function get_score(player_id)
    return game_state.score[player_id] or 0
end

-- ハンドラー登録
Handlers.add("join", function(msg)
    local result = join_game(msg.From)
    Handlers.utils.reply(result)(msg)
end)

💰 トークンコントラクト(WASM)

// Rust で実装し、WASMにコンパイル
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Serialize, Deserialize)]
pub struct TokenState {
    balances: HashMap<String, u64>,
    total_supply: u64,
}

impl TokenState {
    pub fn transfer(&mut self, from: &str, to: &str, amount: u64) -> Result<(), String> {
        let from_balance = self.balances.get(from).copied().unwrap_or(0);
        
        if from_balance < amount {
            return Err("Insufficient balance".to_string());
        }
        
        self.balances.insert(from.to_string(), from_balance - amount);
        let to_balance = self.balances.get(to).copied().unwrap_or(0);
        self.balances.insert(to.to_string(), to_balance + amount);
        
        Ok(())
    }
}

📊 データ分析パイプライン

# ステップ1: データ取得
GET /DataPipeline~relay@1.0/call?method=GET&path=https://api.data.com/dataset

# ステップ2: データ処理(Lua)
POST /DataPipeline~process@1.0/schedule
{
  "Action": "process_data",
  "Script": "function process(data) return analyze(data) end"
}

# ステップ3: 結果のJSON化
GET /DataPipeline~process@1.0/now/result/~json@1.0/serialize

ベストプラクティス

🔒 セキュリティ

  1. サンドボックス活用

    % Luaでの危険な関数制限
    sandbox => true,
    restricted_functions => [io, os, require]
    
  2. 署名検証

    # 全レスポンスの暗号学的署名確認
    GET /~message@1.0/verify
    
  3. TEE検証

    # 信頼できる実行環境での確認
    GET /~snp@1.0/attestation
    

⚡ パフォーマンス

  1. 適切なキャッシュ

    % 頻繁にアクセスされるデータのキャッシュ
    cache_ttl => 300,  % 5分間
    
  2. スナップショット活用

    # 状態の効率的な復元
    GET /<ProcessID>~lua@5.3a/snapshot
    
  3. 並列処理

    % 複数デバイスでの作業分散
    ExecutionStack = ["device1@1.0", "device2@1.0"]
    

🧪 開発とテスト

  1. 小さく始める

    % 最小機能から実装
    exports => [hello]  % 最初は1つの関数から
    
  2. 十分なテスト

    -ifdef(TEST).
    % EUnitでの徹底的なテスト
    -endif.
    
  3. 既存コード学習

    # 既存のデバイス実装を研究
    grep -r "compute(" src/dev_*.erl
    

📚 学習リソース

  1. 公式ドキュメント: docs/devices/ 配下の各デバイス詳細
  2. ソースコード: src/dev_*.erl ファイルの実装例
  3. コミュニティ: 開発者チャンネルでの質問と議論

🎉 まとめ

HyperBEAMのデバイスシステムは:

  • モジュラー: レゴブロックのような組み合わせ可能性
  • 多様性: Lua、WASM、JSON、Process など豊富なデバイス
  • 拡張性: カスタムデバイスで独自機能を追加可能
  • 連携性: デバイス間での効率的な協調動作
  • 実用性: 実際のアプリケーション開発に即座に活用可能

このガイドを参考に、HyperBEAMデバイスシステムを活用した分散アプリケーション開発を始めてください!


このドキュメントは学習用であり、最新の情報については公式ドキュメントを参照してください。

Discussion