Skip to content

リアル・ワールド アセット

リアルワールド・アセット (RWAs) は,チェーン上で所有または制御が追跡されるオフチェーンの資産モデルである. Iroha では, RWA は生成された識別子,オーナーアカウント,数量,ビジネスメタデータ,起源,およびオプションライフサイクルコントロールを持つ登録レジスタンスです.

RWAs は,数値資産の余剰とは異なる.

  • 数値資産は,口座に保有されている浮動余分である
  • NFT は,単一の所有者による連鎖上の記録である.
  • RWA は,ビジネスメタデータ,数量,保有物,凍結,償還状態,出産,およびコントローラポリシーを搭載できるパットである.

RWAs を使えば,レジスタは単にフンギブルなバランスではなく,特定のチェーン外のロットを表示する必要がある.

RWA ロット

RWA ラットは以下のものを含む.

  • id:生成された法定識別子 RWA は, <hash>$<domain>として表示されます.
  • owned_by:現時点でパトルを保有する口座
  • quantity: 配合で表される残存量
  • spec:数値仕様,例えば10度スケール
  • primary_reference:主要連鎖外領収書,証明書,請求書,または登録参照
  • status:オプションの事業状況テキスト
  • metadata:ビジネス・コンテキストとインデックスに使用されるコンパクトのフィールド JSON
  • parents:この配合を抽出するために使用されたソース・ロット
  • controls:コントローラ口座,コントローラの役割,および有効なコントローラ操作
  • is_frozenheld_quantity:実行時間によって執行されるライフサイクル状態

チェーン上の用荷をコンパクトにしておく WSV の外に大きな法律文書,検査報告および監査パックを保管する それから,それを消化して URI, SoraFS 経路,または明示的な参照 RWA メタデータ

識別子

RegisterRwa は,呼び出し者によって選択された id を受け入れず, owner フィールドを認めない.トランザクション当局は初期 owned_by アカウントとなり,実行時間は目標ドメインで RwaId を生成する.

RWA ID のテキスト形式は,次のとおりです.

text
<generated-hash>$<domain>

例えば:

text
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef$commodities.universal

RwaEvent::Created,FindRwas, /v1/rwas,または取引のコミットメント後に設定された探査者経路から生成された RwaId を発見する際に,アプリケーションはその事業識別子を primary_reference または metadata に保管すべきである.

ライフサイクル

一般的な RWA ワークフローは,以下のとおりです.

作戦実行された行動
RegisterRwaドメインで生成された ID パットを作成し,取引権限は owned_by になります.
TransferRwa額を別のアカウントに移す.完全な転送は owned_by を変更することができます.部分的な転送では,生成された ID の子供ラウンドが作成されます.
HoldRwa備蓄量.設定されたコントローラーと hold_enabledが必要です.
ReleaseRwa設定されたコントローラーと hold_enabled を必要とする.
FreezeRwa設定されたコントローラーと freeze_enabled を必要とする.
UnfreezeRwa設定されたコントローラーと freeze_enabled を必要とする.
RedeemRwaredeem_enabledが真実である場合,所有者または管理者がそれを提出することができる.
MergeRwas同じドメインとスペックを持つ親 Lotの量を組み合わせ,生成した子供 Lotにします.
ForceTransferRwa制御器の流れを介して量移動する.設定された制御器と force_transfer_enabled を要求します.
SetRwaControlsパートコントロールのポリシーを交換する オーナーやコントローラが必要です
SetKeyValue<Rwa> / RemoveKeyValue<Rwa>パートメタデータを更新する. オーナーやコントローラを必要とする. 凍結されたパットにはコントローラーが必要です.

現行のコードには UnregisterRwa の指示はありません.表示された量は配送,消費,決済または他の方法で流通から取り除かれたとき,鎖外のパットを RedeemRwa で撤回します.

メタデータと制御

コンパクトな事実のためにメタデータを使用し,アプリケーションがパットを特定して検証するのを助けます:

  • 資産クラス,発行者,保管人,または登録参照
  • 倉庫,保管庫, ISIN,請求書または証明書の識別子
  • 証明書および法文書の内容ハッシュ
  • SoraFS より大きな証拠パネルのための経路またはマニュメント参照
  • オフチェーンサービスで使用される期限,管轄権,またはコンプライアンスタグ

実施された RwaControlPolicy には,以下のフィールドがあります.

json
{
  "controller_accounts": [],
  "controller_roles": [],
  "freeze_enabled": true,
  "hold_enabled": true,
  "force_transfer_enabled": false,
  "redeem_enabled": true
}

コントローラーアカウントと役割は,対応するブールフラッグによって有効化された操作のみを実行できます.現在のコントロールパイルロードにはコントローラーアイデンティティとオペレーションフラグが含まれています.転送許可リストおよび嵌まった transfersルールはこのパイルロードの外です.

APIs に関する質問,イベント

使用 FindRwas 登録されたリストへ RWA ライブアップデートが必要なアプリケーションは, Rwa データイベント 作成,所有者変更,分割,合併,代償,凍結,解凍,開催,リリース,強制移転,制御変更,およびメタデータ事件.

Torii は,そのルートファミリーが有効である場合, /v1/rwas/v1/rwas/query のようなチェーン状態の経路をさらし, /v1/explorer/rwas/v1/explorer/rwas/{rwa_id} などの探査者経路をさらにさらす.生成されたクライアントはノードによって暴露される正確な応答形よりも,ライブ /openapi 文書を好むべきである.

Taira で試してみてください

公開 Taira が現在 RWA 配分を登録しているかどうかを確認する:

bash
curl -fsS 'https://taira.sora.org/v1/rwas?limit=5' \
  | jq '{total, rwa_ids: [.items[].id]}'

ライブ Taira OpenAPI ドキュメントで暴露されている RWA ルートをリストする.

bash
curl -fsS https://taira.sora.org/openapi.json \
  | jq -r '.paths | keys[] | select(startswith("/v1/rwas") or startswith("/v1/explorer/rwas"))'

公開物件はまだ登録されていない場合,空き出力 items が予想されます.登録,移転,保持,凍結および償還は署名された取引です.

やってみよう

以下の例では, Python 共有セットアップ の SDK 表面を使用します.トランザクションを提出する前に,アカウント IDs,プライベートキー,および生成されたロット IDs を自分のネットワークからの値で置き換えます.

RWA API 経路を発見する

この読み込みのみの例では,実行中の Torii ノードに,アプリ向きの RWA ルートが有効になっていることを要求します.

python
from iroha_python import create_torii_client

client = create_torii_client("https://taira.sora.org")
openapi = client.request_json("GET", "/openapi", expected_status=(200,))

rwa_paths = sorted(
    path for path in openapi.get("paths", {}) if path.startswith("/v1/rwas")
)

for path in rwa_paths:
    print(path)

リストが空いている場合,ノードは依然として他の Torii APIs で RWA の指示と查询をサポートするが,選択的な JSON ルートファミリーを暴露していない.

倉庫領収書を登録する

ビジネス・アクションが1つの署名されたトランザクションになる場合,草案を使用します.事業領収書の番号は primary_reference;取引がコミットした後にレジスタ ID が生成されます.

python
from iroha_python import TransactionConfig, TransactionDraft

config = TransactionConfig(
    chain_id=CHAIN_ID,
    authority=alice,
    metadata={**TX_METADATA, "source": "rwa-docs"},
)

draft = TransactionDraft(config)
draft.register_rwa(
    {
        "domain": "commodities.universal",
        "quantity": "100",
        "spec": {"scale": 0},
        "primary_reference": "warehouse-receipt-001",
        "status": "active",
        "metadata": {
            "asset_class": "commodity",
            "commodity": "copper",
            "warehouse": "DXB-01",
            "inspection_report": "sorafs://reports/copper-001.json",
        },
        "parents": [],
        "controls": {
            "controller_accounts": [alice],
            "controller_roles": [],
            "freeze_enabled": True,
            "hold_enabled": True,
            "force_transfer_enabled": False,
            "redeem_enabled": True,
        },
    }
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

トランザクションのコミット後に,生成されたリスト RWA IDs. 鎖状態の経路は,聖典を暴露する IDs; イベントや探検器の詳細路線を使用します ID 戻る primary_reference またはメタデータ:

python
page = client.list_rwas_typed(limit=20, offset=0)

for lot in page.items:
    print(lot.id)

エクスプローラーが有効なノードは,より豊かな予測も返せる:

python
page = client.list_explorer_rwas_typed(domain="commodities.universal")

for lot in page.items:
    print(lot.id, lot.primary_reference, lot.owned_by, lot.quantity)

暫定 の 留守 を 持っ て 移転 する

生成された RWA ID この例では, alice 管理者であり,また制御器として構成されている hold_enabled.

python
warehouse_lot_id = (
    "0123456789abcdef0123456789abcdef"
    "0123456789abcdef0123456789abcdef$commodities.universal"
)

draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)

draft.transfer_rwa(warehouse_lot_id, quantity="10", destination=bob)
draft.hold_rwa(warehouse_lot_id, quantity="5")

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

チェーン外プロセスが成功した後, ReleaseRwa を提出する.

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.release_rwa(warehouse_lot_id, quantity="5")

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

制御と監査メタデータを追加する

コントロールとメタデータは別です. 管理者ポリシーにコントロールを使用し,アプリケーションまたは監査者が表示する必要がある事実にメタデータを使用します:

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)

draft.set_rwa_controls(
    warehouse_lot_id,
    {
        "controller_accounts": [alice],
        "controller_roles": [],
        "freeze_enabled": True,
        "hold_enabled": True,
        "force_transfer_enabled": True,
        "redeem_enabled": True,
    },
)
draft.set_rwa_key_value(warehouse_lot_id, "auditor", "alice")
draft.set_rwa_key_value(
    warehouse_lot_id,
    "proof_hash",
    "sha256:2b1c7a4e...",
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

償還または退職金量

RedeemRwa を提出する.代表されたチェーン外資産が交付,消費,退役,または他の方法で流通から取り除かれた後.これは永久に入荷した量をlottから引く.lottには redeem_enabled がなければならない.署名者は所有者またはコントローラである必要があります.

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.redeem_rwa(warehouse_lot_id, quantity="1")

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

遵守審査中に凍結する

FreezeRwaを提出すると,チェーン外のレビューが通常の所有者の業務を阻止しなければならない.署名者はコントローラーである必要があります. 配合品には freeze_enabledがある必要があります.

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.freeze_rwa(warehouse_lot_id)
draft.set_rwa_key_value(
    warehouse_lot_id,
    "review",
    {
        "status": "frozen",
        "reason": "custodian inventory check",
        "case_id": "OPS-2026-0042",
    },
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

UnfreezeRwa を,審査が通過した後で提出する.

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.unfreeze_rwa(warehouse_lot_id)
draft.set_rwa_key_value(
    warehouse_lot_id,
    "review",
    {"status": "cleared", "case_id": "OPS-2026-0042"},
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

請求書

請求書を RWA のラットとして表現し,請求書の番号を primary_reference と メタデータに保存する.登録後,転送および償還のために生成された ID を使用します.

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.register_rwa(
    {
        "domain": "receivables.universal",
        "quantity": "50000",
        "spec": {"scale": 2},
        "primary_reference": "INV-2026-0007",
        "status": "issued",
        "metadata": {
            "asset_class": "invoice",
            "currency": "USD",
            "debtor": "example-buyer",
            "due_date": "2026-06-30",
            "document_hash": "sha256:4df4c8...",
        },
        "parents": [],
        "controls": {
            "controller_accounts": [alice],
            "controller_roles": [],
            "freeze_enabled": True,
            "hold_enabled": False,
            "force_transfer_enabled": False,
            "redeem_enabled": True,
        },
    }
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

領収が資金調達または支払われる場合,生成された請求書 ID を使用する.

python
invoice_lot_id = (
    "fedcba9876543210fedcba9876543210"
    "fedcba9876543210fedcba9876543210$receivables.universal"
)

draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.transfer_rwa(invoice_lot_id, quantity="50000", destination=bob)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

チェーン外決済後に表示された金額を償う:

python
draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=bob, metadata=TX_METADATA)
)
draft.redeem_rwa(invoice_lot_id, quantity="50000")

envelope = draft.sign_with_keypair(bob_pair)
client.submit_transaction_envelope_and_wait(envelope)

炭素クレジット 退職金

RedeemRwa を提出し,請求された炭素クレジットを循環から削除する. チェーン外証明書またはレジストリ証明書をメタデータに保存します:

python
carbon_lot_id = (
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$carbon.universal"
)

draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.redeem_rwa(carbon_lot_id, quantity="250")
draft.set_rwa_key_value(
    carbon_lot_id,
    "retirement_certificate",
    "sorafs://certificates/carbon-credit-2026-001-retired.json",
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

二つを融合する

2つのオフチェーンのポジションが統合されたとき,ロットを合併する.両親は同じ領域にあり,同じ量スペックを使用しなければならない.実行時間は子供ロット ID を生成します.

python
warehouse_lot_id_2 = (
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb$commodities.universal"
)

draft = TransactionDraft(
    TransactionConfig(chain_id=CHAIN_ID, authority=alice, metadata=TX_METADATA)
)
draft.merge_rwas(
    {
        "parents": [
            {"rwa": warehouse_lot_id, "quantity": "40"},
            {"rwa": warehouse_lot_id_2, "quantity": "60"},
        ],
        "primary_reference": "warehouse-receipt-003",
        "status": "merged",
        "metadata": {
            "asset_class": "commodity",
            "commodity": "copper",
            "warehouse": "DXB-01",
            "merge_reason": "same custodian and quality grade",
        },
    }
)

envelope = draft.sign_with_keypair(alice_pair)
client.submit_transaction_envelope_and_wait(envelope)

Python 取引の完全な例については, Real-World Assetsを参照してください.