რეალური აქტივები
რეალურ სამყაროში აქტივები (RWAs) მოდელის off-chain აქტივები, რომელთა საკუთრება ან კონტროლი თვალსაზრისით მიმდინარეობს ჯაჭვზე. Iroha, RWA არის დარეგისტრირებული ლიდერის პარტია გენერირებული იდენტიფიკატორი, მფლობელის ანგარიში, რაოდენობა, ბიზნეს მეტადატალიკა, წარმოშობა და ვარიანტული სიცოცხლის ციკლის კონტროლი.
RWAs განსხვავდება ციფრული აქტივების ბალანსებისგან:
- ციფრული აქტივი არის ანგარიშის მიერ განთავსებული ფუნგებადი ბალანსი.
- NFT არის უნიკალური ჩანაწერი ერთ მფლობელთან ერთად ქსელში.
- RWA არის პარტია, რომელსაც შეუძლია მოიტანოს ბიზნესის მეტა მონაცემები, რაოდენობა, შენახვა, გაყინვა, გამოსყიდვის მდგომარეობა, წარმომავლობა და კონტროლერის პოლიტიკა
გამოიყენეთ RWAs მაშინ, როდესაც მთავარ წიგნს უნდა წარმოადგენდეს კონკრეტული პარტია ჯაჭვის გარეთ, ნაცვლად მხოლოდ ფუნგებადი ბალანსისა.
RWA ობიექტი
RWA პარტიის შემცველია:
id: წარმოქმნილი კანონიკური RWA იდენტიფიკატორი, რომელიც აღინიშნება როგორც<hash>$<domain>owned_by: ანგარიში, რომელიც ამჟამად პარტიის მფლობელიაquantity: პარტიის მიერ წარმოდგენილი გამოტანილი რაოდენობაspec: რაოდენობის სპეციფიკა, მაგალითად დეციმალური მასშტაბიprimary_reference: ძირითადი საკრედიტო ქვითრის, სერტიფიკატის, ანგარიშსწორების ან რეესტრის მითითებაstatus: ვაკანსიური ბიზნეს სტატუსის ტექსტიmetadata: კომპაქტური JSON ველები, რომლებიც გამოიყენება ბიზნეს კონტექსტისა და ინდექსირებისთვის.parents: ამ პარტიის მოსაპოვებლად გამოყენებული წყარო პარტებიcontrols: კონტროლის ანგარიშები, კონტროლის როლები და კონტროლის ოპერაციების ჩართვაis_frozenდაheld_quantity: სასიცოცხლო ციკლის მდგომარეობა, რომელიც გათვალისწინებულია გამშვებ დროით.
შეინახეთ ჯაჭვზე არსებული სასარგებლო ტვირთის კომპაქტი. შენახეთ დიდი სამართლებრივი დოკუმენტები, ინსპექტირების ანგარიშები და აუდიტის ბუნდები WSV-ს გარეთ, შემდეგ მოათავსეთ დიგესტი, URI, SoraFS გზა ან მანიფესტური რეფერენცია RWA მეტადატებში.
იდენტიფიკატორები
RegisterRwa არ იღებს დამრეკლის მიერ არჩეულ id სფეროს და არ იღებს owner ველს. ოპერაციული ორგანო ხდება საწყისი owned_by ანგარიში, ხოლო გამშვები დრო წარმოქმნის მიზნობრივ დომენში RwaId.
RWA ID ფორმის ტექსტი შემდეგია:
<generated-hash>$<domain>მაგალითად:
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef$commodities.universalაპლიკაციები უნდა შეინახონ თავიანთი ბიზნეს-იდენტიფიკატორი primary_reference ან metadata, შემდეგ აღმოაჩინონ წარმოქმნილი RwaId RwaEvent::Created, FindRwas, /v1/rwas, ან მკვლევარის მარშრუტი, რომელიც განისაზღვრება ტრანზაქციის დაკავების შემდეგ.
სიცოცხლის ციკლი
საერთო RWA სამუშაო პროცესები მოიცავს:
| ოპერაცია | განხორციელებული ქცევა |
|---|---|
RegisterRwa | შეიქმნას გენერირებული ID პარტია დომენში; ტრანზაქციის ავტორიტეტი ხდება owned_by. |
TransferRwa | გადაიტანეთ რაოდენობა სხვა ანგარიშზე. სრული ტრანსფერი შეიძლება შეიცვალოს owned_by. ნაწილობრივი ტრანსფერით შეიქმნება ცალკე საბავშვო პარტია გამომუშავებული ID. |
HoldRwa | სათადარიგო რაოდენობა. საჭიროებს კონფიგურირებულ მმართველს და hold_enabled. |
ReleaseRwa | ავიცილეთ დაკავებული რაოდენობა. საჭიროა კონფიგურირებული კონტროლერი და hold_enabled. |
FreezeRwa | ჩვეულებრივი მფლობელის ოპერაციების დაბლოკვა. საჭიროებს კონფიგურირებულ კონტროლერს და freeze_enabled. |
UnfreezeRwa | რეაბილიტაცია ჩვეულებრივი მფლობელის ოპერაციების. საჭიროებს კონფიგურირებულ კონტროლერს და freeze_enabled. |
RedeemRwa | მუდმივად ამოიღეთ რაოდენობა მიმოქცევადან. პატრონს ან კონტროლერს შეუძლია წარუდგინოს ეს ინფორმაცია, როდესაც redeem_enabled არის ჭეშმარიტი |
MergeRwas | შეაერთეთ მშობლიური პარტიების რაოდენობა იმავე დომენით და სპეციფიკაციით წარმოქმნილი ბავშვის პარტიად. |
ForceTransferRwa | გადაადგილება რაოდენობა კონტროლერის ნაკადის მეშვეობით. მოითხოვს კონფიგურირებული კონტროლერი და force_transfer_enabled. |
SetRwaControls | ოჲეაპვრთნარ ჟჲ ოპვჟრგჲრწნთკა. ვ რპწბგა ეა ჟვ ოპვჟრგყპნა მფლობელმა ან კონტროლორმა. |
SetKeyValue<Rwa> / RemoveKeyValue<Rwa> | განახლება პარტიის მეტა მონაცემები. მოითხოვს მფლობელს ან კონტროლერს; გაყინული პარტიები საჭიროებს კონტროლერს. |
ამჟამინდელ კოდში არ არის მითითება UnregisterRwa. ამოიღეთ off-chain პარტია RedeemRwa მაშინ, როდესაც წარმოდგენილი რაოდენობა მიწოდებულია, მოიხმარა, დარეგულირდა ან სხვაგვარად ამოღებულია ბრუნვისგან.
მეტა მონაცემები და კონტროლი
გამოიყენეთ მეტა მონაცემები კომპაქტური ფაქტებისათვის, რომლებიც ხელს შეუწყობს აპლიკაციების მიერ პარტიის იდენტიფიცირებისა და შემოწმებისას:
- აქტივების კლასის, ემიტენტის, მფლობელის ან რეესტრის მითითება
- საწყობის, საფონდის, ISIN, ანგარიშის ან სერტიფიკატის იდენტიფიცირების მონაცემები
- შინაარსის ჰაშები ატესტაციებისა და სამართლებრივი დოკუმენტებისათვის
- SoraFS გზები ან მანიფესტური რეფერენციები უფრო დიდი მტკიცებულებების ბუნდებისთვის
- ვადა, იურისდიქციის ან შესაბამისობის ეტიკეტები, რომლებიც გამოიყენება არაფარგლებში არსებული სერვისების მიერ
განხორციელებულ RwaControlPolicy-ში მოცემულია შემდეგი ველები:
{
"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 პარტიები:
curl -fsS 'https://taira.sora.org/v1/rwas?limit=5' \
| jq '{total, rwa_ids: [.items[].id]}'ჩამოთვალეთ RWA მარშრუტები, რომლებიც განთავსებულია ცოცხალი Taira OpenAPI დოკუმენტის მიხედვით:
curl -fsS https://taira.sora.org/openapi.json \
| jq -r '.paths | keys[] | select(startswith("/v1/rwas") or startswith("/v1/explorer/rwas"))'ცარიელი items გამოშვება მოსალოდნელია, როდესაც საჯარო პარტიები ჯერ არ არის დარეგისტრირებული. რეგისტრაცია, გადაცემა, შენახვა, გაყინვა და გამოსასყიდი ხელმოწერილია ოპერაციები.
სცადე.
ქვემოთ მოცემული მაგალითები იყენებს Python SDK ზედაპირებს Share Setup. შეცვალეთ ანგარიში IDs, კერძო გასაღებები და გენერირებული პარტია IDs საკუთარი ქსელის ღირებულებებით ტრანზაქციის წარდგენის წინ.
აღმოაჩინეთ RWA API მარშრუტები
აღნიშნული მხოლოდ წაკითხვის მაგალითი ითხოვს მიმდინარე Torii კვანძს, რომელ აპლიკაციის მიმართულებით RWA მარშრუტებიც არის ჩართული:
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)თუ ჩამონათვალი ცარიელია, კვანძში შეიძლება კვლავ იყოს RWA ინსტრუქციების და შეკითხვების მხარდაჭერა სხვა Torii APIs საშუალებით, მაგრამ იგი არ გამოავლინებს ვარიანტულ JSON მარშრუტის ოჯახს.
დარეგისტრირეთ საწყობში მიღებული ქვითარი
გამოიყენეთ პროექტი, როდესაც ერთი ბიზნეს აქცია უნდა გახდეს ერთი ხელმოწერილი ოპერაცია. საწარმოო ქვითრის ნომერი შედის primary_reference; მთავარ წიგნს ID წარმოადგენს ტრანზაქციის დადების შემდეგ.
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; გამოიყენეთ მოვლენების ან Explorer დეტალური მარშრუტები, როდესაც თქვენ უნდა შეესაბამოთ ID დაბრუნება primary_reference ან მეტადატანი:
page = client.list_rwas_typed(limit=20, offset=0)
for lot in page.items:
print(lot.id)Explorer-ის ჩართულმა კვანძებმა ასევე შეიძლება დაუბრუნოს უფრო მდიდარი პროექციები:
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.
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 შემდეგ, რაც ციხის გარეთ პროცესი წარმატებით დასრულდა:
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)დამატება კონტროლის და აუდიტის მეტა მონაცემები
კონტროლი და მეტა მონაცემები ცალკე არიან. გამოიყენეთ კონტროლის პოლიტიკაზე კონტროლი, ხოლო იმ ფაქტებზე მეტა მონაცემების გამოყენება, რომლებიც განაცხადებში ან აუდიტორებში უნდა იყოს წარმოდგენილი:
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 მას შემდეგ, რაც წარმოდგენილი off-chain აქტივი მიწოდებულია, მოიხმარება, პენსიაზეა მიღებული ან სხვაგვარად ამოღებულია მიმოქცევადან. ეს მუდმივად ამცირებს წარდგენილ რაოდენობას პარტიიდან. პარტიას უნდა ჰქონდეს redeem_enabled. ხელმომწერი უნდა იყოს პატრონი ან კონტროლერი.
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.
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 განხილვის შემდეგ:
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 და metadata. რეგისტრაციის შემდეგ, გამოიყენეთ გენერირებული ID გადაცემისა და გამოსასყიდის მიზნით.
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:
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)გადაიხადოს წარმოდგენილი თანხა ქსელის გარეშე ანგარიშსწორების შემდეგ:
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 იმისთვის, რომ მოითხოვებული ნახშირბადის კრედიტები მიმოქცევიდან ამოიღონ. შეინახეთ სერტიფიკატი ან რეესტრის მტკიცებულება მეტადატაში:
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)გაერთიანეთ ორი ობიექტი
გაერთიანება ლოტები, როდესაც ორი off-chain პოზიციები არის კონსოლიდირებული. მშობლები უნდა იყოს იმავე დომენში და გამოიყენოს იგივე რაოდენობის სპეციფიკა. runtime წარმოქმნის შვილი ლოტი ID.
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.