卡尔达诺结算层的转账

概要

一个交易(tx) 是一组特殊的数据,代表着节点间价值转移的行为(从用户的角度来看就是钱包之间价值的转移)。因此,当用户 Alice 汇款给用户 Bob 时,新的交易就产生了。 让我们称该交易为 Tx1,Alice 钱包下的节点称为 N1,Bob 钱包下的节点称为 N2

节点 N1 会执行下面的步骤:

  • 创建一个 Tx1 交易然后用自己的私钥给交易签名。
  • 将交易发送给所有节点(也就是相邻节点)。
  • 将该交易保存到本地的数据中。

N1 的每个相邻节点也会将 Tx1 发送给自己相邻的节点,依次类推。然后某个领导者会将该笔交易放入到账本中的某个区块里面。请注意,如果网络处于高负荷状态,可能需要很长的时间才能让交易真正地加入到某个区块中。

设计

每个交易都包含了一系列的输入和一系列的输出;交易 Tx0 的输出可以被当用来当做其他如 Tx1 交易的输入,以此类推:

            Tx0                           Tx1
  +----------------------+      +----------------------+
  |                      |      |                      |
  |  Inputs     Outputs  |      |  Inputs     Outputs  |
  | +------+   +-------+ |      | +------+   +-------+ |
  | | In0  |   | Out0  + |      | | In0  |   | Out0  | |
  | +------+   +-------+ |      | +------+   +-------+ |
  | | In1  |   | Out1  | |      | | In1  |   | Out1  | |
  | +------+   +-------+ |      | +------+   +-------+ |
  | | ...  |   | ...   | |      | | ..   |   | ...   | |
  | +------+   +-------+ |      | +------+   +-------+ |
  | | InN  |   | OutM  | |      | | InN  |   | OutM  | |
  | +------+   +-------+ |      | +------+   +-------+ |
  |                      |      |                      |
  +----------------------+      +----------------------+     ...

输入和输出携带着金钱走向的信息:输入告知金钱是从哪里来的,输出告知金钱往哪里去。请注意上面有 N 和 M,是因为实际的情况输入和输出的个数可能并不相同。

每个输入包括:

  • 交易 TxN 的 ID,TxN 的输出就是该输入(每笔交易的输出就是另一笔交易的输入)。交易 ID 是一个 BLAKE2b-256 哈希值,就像这样:f9bcbe752aee4512457f1fd350200cf870906b7e6e836688c9a3779645c86c01
  • TxN 的输出中使用的输出的索引。

每个输出包括:

  • 节点 N 的地址,该节点就是我们想要发送价值给它的节点。一个地址就是节点 N 的公钥的 BLAKE2b-224 哈希值,大概像这样:1fsAhhf4E1LQDB8agSds8teuD4E7U8JsRESngEX52kinBhi。请阅读卡尔达诺结算层的地址来获取更多信息。
  • 我们想要汇款的金额。这是一个64位,无符号的整形数字,最大值为 45000000000000000

例如:

  Tx 891971a4cc31e32..                           Tx f9bcbe752aee4512..
------------------------+           +----------------------------------------------+
\                       |           |                                              |
/        Outputs        |           |       Inputs                  Outputs        |
\  +------------------+ |           | +-----------------+     +------------------+ |
/  | Out0             | |           | | In0             |     | Out0             | |
\  | +--------------+ | |           | | +-------------+ |     | +--------------+ | |
/  | | Value        | | |           | | | Tx id       | |     | | Value        | | |
\  | | 100 ADA      | | |           | | | 891971a4c.. | |     | | 100 ADA      | | |
/  | +--------------+------->>  ------>>+-------------+ |     | +--------------+------->>
\  | | Node address | | |           | | | Out index   | |     | | Node address | | |
/  | | a00e4bb2..   | | |           | | | 0           | |     | | 88ca7f79..   | | |
\  | +--------------+ | |           | | +-------------+ |     | +--------------+ | |
/  | ...              | |           | | ...             |     | ...              | |
\  +------------------+ |           | +-----------------+     +------------------+ |
/                       |           |                                              |
------------------------+           +----------------------------------------------+

节点 a00e4bb2.. 生成交易 f9bcbe752aee4512..,这笔交易告诉我们:

  1. 我们想要从地址为 a00e4bb2.. 的当前节点发送100 ADA 到地址 88ca7f79.. 节点。
  2. 这笔钱对应上笔 ID 为 891971a4c.. 的交易的第0个输出。

验证

如上所述,一笔交易的输出会变成另一笔交易的输入。在这种情况下,我们把交易输出称为成交的交易输出。因为它已经是交易 f9bcbe752aee4512.. 的输入。

但这种成交不会立刻发生,一个还未成为其他交易输入的输出称为未成交的交易输出。为了防止双重支付,只有未成交的输出才能被用来当做其他交易的输入。

因此在网络中的每个节点不仅仅接收交易,还会验证它们。为了验证交易,每个节点都必须保持对未成交输出的跟踪,这样就可以验证发布的交易中的输入是未成交的输出。所有未成交的输出叫做 utxo,它也是一个被称为全球状态的特殊键值数据库的一部分。

交易合法性的证明

在卡尔达诺结算层中的每笔交易都有一个证明(也叫做见证)来表明这笔交易是合法的。即使一个输出是一个未成交的输出,我们也应该有权来让它成交。由于一个 TxN 交易可以有多个输入,那么它的见证就包含了 TxN 中所有输入的见证,如果所有的输入都是合法的,TxN 就是合法的。如果某个交易不是合法的,那么网络就会拒绝这笔交易。

因为有两种可用的节点地址类型,所以我们使用两种对应版本进行验证:基于公钥的和基于脚本的。

例如,基于公钥的验证使用公钥 PK 和交易签名:合法的输入必须使用与 PK 相对应的私钥进行签名。以此来检查这个签名是被接收了还是被拒绝了。

验证被存储在区块链中,每个人都可以看见,可以查看,单独验证。但经过一段时间后,节点为了节省空间可能会删除老的证明。分开存储交易和证明被称为『隔离见证』(你可能听到过它,最近在比特币中实现了)。在这种策略下,交易和证明被存储在两个不同的地方,并且可以独立地进行处理。

权益分配

权益分配是卡尔达诺结算层另一个组成部分,虽然和委派没有直接关系,但都可以通过它来获取相应的利润分红。

有些地址有多个拥有者,这也产生了一个权益计算的问题。因为追随中本聪算法的每个币对于每个股东的总权益而言只能计数一次。与余额(余额中的真实币数)不同,权益赋予用户控制算法不同部分的权利:成为领导者、投票更新系统、参加 MPC/SSC。

权益分配关联了每个地址的值。技术上来说该值是地址属性的一部分,该值对应于下面三种情况的某一种:

  1. Bootstrap 时代分配。这是一个特殊的值,它是 Bootstrap 时代里的受托者,但是它在 Bootstrap 时代之后还可以使用。
  2. 单密钥分配,这是指所有的权益会被分配给一个指定的股东。在这种分配情况下会包含股东的身份。 3。 多个密钥分配,这是指权益会被分配给多个股东(至少两个)。在这种分配情况下包含了一对『股东身份-输出部分』的信息。交易的输出有一个值,该值的一部分就是权益。

领导者选举过程和富人计算两者都考虑了权益分配。

这个特性可以以类似的方式用在委派中,但是有点区别:

  1. 没有凭证。要撤销委派 A 必须移动资金,提供不同的权益分配。
  2. A 的部分权益可以通过分配来委托。相反的是,委托需要你同时委托全部地址的资金。