
综合排名
0
网站活跃度
资金持有量
交易对
0
注册地
-
关注人数
0
验证区块链交易的完整性
TL; DR :Coinbase是保护加密资产的领导者。作为我们积极的安全方法的一部分,我们正在引入一种新的安全控制措施,该措施将为我们的交易提供保证。
问题背景
什么是不变式?
在计算机科学中,不变量是系统的属性,在系统执行某些操作期间,该属性成立。不变性对于确保给定系统的设计方式至关重要。
在Coinbase,我们强制执行某些不变式,以保证交易的处理方式。例如,当客户提交提款请求时,处理交易的系统可能具有不变量,该变量表示提款的目的地在客户提交后不能更改。这样的不变性将使我们能够放心地处理交易。
但是,当一个不变式被破坏时会发生什么呢?这可能会导致导致我们平台性能下降的错误,或者执行不符合客户意图的操作。例如,如果先前讨论的不变式被破坏,则客户资金可能会被错误分配 。
通过集中式验证系统实施不变式
为了保持不变,我们有一个名为“ IVy”(完整性验证)的系统,该系统将强制执行这些基本事实,并在违反这些事实时通知团队。其工作是确保在其他系统处理事务时不会以意外方式修改事务,并充当集中式验证框架。这降低了现有系统的复杂性,并创建了可扩展的框架,用于根据需要实施新的不变量。
影响力
持续检查意图
准确广播交易至关重要,因为如果我们不这样做,资金将无法正确分配。此外,处理不同加密货币使用的各种字段的复杂性大大增加了所需的验证步骤,我们希望避免在各处重复此逻辑。我们设计IVy的方式允许客户对有效负载进行一次签名,然后可以在任何地方验证这些有效负载。通常,由于各种货币在有效值与无效值之间有很多差异(例如某些具有备注字段的货币),我们决定将交易的验证逻辑集中在一个地方,以便我们可以一次实现不变式并使用不变式到处。
设计
我们将此安全控件设计为具有简单API的独立服务。端点可以被其他服务用来向我们的服务提供数据,并查询交易是否有效。完整性验证系统将使用其他系统提供的信息来验证该交易未被篡改,并且它不是恶意的。
此安全控制在提交后立即在后端记录客户的提款请求。如图2所示。图2描述了如何保留提款交易的不变性。
API设计
为了使该服务有用和有效,客户需要能够与其进行交互。结果,我们在gRPC之上设计了一个健壮的API。 gRPC使我们在将来想要更新API时具有灵活性,因为可以轻松地重新生成客户端中间件代码。因此,我们可以存储客户意图稍后进行验证,如下所示:
#创建有效载荷
#并添加元数据
有效负载= TransactionRequest.new(
unsigned_transaction:UnsignedTransaction.new(
transaction_data:CbTransactionData.new(
transaction_id:ID,
currency_ticker:currency_symbol
),
#unsigned_tx是一个json字符串
#与未签名的交易
unsigned_tx:unsigned_tx
)
)
#将请求发送到
#完整性验证服务
client.register_transaction(有效载荷)
稍后,当服务想要检查已签名的有效负载是否符合用户意图时,我们可以使用Rosetta解析已签名的事务并将其与用户意图进行比较。
验证
在广播之前,我们通过将签名的交易发送到IVy来验证交易的不变性。由于我们之前已经在IVy中注册了用户意图,因此我们可以将其与签名副本进行比较。这确保了交易不会以不希望的方式被修改。
我们实现比较/验证逻辑的方式产生了一些可用性/灵活性好处。每种货币都有其自己的验证器,该验证器为该货币执行必要的规则。此外,还有一些通用实用程序,每个验证程序都可以使用它们来执行常规检查。而且,所有解析器都遵循相同的接口,这使我们可以在后端将它们与它们进行一般集成。这些想法的结果是,解析器轻巧且易于查看。由于解析器的范围非常狭窄,因此易于编写,这使我们可以灵活地使用新货币,或者在不影响其他货币的情况下更改特定货币子集。
影响力
作为我们设计的结果,我们能够验证与我们的后端系统有关的不变式。这种安全控制消除了整个故障模式类别,使我们的平台更加可靠。
未来的工作
随着IVy的发展,将开发和执行其他交易属性和策略。这些属性和策略将成为Coinbase诚信和客户意图的核心组成部分。
如果您有兴趣保护加密经济,那么Coinbase正在招聘 。
在复杂系统中执行不变式最初发表在Medium上的Coinbase博客上,人们通过突出并响应这个故事来继续对话。