本文由币乎社区(bihu.com)内容支持计划奖励。
概括
一个交易(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
请阅读Cardano SL中的地址来获取更多关于地址的信息。 - 我们想要汇款的金额。是一个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..
,这个交易告诉我们:
- 我们想要从地址为
a00e4bb2..
的当前节点发送100 ADA到地址为88ca7f79...
的节点 - 这笔钱对应于上笔ID为
891971a4c..
的交易的第0
个输出
验证
就像上面提到的那样,一个交易的输出会变成另一个交易的输入。在这种情况下我们就把这种输出称为花费的交易输出。因此,交易891971a4cc31e32..
的一个输出Out0
是一个花费输出,因为它已经是交易f9bcbe752aee4512..
的输入。
但是这种花费不会立刻发生。所以一个还不是其他交易输入的输出就被称为未花费的交易输出,为了防止双花
,只有未花费的输出才能被用来当做其他交易的输入。
所以在网络中的每个节点不仅仅接收交易,还会验证它们。为了验证交易,每个节点都必须保持着对未花费输出的跟踪,这样就可以验证发布的交易中的输入是未花费的输出。所有未花费的输出叫做 UTXO。它也是一个叫做全球状态的特殊key-value数据库的一部分。
交易合法的证明
在Cardano SL中的每笔交易都有一个证明(也叫做见证)来表示这笔交易是合法的。即使输出是一个未花费的输出,我们也需要证明我们有权利来花费它。由于一个TxN
交易可以有多个输入,那么它的见证就包含了TxN
中所有输入的见证,如果所有的输入都是合法的,TxN
就是合法的。如果某个交易不是合法的,那么网络就会拒绝这笔交易。
因为有两种可用的节点地址类型所以我们使用两个对应的见证版本:基于公钥的和基于脚本的。
例如,公钥PK
与交易签名使用基于公钥的见证:合法的输入必须使用与PK
相对应的私钥进行签名。所以就可以检查这个签名是被接收了还是被拒绝了。
见证被存储在区块链中,每个人都可以看见,也可以检查和独立的验证它们。但是经过一段时间之后,节点为了节省空间可能会删除老的证明。分开存储交易和证明的技术被称为隔离见证(你可能听到过它,最近在比特币中实现了)。在这种策略下,交易和证明被存储在区块两个分开的地方,而且可以独立的进行处理。
权益分配
权益分配是Cardano SL的另一个组成部分,虽然和代理者没有直接的关系, 但都可以通过它来获取相应的利润分红。
有些地址有多个拥有者,这也产生了一个权益计算的问题,因为每个追随中本聪算法的每个币对于每个股东的总权益而言只能计数一次。与余额(余额中币真正的数量)不同,权益赋予用户权利去控制不同的算法部分:成为领导者、进行投票更新系统、参加MPC/SSC。
权益分配是一个关联了每个地址的值。技术上说该值其实是地址属性的一部分,该值对应于下面三种情况下的某一种:
- Bootstrap时代分配。这是一个特殊的值,它是Bootstrap时代里面的受托者,但是它在Bootstrap时代之后还可以使用。
- 单个钥匙分配,这是指所有的权益会被分配给一个指定的股东。在这种分配情况下会包含股东的身份
- 多个钥匙分配,这是指权益会被分配给多个股东(最少两个)。在这种分配情况下包含一对"股东们的身份 - 一个输出的部分"信息。交易的输出都有一个值,该值的一部分就是权益
领导者选举处理过程和富人计算两者都考虑到了权益分配。
这个特征可以以类似的方式用在委托中,但是有点区别:
- 这里没有凭证:要撤销委托
A
必须要移动基金,提供不同的权益分配 -
A
的部分权益可以通过分配来委托。相反的是,委托需要你同时委托全部地址的基金
翻译作者: 许莉
原文地址: TRANSACTIONS IN CARDANO SL