⛓️
HyperBEAM デバイスシステム詳細ガイド
HyperBEAM デバイスシステム詳細ガイド 🔧
このガイドでは、HyperBEAMの核心であるデバイスシステムについて詳しく解説します。デバイスの仕組み、各種デバイスの機能、カスタムデバイスの作成方法まで包括的にカバーします。
📚 目次
デバイスシステムの概念
🎯 デバイスとは?
デバイスは、HyperBEAMとAO-Coreにおける機能的なユニットです。レゴブロックのように組み合わせて、複雑な分散システムを構築できます。
🏗️ デバイスの特徴
- 自己完結型: 各デバイスは独立して動作
- モジュラー: プラグイン式で追加・削除可能
- 専門化: 特定の機能に特化
- 分散対応: 複数ノード間での協調動作
📁 ファイル構造
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
実行フロー:
-
~process@1.0
でプロセス処理 -
/balance
で残高データ取得 -
~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
ベストプラクティス
🔒 セキュリティ
-
サンドボックス活用
% Luaでの危険な関数制限 sandbox => true, restricted_functions => [io, os, require]
-
署名検証
# 全レスポンスの暗号学的署名確認 GET /~message@1.0/verify
-
TEE検証
# 信頼できる実行環境での確認 GET /~snp@1.0/attestation
⚡ パフォーマンス
-
適切なキャッシュ
% 頻繁にアクセスされるデータのキャッシュ cache_ttl => 300, % 5分間
-
スナップショット活用
# 状態の効率的な復元 GET /<ProcessID>~lua@5.3a/snapshot
-
並列処理
% 複数デバイスでの作業分散 ExecutionStack = ["device1@1.0", "device2@1.0"]
🧪 開発とテスト
-
小さく始める
% 最小機能から実装 exports => [hello] % 最初は1つの関数から
-
十分なテスト
-ifdef(TEST). % EUnitでの徹底的なテスト -endif.
-
既存コード学習
# 既存のデバイス実装を研究 grep -r "compute(" src/dev_*.erl
📚 学習リソース
-
公式ドキュメント:
docs/devices/
配下の各デバイス詳細 -
ソースコード:
src/dev_*.erl
ファイルの実装例 - コミュニティ: 開発者チャンネルでの質問と議論
🎉 まとめ
HyperBEAMのデバイスシステムは:
- モジュラー: レゴブロックのような組み合わせ可能性
- 多様性: Lua、WASM、JSON、Process など豊富なデバイス
- 拡張性: カスタムデバイスで独自機能を追加可能
- 連携性: デバイス間での効率的な協調動作
- 実用性: 実際のアプリケーション開発に即座に活用可能
このガイドを参考に、HyperBEAMデバイスシステムを活用した分散アプリケーション開発を始めてください!
このドキュメントは学習用であり、最新の情報については公式ドキュメントを参照してください。
Discussion