白皮书 · 10
应用场景
六个场景,展示 A-REX Core 的四个接口加上钩子,如何覆盖粮库、合作社、出口商、贷款方和监管者实际面对的情形。每个场景都指明所涉及的调用。
1. 仓储谷物与仓单
情景:一家合作社粮库从一名成员处接收了 250 吨小麦,签发寄存证书,随后分两部分出售该批次。
链上操作:
createBatch({commodity: HS:100199, unit: KGM, producedAt: harvest, expiresAt: 0, originRef: hash(certificate #CD-88213), metadataHash, uri}, 250_000, member)——代币引用的是具有法律效力的凭证;在司法辖区作出认可之前,它不取代该凭证。- 由粮库(
STATUS_ROLE)调用setBatchStatus(id, 1 /* IN_STORAGE */, ref("SILO-3"))。 transform(member, buyerA, [id], [100_000], [same commodity/unit], [100_000], ref("SALE-1"))——这是一次重新分批,无需任何角色;parentsOf(newId) == [id]。- 第二笔出售同理;剩余的 50 吨留在原 id 中。
- 实物提取时,买方的单位被销毁:
burn(buyerA, newId, 100_000);粮库在父批次清空后将其注销。
意义:供应量是精确的(totalSupply),溯源信息是一串 BatchTransformed 事件,而仓单登记簿仍然具有权威性。
2. 收获前融资(CPR、远期合约、以未来作物为标的的权证)
情景:一名巴西生产者为将于四月收获的 1,000 吨大豆签发电子 CPR;一家贷款方凭此提供垫款。
链上操作:
createBatch({commodity: HS:120190, unit: TNE, producedAt: 0, expiresAt: 0, originRef: hash(CPR-e registry id), …}, 1000, producer)——producedAt == 0是标准对未来批次的表示方式。ExpiryHook(allowPreHarvestTransfers = true),使该应收账款可以被转让;现货市场则会以false部署它。- 贷款方的担保权益:由
ENFORCER_ROLE(依据质押协议行事的平台)调用setFrozenTokens(producer, id, 1000)。生产者保留所有权,但不能移动这些单位。 - 收获时:以过磅单调用
setBatchMetadata;调用setBatchStatus(id, 2 /* HARVESTED */);平台在元数据中记录producedAt(链上字段在设计上是不可变的;状态变更才是链上的事实)。 - 还款:
setFrozenTokens(producer, id, 0)。违约:依据质押,调用forcedTransfer(producer, lender, id, 1000)。
意义:农业中最常见的两类信贷事件——质押和执行——只需两次调用,二者都可审计,也都与 UCC 第 12 编下的“控制”以及基于登记簿的工具相兼容。
3. EUDR 下的咖啡出口
情景:2026 年十二月 30 日之后,一家哥伦比亚出口商向汉堡的一家烘焙商发运 20 吨生咖啡豆。
链上操作:
createBatch({commodity: HS:090111, unit: KGM, producedAt: harvest, originRef: hash(DDS reference), …}, 20_000, exporter)。地块多边形保留在欧盟信息系统和出口商的受限存储中。- 出口商的合规官是主题
EUDR:DDS的可信签发方:attest(id, EUDR:DDS, hash(DDS reference), 0)。 - 在代币上调用
AttestationHook.setRequirement(HS:090111, EUDR:DDS):没有该证明的咖啡转移会返回ATTESTATION_MISSING。 - 出售:
safeTransferFrom(exporter, roaster, id, 20_000, data);烘焙商作为下游经营者,需将 DDS 参考编号保存五年——它就在其现已持有的批次元数据中。 - 烘焙:
transform(roaster, roaster, [id], [20_000], [{commodity: HS:090121, …}], [16_800], ref("ROAST-2027-03"))——烘焙后批次的父批次指向生咖啡批次,并通过它指向 DDS。
意义:条例的引用链在加工之后依然保留,而 EDPB 所说不得放在公共链上的地理数据,也绝不会出现在链上。
4. 易腐农产品与冷链
情景:一家包装商发运保质期为 12 天的草莓;运输途中记录到一次温度偏离。
链上操作:
createBatch({commodity: GTIN:…, unit: BX, producedAt: packDate, expiresAt: packDate + 12 days, …}, 4_800, packer);元数据中带有在初次包装时分配的 FSMA 可追溯性批次代码。ExpiryHook阻止expiresAt之后的任何转移(BATCH_EXPIRED);销毁仍然可以进行,用于核销。- 冷链钩子(
DeliveryHook)在运输期间返回IN_TRANSIT,并在onExecuted中记录检查点。 - 该偏离由物流服务商出具证明:
attest(id, COLDCHAIN:EXCURSION, hash(sensor log), 0);买方一侧的钩子可以拒绝接收(canReceive策略),或者各方在链下以该证明为证据进行结算。 - 交付:由接收方调用
burn,或由包装商调用setBatchStatus(id, 255 /* RETIRED */, ref("DELIVERED"))。
意义:保质期、保管和质量事件是作用于同一个批次记录之上的三个相互独立的钩子;它们都不需要改动代币。
5. 合作社分配与成员结算
情景:一家合作社销售一个 1,000 吨的汇集批次,并须把收益和剩余谷物分配给 40 名成员。
链上操作:
- 成员向池中交付:每次交付都是向该成员的一次
createBatch,然后调用transform(member, coop, [ids], [amounts], [pool spec], [amount], ref("POOL-2026"))合并到池批次中(重新分批;若商品和单位相同,则无需角色)。 parentsOf(pool)列出每一次成员交付——分配依据就在链上。- 把池出售给买方:一次
safeTransferFrom。 - 剩余部分:
transform(coop, coop, [pool], [remaining], [40 outputs], [per-member amounts], ref("RESIDUAL")),再通过safeBatchTransferFrom转给各成员。
意义:汇集与拆分——如今存在于合作社账簿中——是带有精确数量的谱系操作。
6. 召回
情景:一家实验室在一个已被拆分并部分加工的玉米批次中发现黄曲霉毒素超标。
链上操作:
- 实验室(
LAB:AFLATOXIN的可信签发方)为该结果出具证明:attest(id, LAB:AFLATOXIN, hash(report), 0)。 - 平台注销该批次:
setBatchStatus(id, 255, ref("RECALL-2026-07"));转移立即停止(ARexBatchRetired),销毁(实物销毁)仍然可以进行。 - 正向追踪:每个
inputIds包含id的BatchTransformed都会给出子批次;递归下去,即得到受影响的饲料和食品批次。反向追踪:parentsOf。 - 监管者从事件日志中获得受影响的 id 和持有人清单——24 小时要求靠索引器查询来满足,而不是靠翻查记录。
意义:召回范围是对标准化事件的一次图查询,而这正是 FSMA 204 的转化类 CTE 设计要实现的目标。
这些场景的共同点
- 四个接口、三个参考钩子和证明注册表即可覆盖全部六个场景;没有任何场景需要改动标准。
- 法律工具(仓单、CPR-e、DDS、实验室报告)被引用并取哈希,而不是被重新实现。
- 强制执行(冻结、强制转移、注销)出现在每一个融资和合规场景中,并且始终是一个事件。
- 个人数据绝不出现在链上。