链下状态

Balances Tree余额树

‌ StarkEx处于链下状态的第一个元素是余额树余额树Merkle Tree。 我们将其叶子称为“保险库”。 每个保险库都包含一个starkKey-一个唯一的密钥,用于标识处于链下状态的用户。 该密钥通过StarkEx智能合约耦合到用户的以太坊地址。 保险库中的其他元素是依据业务逻辑来定义的。

此处是有关即时交易和此处是有关永续交易的保险库的确切结构的描述。

‌Orders Tree订单树

链下状态的直观性较差,但其至关重要的部分是ordersTree(订单树)。 这是另一棵MerkleTree,其目的是防止操作员在系统中重播交易。 为了防止这种攻击,StarkEx会执行以下操作:

● ordersTree的第i个叶子包括带有哈希 i的限价订单的已完成量。 例如,如果Alice签名了一个总金额为1000 USDC和哈希值为0xdeadbeef的转移请求,那么StarkEx将在orderTree的叶索引0xdeadbeef中存储1000 USDC(量化后)。

● 操作员是否应尝试重新提交Alice的订单-作为检查转移有效性的一部分,我们检查到此传账交易之前未被执行过-意味着写在叶子编号0xdeadbeef中的值为零。 由于这与实际情况不符,因此我们的链上Cairo验证器无法接受此订单。

‌此机制还支持部分履行限价单。 在交易中,操作员必须提供原始用户的限价单,以及在此结算中转移的相应金额。 StarkEx强制ordersTree(订单树)中保存的值加上新转移的金额仍小于用户在原始限价单中签名的金额。

‌执行链上状态的一致性

StarkEx智能合约存储余额树订单树的根,它们是对链下状态的承诺。当合约收到新的证明,即存在有效的交易序列,当该有效交易序列被执行后,状态会随之被更新。也就是说由当前状态(即Merkle根的当前元组)移动到新状态(即Merkle根的新元组)。