翻译笔记:视频讲解 Corda 核心概念 – Transactions

翻译整理自 Corda 官方核心概念 Transactions 介绍视频,视频如下:

Transactions

  • 我们需要 Transaction 是因为有些时候我们需要多个 State 的交换同时发生。一个需要 Transaction 的例子就是收货与付款,我们需要将收到货物和付钱这两个 State 的交换同时发生,来避免只收到货没有付钱或者只收到了钱但是没收到货
  • 这个跟关系型数据库的 Transaction(事务处理)很类似,一旦某一步的操作出现错误,我们可以回滚(rollback)整个 Transaction,如果所有都成功的话就可以提交(commit)整个 Transaction
  • 在 Corda 中,Transaction 可以是 Committed 或者是 UnCommitted
  • Transaction 是改变账本数据的量子级的变化(关于这个量子级的变化,我们可以把它认为是把这个变化分成了非常细小的单位/步骤)
  • Transaction 会指向/消费掉 0 个或者多个 input states 并且可能会创建 0 个或者多个 output states。被消费掉的 state 就会被标记为历史记录(historic state)
  • Transaction 可以是三种类型:发布(Issuance),更新(Update)和退出(Exit) Issuance:向账本中添加 State Update: 更新 State 的相关属性,消费掉旧版本的 State 创建新版本的 State Exit: 只消费老版本的State(把其设置为历史记录) 而不创建新版本的 State,因为该 State 已经再也不需要了,比如已经到了合同结束日期

发行 Issuances

  • 在账本中创建新的 State,因为是新创建的 State,所以它不会去消费任何存在的 input state(也就是不会包含任何的 input ),而只是创建一个或者多个新的 output state。比如在账本中发行现金或者是同意了某一个交易

更新 Updates

  • 更新 State 的相关属性。比如在 Corda 中交换现金,我们会更新现金数据的对象,将所有者(owner) 的公钥(public key)修改为新的所有者的公钥
  • 我们会将最初 issuance 的 state 标记为历史记录然后在新的副本中更新 State 的属性

Input state 引用

  • Input State Reference 由两部分构成:Transaction ID 和 Index。Transaction ID 是操作该 State 的 Transaction 的哈希值(Hash value),Index 代表了该 State 在 Transaction 里的 output 列表的索引位置(由0开始)。所以如果想要找到某一条 State,需要知道它对应的 Transaction ID 以及它在该 Transaction 的 output 列表中的索引位置
  • 所以你不需要指定具体是哪一个 State 只需要告诉 Corda 它属于哪个 Transaction 然后所在的 output list 索引位置就行了

退出 Exits

  • 将上个 Version 的 State 置为历史记录,然后不增加新的 output state,这样就结束了 State 的生命周期
  • 即使 state 的生命周期结束了,你仍然可以查看这个 state 以前的所有历史记录

Transaction 可以非常复杂

  • Transaction 根据实际的业务需求可能会非常复杂,可能会包含 issuances, updates 和 exits
  • Transaction 可以包含各种类型的 states

Transactions 可以拆分或者合并 states

  • Transactions 可以拆分或者合并可替代资产(fungible assets),比如$10 可以换成两个 $5 或者 反过来两个 $5 可以合并为一个 $10,这些可以在 transaction 里进行

Transactions 的原子性

  • Corda 中的 Transaction 是一系列的无法再继续分割或简化的改动组成的,并且他们或者全部发生(如果所有 state 的转移都成功),或者一个都不会发生
  • Transaction 是一系列的量子级(最小单位的,不可再细分的)的改动来更新账本的操作

提交transactions

  • 账本中数据的改动是建立在相关的 Transaction 被提交(committed)的前提下的,而提交(commit)一个 Transaction 意味着所有涉及到的相关方都提供给了其数字签名,即签署同意了这个 Transaction
  • 数字签名会附加在当前的 Transaction 中
  • 只有当所有相关方都提供了数字签名后,Transaction 才会被提交并且去更新账本。但是这里其实还忘记提到了一点,即使所有的相关方都提供了签名,还需要满足通过 contract code 中的验证,才能被提交到账本中。

未提交的transactions

  • 未提交的 Transaction 指的是没有被所有的相关方签署的 Transaction,也指的是一个想要更新账本的一个提议(proposal)
  • 网络中的任何一方(节点)都可以提议一个 Transaction
  • 提议的 Transaction 可以基于需要知道的原则(need-to-know basis)来被相关方进行签名
  • 未提交的 Transaction 是指更新账本的一个提议

Transactions 提交过程

  • 数字签名会将 output state 强制地变为不可修改,因为想要修改一个已经提交的(committed)transaction 能够让相关方通过判断附加在该 transaction 中的数字签名很容易地识别出来
  • 另外因为一个新的 transaction 会通过 hash 关联到前一个版本的 transaction ,这也就创建了一种不可篡改的链式结构,就像 blockchain 一样。
  • 但是 Corda 只会将相关联的 transaction 关联到一起
  • 被提交的 transaction 能够使 output state 强制地变为不可篡改的,因为它已经具备了数字签名

Transactions 并不是命令

  • Transactions 并不是教你如何去更新账本,而只是一个更新账本的提议
  • 在 DLT中,transaction 经常会涉及到一个合约(contract),比如像以太坊(Ethereum)或者 Fabric,一个 transaction 会包括一些 code,这些 code 会在所有节点的电脑中去计算和更新账本中的 state。但是 Corda 并不是这样的,网络中的一方会提出一个更新账本的提议,然后其他各方会去验证对于账本的更新是否是正确的(valid)。你可以将 Corda 中的 transaction 看做是对于账本的更新是什么的一个提议,但是它不会去告诉你怎么去计算这些更新。
  • Corda 中网络中的任何一方都可以发布一个更新账本的提议(new transaction),该 transaction 中并不会包括怎么样去计算得到新的 output/state,而只是作为一个要把账本更新成什么样/新的 output 会是什么样的一个提议,只有需要知道(need-to-know basis)的相关方才会被要求去提供签名来 approve 这个 transaction 而且只有当所有相关方都提供了数字签名后 transaction 才会提交,账本才会被更新。

先提议然后确认

  • 创建一个 transaction 的提议和确认一个 transaction 的提议的逻辑是可以分开的
  • 相关方(who need-to-know)可以共享确认 transaction 的逻辑
  • 相关方可以使用自己的逻辑来创建新的 output
  • 例如创建 transaction 的一方可以使用自己的计算方式来产生一个溢价的方式,这其中是怎么做的你不用share 给不需要知道它的相关方
  • Transaction 提议是需要验证(verification)的,这个跟创建一个 transaction 是分开来做的

总结

  • 任何人都可以创建一个 transaction 提议(proposal)
  • 新创建的 transaction 都是 uncommitted状态
  • Transaction 被提交(committed)前需要得到所有相关方提供的签名,然后根据需要知道的原则(need-to-know basis)来进行确认,进行确认是通过 contract code来实现的,会在稍后说明
  • 一个 transaction 被提交之后,所以上一个版本的 state(input)将会被设置为历史记录(historic),然后新加进去的 output state反应了最新的账本信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注