سلسلة مختبرات الحيازة: التسوية تحت التدقيق
قم بتهيئة رف المختبر من بيان إعلاني، قم بتحفيز فشل مسبق حتمي، وحقق التوافق من خلال وضع غير مرتبط بالشبكة.
إذا كنت تقرأ هذا النص بشكل مفاجئ، فهذا هو سير عمل تسوية المختبر: تتبع الحيازة الحتمي، اكتشاف تعارضات ما قبل الطيران، وتحرك تصحيح موثق. كل تغيير في الحيازة هو التزام يمكن تدقيقه حتى يتمكن المحققون من إعادة التشغيل، والتحقق، وشرح ما حدث دون استنتاج.
المشكلة: انقطاع الحضانة تحت التدقيق
سلاسل الحراسة السريرية تفشل عندما تتعارض الجرد الفعلي، سجلات الماسح الضوئي، والأنظمة التشغيلية. عندما يفشل التعيين، تحتاج إلى دليل حتمي يثبت أن النظام اكتشف النزاع قبل أي تغيير في الحالة.
هذا السيناريو يُظهر نمطًا من الدرجة الإنتاجية: فشل مسبق قسري، تصحيح موجه بالقراءة، ومسار تدقيق قابل لإعادة التشغيل.
لماذا هذا مهم
تحتاج المختبرات المنظمة إلى حراسة قابلة للتتبع وإصلاح حتمي عند ظهور النزاعات. تجعل Asset Core الحراسة موثوقة من خلال اعتبار كل تغيير كمعاملة حتمية وقابلة لإعادة التشغيل.
نموذج النظام
- الرفوف: حاويات شبكية تفرض قواعد الإشغال لكل مختبر.
- خليج الماسح: حاوية فتحة لفحوصات الحراسة أثناء الرحلة.
- برك المواد: حاويات متوازنة مع كوانتيزات نقطة ثابتة.
- الفئات والأشكال: مسجلة حتى تظل قواعد التوزيع متسقة.
- الوحدات: خلايا (fixed_point_scale=1000).
نظرة عامة على سير العمل
- الإعداد - تسجيل الفصول وإنشاء حاويات المختبر.
- البذور - زراعة الأنابيب الأولية والأرصدة.
- تم حظر الطيران المسبق - يفشل الطيران المسبق عند وضعه في خلية مشغولة.
- شبكة خالية - اختر نقطة الشبكة المتاحة التالية.
- التسوية - نقل أنبوب الماسح إلى رصيف مجاني تم التحقق منه.
- تحقق من الشبكة - تأكيد الموضع المتوازن في عرض القراءة.
كيفية قراءة الدليل
- تستخدم خطوات العملية الفردية مساعدي الإجراءات من أجل سهولة القراءة.
- تظل خطوات العمليات المتعددة كاستدعاءات التزام للحفاظ على الذرية.
- يستخدم Rust HTTP دائمًا نقطة النهاية الخاصة بالالتزام مع عملية واحدة أو أكثر.
أدوات السيناريو
- manifest.json - بيانات السيناريو والمعرفات.
- lab_chain_of_custody_actions.json - حمولات استعراض الإجراءات أولاً.
- lab_chain_of_custody_transcript.json - سجل الطلب/الاستجابة الكامل.
- http_snapshot.json - نتائج الالتزام المكثفة.
- lab_chain_of_custody_steps.json - فهرس الخطوات الحتمية.
أحدث تحقق
- معرف التشغيل:
2026-01-19T18-52-12Z-lab_chain_of_custody - Status: تم النجاح
- جذر هاش النزاهة:
efcb02df86d0dd2bb9ffd14d8a7403e52bd06b7c5f56fb4fc4f04703dc9f542f - Checks:
- {‘kind’: ‘structural_invariants’}: تم اجتيازه
- {‘kind’: ‘world_seq_monotonic’}: تم النجاح
- {‘kind’: ‘global_seq_monotonic’}: تم النجاح
{'kind': 'owner_scope', 'allowed_owners': [1, 2]}: تم القبول{'kind': 'quantity_conservation', 'container_id': 4, 'class_id': 2, 'stack_key': None, 'expected': 250000}: تم النجاح- {‘kind’: ‘replay_idempotent’}: تم المرور
{'kind': 'commit_log_integrity', 'expected_chain_hash': 'aa3301e51d32150b30281395b68f6df815eaff8416260789832c06259e84a30c', 'expected_prev_chain_hash': 'c387f5f5a7fec5ce1223fa9dcbc8d564a5221e50a7afa1fba498c625d693f064', 'expected_start_offset': 1, 'expected_end_offset': 3, 'expected_entry_count': 3, 'expected_last_global_seq': 38}: تم النجاح- {‘kind’: ‘runpack_integrity’}: ناجح
تنزيلات Runpack
لقطة سيناريو
{
"scenario_id": "lab_chain_of_custody",
"version": "0.1.0",
"namespace_id": 2,
"containers": {
"rack_lab_a": "container-32001",
"rack_lab_b": "container-32002",
"reagent_pool_lab_a": "container-32004",
"reagent_pool_lab_b": "container-32005",
"scanner_bay_lab_a": "container-32003"
},
"classes": {
"reagent_buffer": "class-42002",
"sample_tube": "class-42001"
},
"units": {
"fixed_point_scale": 1000,
"length_unit": "cells",
"time_unit": "ms"
}
}
فرع الفشل
POSITION_OCCUPIED -> grid_free -> reconcile move
سجل التدقيق (اختياري)
تلتقط النسخة النصية أزواج الطلبات والاستجابات الدقيقة التي تم إصدارها خلال التشغيل. هنا مقتطف مضغوط يمكنك استخدامه للتحقق من الحتمية وانتقال البيانات الوصفية:
{
"kind": "commit",
"name": "setup",
"request": {
"path": "/v1/write/namespaces/2/commit",
"idempotency_key": "lab-chain-setup",
"actor_id": "lab-chain",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"operations": [
"RegisterClass",
"RegisterClassShape",
"RegisterClass",
"CreateContainer",
"CreateContainer",
"CreateContainer",
"CreateContainer",
"CreateContainer"
]
},
"response": {
"commit_id": "00000000000000000000000000000003",
"world_seq_start": 1,
"world_seq_end": 8,
"event_count": 8
}
}
ملاحظة ما قبل الرحلة
- تقوم استدعاءات الإجراء بتقديم الالتزامات بشكل افتراضي.
- قم بتعيين ActionOptions(preflight=True) أو استدعاء assetcore_commit_preflight للتحقق من الصحة.
إعداد SDK
from assetcore_sdk import AssetCoreClient
from assetcore_sdk.actions import ActionOptions
from assetcore_sdk.operations import (
AddFungible,
AddInstance,
CreateContainer,
MoveInstance,
RegisterClass,
RegisterClassShape,
)
# Snippets assume an async context (e.g., inside async def main()).
write_client = AssetCoreClient(
base_url="http://localhost:8080",
api_key="WRITE_API_KEY",
)
read_client = AssetCoreClient(
base_url="http://localhost:8081",
api_key="READ_API_KEY",
)#include "asset_core.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static void check_ok(int32_t code, const char* label) {
if (code == ERROR_SUCCESS) {
return;
}
fprintf(stderr, "%s failed: %d\n", label, code);
abort();
}
OpaqueRuntime* runtime = NULL;
AssetRuntimeConfig config = {0};
config.struct_size = sizeof(AssetRuntimeConfig);
config.clock_type = AssetClockType_System;
check_ok(asset_runtime_create(&config, &runtime), "asset_runtime_create");use reqwest::Client;
use serde_json::json;
let client = Client::new();
let write_base_url = "http://localhost:8080";
let read_base_url = "http://localhost:8081";
let write_api_key = "WRITE_API_KEY";
let read_api_key = "READ_API_KEY";دليل المستخدم
خطوة 1: الإعداد
سجل الفصول وأنشئ حاويات المختبر.
العمليات
- RegisterClass (x2) - يسجل تعريف فئة بحيث يمكن للعمليات المستقبلية الإشارة إليه.
- RegisterClassShape - يسجل بصمة شكل الشبكة لفئة أو نوع فئة.
CreateContainer(x5) - ينشئ حاوية (منطقة ذاكرة منظمة) بالنوع المطلوب.
await write_client.commit_operations(
[
RegisterClass(
request={
"behavior": {"balance_scale": 1},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube",
},
),
RegisterClassShape(
request={"class_id": "class-42001", "shape": {"height": 1, "width": 1}},
),
RegisterClass(
request={
"behavior": {"balance_scale": 1000},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer",
},
),
CreateContainer(
client_tag="rack_lab_a",
external_id="container-32001",
kind={"capacity": 96, "grid_width": 12, "type": "grid"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="rack_lab_b",
external_id="container-32002",
kind={"capacity": 96, "grid_width": 12, "type": "grid"},
owner_external_id="owner-102",
policies=None,
),
CreateContainer(
client_tag="scanner_bay_lab_a",
external_id="container-32003",
kind={"count": 2, "type": "slots"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="reagent_pool_lab_a",
external_id="container-32004",
kind={"quantization_inv": 1000, "type": "balance"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="reagent_pool_lab_b",
external_id="container-32005",
kind={"quantization_inv": 1000, "type": "balance"},
owner_external_id="owner-102",
policies=None,
),
],
namespace_id=2,
idempotency_key="lab-chain-setup",
actor_id="lab-chain",
metadata={"phase": "setup", "scenario": "lab_chain_of_custody"},
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
{
AssetClassBehavior behavior = {0};
behavior.has_balance_scale = 1;
behavior.balance_scale = 1;
uint32_t out_class_id = 0;
check_ok(asset_tx_register_class(runtime,
tx,
42001,
0,
&behavior,
(const uint8_t*)"sample_tube",
11,
&out_class_id),
"asset_tx_register_class[0]");
}
{
AssetItemShape shape = {.width = 1, .height = 1};
uint32_t inserted = 0;
check_ok(asset_tx_register_class_shape(runtime, tx, 42001, 0, shape, &inserted),
"asset_tx_register_class_shape[1]");
}
{
AssetClassBehavior behavior = {0};
behavior.has_balance_scale = 1;
behavior.balance_scale = 1000;
uint32_t out_class_id = 0;
check_ok(asset_tx_register_class(runtime,
tx,
42002,
0,
&behavior,
(const uint8_t*)"reagent_buffer",
14,
&out_class_id),
"asset_tx_register_class[2]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Grid;
kind.capacity = 96;
kind.grid_width = 12;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32001, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[3]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Grid;
kind.capacity = 96;
kind.grid_width = 12;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32002, kind, 102, NULL, &out_container_id),
"asset_tx_create_container[4]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Slots;
kind.slots = 2;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32003, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[5]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Balance;
kind.quantization_inv = 1000;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32004, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[6]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Balance;
kind.quantization_inv = 1000;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32005, kind, 102, NULL, &out_container_id),
"asset_tx_create_container[7]");
}
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_commit",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-setup",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"request": {
"behavior": {
"balance_scale": 1
},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube"
}
},
"op": "RegisterClass"
},
{
"args": {
"request": {
"class_id": "class-42001",
"shape": {
"height": 1,
"width": 1
}
}
},
"op": "RegisterClassShape"
},
{
"args": {
"request": {
"behavior": {
"balance_scale": 1000
},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer"
}
},
"op": "RegisterClass"
},
{
"args": {
"client_tag": "rack_lab_a",
"external_id": "container-32001",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "rack_lab_b",
"external_id": "container-32002",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "scanner_bay_lab_a",
"external_id": "container-32003",
"kind": {
"count": 2,
"type": "slots"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_a",
"external_id": "container-32004",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_b",
"external_id": "container-32005",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-setup",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"request": {
"behavior": {
"balance_scale": 1
},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube"
}
},
"op": "RegisterClass"
},
{
"args": {
"request": {
"class_id": "class-42001",
"shape": {
"height": 1,
"width": 1
}
}
},
"op": "RegisterClassShape"
},
{
"args": {
"request": {
"behavior": {
"balance_scale": 1000
},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer"
}
},
"op": "RegisterClass"
},
{
"args": {
"client_tag": "rack_lab_a",
"external_id": "container-32001",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "rack_lab_b",
"external_id": "container-32002",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "scanner_bay_lab_a",
"external_id": "container-32003",
"kind": {
"count": 2,
"type": "slots"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_a",
"external_id": "container-32004",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_b",
"external_id": "container-32005",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;خطوة 2: البذور
زرع الأنابيب الأولية والتوازنات.
العمليات
AddInstance(x25) - يصنع مثيلاً جديداً ويضعه في موقع مستهدف.AddFungible(x2) - يضيف كمية قابلة للتداول إلى رصيد أو خلية شبكة محددة.
await write_client.commit_operations(
[
AddInstance(
class_id="class-42001",
client_tag="tube-001",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-002",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-003",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-004",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-005",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-006",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-007",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-008",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-009",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-010",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-011",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-012",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-013",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-014",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-015",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-016",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-017",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-018",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-019",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-020",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-021",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-022",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-023",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-024",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="scanner-tube",
key=None,
location={
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1,
},
),
AddFungible(
class_id="class-42002",
client_tag="reagent-a",
key=None,
location={"container_id": "container-32004", "kind": "balance"},
quantity="250",
),
AddFungible(
class_id="class-42002",
client_tag="reagent-b",
key=None,
location={"container_id": "container-32005", "kind": "balance"},
quantity="125",
),
],
namespace_id=2,
idempotency_key="lab-chain-seed",
actor_id="lab-chain",
metadata={"phase": "seed", "scenario": "lab_chain_of_custody"},
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 1;
location_0.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_0, &instance_id),
"asset_tx_add_instance_semantic[0]");
}
AssetInstanceLocation location_1 = {0};
location_1.kind = AssetInstanceLocationKind_GridCell;
location_1.container = 32001;
location_1.position = 2;
location_1.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_1, &instance_id),
"asset_tx_add_instance_semantic[1]");
}
AssetInstanceLocation location_2 = {0};
location_2.kind = AssetInstanceLocationKind_GridCell;
location_2.container = 32001;
location_2.position = 3;
location_2.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_2, &instance_id),
"asset_tx_add_instance_semantic[2]");
}
AssetInstanceLocation location_3 = {0};
location_3.kind = AssetInstanceLocationKind_GridCell;
location_3.container = 32001;
location_3.position = 4;
location_3.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_3, &instance_id),
"asset_tx_add_instance_semantic[3]");
}
AssetInstanceLocation location_4 = {0};
location_4.kind = AssetInstanceLocationKind_GridCell;
location_4.container = 32001;
location_4.position = 5;
location_4.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_4, &instance_id),
"asset_tx_add_instance_semantic[4]");
}
AssetInstanceLocation location_5 = {0};
location_5.kind = AssetInstanceLocationKind_GridCell;
location_5.container = 32001;
location_5.position = 6;
location_5.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_5, &instance_id),
"asset_tx_add_instance_semantic[5]");
}
AssetInstanceLocation location_6 = {0};
location_6.kind = AssetInstanceLocationKind_GridCell;
location_6.container = 32001;
location_6.position = 7;
location_6.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_6, &instance_id),
"asset_tx_add_instance_semantic[6]");
}
AssetInstanceLocation location_7 = {0};
location_7.kind = AssetInstanceLocationKind_GridCell;
location_7.container = 32001;
location_7.position = 8;
location_7.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_7, &instance_id),
"asset_tx_add_instance_semantic[7]");
}
AssetInstanceLocation location_8 = {0};
location_8.kind = AssetInstanceLocationKind_GridCell;
location_8.container = 32001;
location_8.position = 9;
location_8.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_8, &instance_id),
"asset_tx_add_instance_semantic[8]");
}
AssetInstanceLocation location_9 = {0};
location_9.kind = AssetInstanceLocationKind_GridCell;
location_9.container = 32001;
location_9.position = 10;
location_9.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_9, &instance_id),
"asset_tx_add_instance_semantic[9]");
}
AssetInstanceLocation location_10 = {0};
location_10.kind = AssetInstanceLocationKind_GridCell;
location_10.container = 32001;
location_10.position = 11;
location_10.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_10, &instance_id),
"asset_tx_add_instance_semantic[10]");
}
AssetInstanceLocation location_11 = {0};
location_11.kind = AssetInstanceLocationKind_GridCell;
location_11.container = 32001;
location_11.position = 12;
location_11.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_11, &instance_id),
"asset_tx_add_instance_semantic[11]");
}
AssetInstanceLocation location_12 = {0};
location_12.kind = AssetInstanceLocationKind_GridCell;
location_12.container = 32001;
location_12.position = 13;
location_12.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_12, &instance_id),
"asset_tx_add_instance_semantic[12]");
}
AssetInstanceLocation location_13 = {0};
location_13.kind = AssetInstanceLocationKind_GridCell;
location_13.container = 32001;
location_13.position = 14;
location_13.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_13, &instance_id),
"asset_tx_add_instance_semantic[13]");
}
AssetInstanceLocation location_14 = {0};
location_14.kind = AssetInstanceLocationKind_GridCell;
location_14.container = 32001;
location_14.position = 15;
location_14.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_14, &instance_id),
"asset_tx_add_instance_semantic[14]");
}
AssetInstanceLocation location_15 = {0};
location_15.kind = AssetInstanceLocationKind_GridCell;
location_15.container = 32001;
location_15.position = 16;
location_15.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_15, &instance_id),
"asset_tx_add_instance_semantic[15]");
}
AssetInstanceLocation location_16 = {0};
location_16.kind = AssetInstanceLocationKind_GridCell;
location_16.container = 32001;
location_16.position = 17;
location_16.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_16, &instance_id),
"asset_tx_add_instance_semantic[16]");
}
AssetInstanceLocation location_17 = {0};
location_17.kind = AssetInstanceLocationKind_GridCell;
location_17.container = 32001;
location_17.position = 18;
location_17.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_17, &instance_id),
"asset_tx_add_instance_semantic[17]");
}
AssetInstanceLocation location_18 = {0};
location_18.kind = AssetInstanceLocationKind_GridCell;
location_18.container = 32001;
location_18.position = 19;
location_18.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_18, &instance_id),
"asset_tx_add_instance_semantic[18]");
}
AssetInstanceLocation location_19 = {0};
location_19.kind = AssetInstanceLocationKind_GridCell;
location_19.container = 32001;
location_19.position = 20;
location_19.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_19, &instance_id),
"asset_tx_add_instance_semantic[19]");
}
AssetInstanceLocation location_20 = {0};
location_20.kind = AssetInstanceLocationKind_GridCell;
location_20.container = 32001;
location_20.position = 21;
location_20.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_20, &instance_id),
"asset_tx_add_instance_semantic[20]");
}
AssetInstanceLocation location_21 = {0};
location_21.kind = AssetInstanceLocationKind_GridCell;
location_21.container = 32001;
location_21.position = 22;
location_21.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_21, &instance_id),
"asset_tx_add_instance_semantic[21]");
}
AssetInstanceLocation location_22 = {0};
location_22.kind = AssetInstanceLocationKind_GridCell;
location_22.container = 32001;
location_22.position = 23;
location_22.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_22, &instance_id),
"asset_tx_add_instance_semantic[22]");
}
AssetInstanceLocation location_23 = {0};
location_23.kind = AssetInstanceLocationKind_GridCell;
location_23.container = 32001;
location_23.position = 24;
location_23.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_23, &instance_id),
"asset_tx_add_instance_semantic[23]");
}
AssetInstanceLocation location_24 = {0};
location_24.kind = AssetInstanceLocationKind_Slot;
location_24.container = 32003;
location_24.slot = 1;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_24, &instance_id),
"asset_tx_add_instance_semantic[24]");
}
AssetFungibleLocation location_25 = {0};
location_25.kind = AssetFungibleLocationKind_Balance;
location_25.container = 32004;
check_ok(asset_tx_add_fungible_semantic(runtime, tx, 42002, 0, 250, location_25),
"asset_tx_add_fungible_semantic[25]");
AssetFungibleLocation location_26 = {0};
location_26.kind = AssetFungibleLocationKind_Balance;
location_26.container = 32005;
check_ok(asset_tx_add_fungible_semantic(runtime, tx, 42002, 0, 125, location_26),
"asset_tx_add_fungible_semantic[26]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_commit",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-seed",
"metadata": {
"phase": "seed",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-001",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-002",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-003",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-004",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-005",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-006",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-007",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-008",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-009",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-010",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-011",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-012",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-013",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-014",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-015",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-016",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-017",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-018",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-019",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-020",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-021",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-022",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-023",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-024",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "scanner-tube",
"key": null,
"location": {
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-a",
"key": null,
"location": {
"container_id": "container-32004",
"kind": "balance"
},
"quantity": "250"
},
"op": "AddFungible"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-b",
"key": null,
"location": {
"container_id": "container-32005",
"kind": "balance"
},
"quantity": "125"
},
"op": "AddFungible"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-seed",
"metadata": {
"phase": "seed",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-001",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-002",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-003",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-004",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-005",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-006",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-007",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-008",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-009",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-010",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-011",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-012",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-013",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-014",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-015",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-016",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-017",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-018",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-019",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-020",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-021",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-022",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-023",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-024",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "scanner-tube",
"key": null,
"location": {
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-a",
"key": null,
"location": {
"container_id": "container-32004",
"kind": "balance"
},
"quantity": "250"
},
"op": "AddFungible"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-b",
"key": null,
"location": {
"container_id": "container-32005",
"kind": "balance"
},
"quantity": "125"
},
"op": "AddFungible"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;الخطوة 3: فشل الفحص المسبق (خطأ متوقع)
يفشل الفحص المسبق عند وضعه في خلية مشغولة.
العمليات
- MoveInstance - ينقل مثيلاً موجودًا إلى موقع جديد.
خطأ متوقع
{
"code": "POSITION_OCCUPIED",
"detail": "Position 6 in container 1 is occupied by item at anchor 6",
"hint": "Select an unoccupied position or move the existing item first.",
"retryable": false,
"status": 409,
"title": "ConflictError",
"type": "urn:assetcore:error:POSITION_OCCUPIED"
}
await write_client.actions.move_instance(
instance="inst-25",
to={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": None,
},
options=ActionOptions(
namespace_id=2,
idempotency_key="lab-chain-blocked",
actor_id="lab-chain",
metadata={"phase": "exception", "scenario": "lab_chain_of_custody"},
),
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 6;
location_0.rotation = AssetRotation_None;
check_ok(asset_tx_move_instance_semantic(runtime, tx, 25, location_0),
"asset_tx_move_instance_semantic[0]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_move_instance",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-blocked",
"metadata": {
"phase": "exception",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "MoveInstance"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-blocked",
"metadata": {
"phase": "exception",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "MoveInstance"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit/preflight", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;الخطوة 4: الشبكة الحرة
اختر نقطة الشبكة المتاحة التالية.
await read_client.get_container_grid_free(
container_id="container-32001",
namespace_id=2,
height=1,
width=1,
){
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_find_grid_free",
"params": {
"container_id": "container-32001",
"height": 1,
"namespace_id": 2,
"width": 1
}
}let request = client
.get(format!("{}/v1/read/namespaces/2/containers/container-32001/grid/free", read_base_url))
.query(&[("height", 1), ("width", 1)])
.bearer_auth(read_api_key)
.send()
.await?;
let body = request.text().await?;الخطوة 5: التسوية
قم بتحريك أنبوب الماسح إلى رافعة مجانية تم التحقق منها.
العمليات
- MoveInstance - ينقل مثيلاً موجودًا إلى موقع جديد.
await write_client.actions.move_instance(
instance="inst-25",
to={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": None,
},
options=ActionOptions(
namespace_id=2,
idempotency_key="lab-chain-reconcile",
actor_id="lab-chain",
metadata={
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25,
},
),
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 25;
location_0.rotation = AssetRotation_None;
check_ok(asset_tx_move_instance_semantic(runtime, tx, 25, location_0),
"asset_tx_move_instance_semantic[0]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_move_instance",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-reconcile",
"metadata": {
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25
},
"namespace_id": 2,
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": null
}
},
"op": "MoveInstance"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-reconcile",
"metadata": {
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25
},
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": null
}
},
"op": "MoveInstance"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;الخطوة 6: تحقق من الشبكة
أكد على التوزيع المتوافق في عرض القراءة.
await read_client.get_container_grid(
container_id="container-32001",
namespace_id=2,
){
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_get_container_grid",
"params": {
"container_id": "container-32001",
"namespace_id": 2
}
}let request = client
.get(format!("{}/v1/read/namespaces/2/containers/container-32001/grid/cells", read_base_url))
.bearer_auth(read_api_key)
.send()
.await?;
let body = request.text().await?;