即时交易
为了与系统交互,用户必须发送包含他们希望被执行的订单的信息。 当前支持以下订单类型(提款交易不需要签名,因此在此将被忽略):
● 限价单,宣布有意出售一定数量的某种资产以换取一定比例的另一种资产。
● 条件性转账,如果某些链上事件被记录了,则要求将资金从一个保险库转移到另一个保险库。
● 转账,要求将资金从一个保险库转移到另一个保险库。
交易通过公开的接口直接发送到应用程序,并且所有字段上签名的有效性由证明系统来验证。
在限价单和转账的情况下,签名的构造如下:
ECDSA(H(H(w1,w2),w3),kprivate)ECDSA(H(H(w_1, w_2),w_3), k_{private})
在条件性转账的情况下,签名的构造如下:
ECDSA(H(H(H(w1,w2),w4),w3),kprivate)ECDSA(H(H(H(w_1, w_2),w_4),w_3), k_{private})
‌其中ECDSA是规则的椭圆曲线数字签名算法,
H是 Pedersen hash functio(Pedersen哈希函数),
kprivatek_{private}
是用户的私钥,以及这些字
w1w_1
,
w2w_2
,
w3w_3
w4w_4
是252位字,其中包含签名所需的数据,如下一节所述。

信息中字的定义

w1w_1
​是要出售(或转账)的assetId(资产ID)。
w2w_2
取决于订单类型:
在限价单中,
● W2是待购的assetId
在转账和条件性转账中,
● W2是收款人的starkKey
W3是位打包的消息,其低245位符合以下描述的格式,具体取决于订单类型
1
+---+---------+---------+-------------------+-------------------+---------+-------+
2
#bits | 4 | 31 | 31 | 63 | 63 | 31 | 22 |
3
+---+---------+---------+-------------------+-------------------+---------+-------+
4
label A B C D
Copied!
● ‌A:订单类型
○限价单为0
○1为转帐
○2为条件性转账
● B:用户要从中收取资金的vaultId
● C:
○如果是限价单,用户想要用来接收资金的vaultId
○如果是转帐和有条件转帐,使用vaultId接收转移的资金。
D:已量化的待出售/转移的金额。
E:要购买的量化数额(在转帐和有条件转帐订单的情况下为0)。
F:交易的随机数
G:expirationTimestamp(失效的时间戳),以自Unix纪元以来的小时数表示。 例如,要使订单从当前时间开始的24小时后过期,请将时间戳设置
𝑡𝑢𝑛𝑖𝑥3600+24⌊\frac{𝑡_{𝑢𝑛𝑖𝑥}}{3600}⌋+24
.
W4仅用于条件性转账:
● W4是condition条件,它是keccak事实,而FR_address掩码为250位。
keccak(FR_address, fact)) & 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
其中FR_adddress是合约地址,fact事实是uint256。

实例

‌假设Alice和Bob分别是两个资产交易用户𝑋(ID为100)和Y(ID为200),并具备以下设置:

转账案例

‌假设Alice想从ID为7的保险库转移25𝑋到ID为12的Bob的保险库。在这种情况下,她将签名以下消息:
H(H(100,kstarkKeyBob),m)H(H(100, k_{starkKey}^{Bob}), m)
其中m的格式如下:
1
+---+---------+---------+-------------------+-------------------+-----------+-------+
2
value | 1 | 7 | 12 | 25 | 0 | nonce | ts |
3
+---+---------+---------+-------------------+-------------------+-----------+-------+
4
label A B C
Copied!

条件性转账案例

现在,Alice希望进行同样的转账操作,但要以在FR_address中注册的Fact事实为条件。 在这种情况下,她将签名以下消息:
H(H(H(100,kstarkKeyBob),condition),m)H(H(H(100, k_{starkKey}^{Bob}),condition), m)
condition条件格式如下:
1
condition = keccak(FR_address, fact))
2
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Copied!
m的格式如下:
1
+---+---------+---------+-------------------+-------------------+-----------+-------+
2
value | 2 | 7 | 12 | 25 | 0 | nonce | ts |
3
+---+---------+---------+-------------------+-------------------+-----------+-------+
4
label A B C
Copied!

限价单案例

假设现在Alice想从其ID 为7的保险库中拿9000 X交换成15000𝑌,如果交易成功,则将其存入到ID为 4的保险库中。 在这种情况下,她将签名以下信息:
H(H(100,200),m)H(H(100, 200), m)
m的格式如下:
1
+---+---------+---------+-------------------+-------------------+-----------+-------+
2
value | 0 | 7 | 4 | 9000 | 15000 | nonce | ts |
3
+---+---------+---------+-------------------+-------------------+-----------+-------+
4
label A B C D E F G
Copied!