我们使用一种称为分布式密钥生成(DKG)的加密过程,实现共享密钥集的分发。每个交易的 SOs 都经历一个过程来生成共享密钥,该密钥映射到撤销公钥,使得需要组合这些密钥分享的阈值才能派生出底层撤销密钥。Spark 使用撤销密钥来可验证地使交易的旧版本失效并防止双重支付。当钱包构建交易时,它与状态链运营商设置一个共同约定的撤销承诺。通过利用 DKG,钱包和 SOs 可以就撤销密钥达成一致,而无需任何个体完全访问该密钥,直到达到 SOs 合作的阈值。
当钱包请求 StartTokenTransaction() 时,单个 SO 选择一个未使用的先前生成的 DKG 密钥,并告知所有其他 SOs 也为生成的 TTXO 预留该密钥。然后它将该预留的公钥返回给钱包。当钱包随后调用每个 SO 运营商的 Sign() 时,每个 SO 运营商都有机会验证与每个输出关联的撤销公钥确实与之前预留的值匹配,从而验证撤销密钥输出不是由单个 SO 单方面选择的,并且派生撤销密钥的唯一方式是从 SO 集合中收集阈值数量的密钥分享。然后,钱包能够与每个 SO 单独验证与交易输出关联的撤销公钥确实与撤销密钥分享匹配,只有当阈值数量的 SO 释放其密钥分享时,钱包才能派生出这个密钥分享。诚实的 SO 只有在钱包能够证明(通过签名)它能够花费该输出时才会释放此密钥分享。