精华内容
下载资源
问答
  • Corda_Project-源码

    2021-02-24 02:38:46
    Corda_Project 目标:使用自动化技术将示例Corda应用程序部署到Linux公共云计算机上。 内容 我的方法 概括 确定的问题 未来的改进 执行摘要 我的方法 冲刺1:手动部署应用程序。 这将为我提供部署CorDapp的第一手...
  • centos8安装corda

    2021-04-07 10:19:26
    centos8安装corda
  • 使用理论、实验室和用例探索整个R3 Corda生态系统。本书介绍了分布式分类账技术、Corda体系结构和Java中的智能契约编程,指导您进行测试和部署。此外,您将探讨金融、保险、医疗保健、旅行和农业方面的各种业务问题...
  • 这是实施合同时Corda编程模型的核心,尽管在生态系统的核心不是必需的-Corda中的许多功能都可以“支持”合同,实际上并没有与合同本身紧密耦合。 因此,至少在理论上,如果在某些用例中替代模型比UTXO具有明显的...
  • Corda: 分布式账本 由恒生研究院旗下区 块链技术社51chain真诚翻译 原著 :麦克 . 赫恩 2016年 11月 29日 一种 具有 节点间 最小 信任机制的 信任机制的 无中心数据库技术 中心数据库技术 中心数据库技术 ,允 许...
  • R3 Corda for Architects and Developers,With Case Studies in Finance, Insurance, Healthcare, Travel, Telecom, and Agriculture,2019年新书,介绍区块链联盟R3 柯达系统开发。
  • Corda架构

    千次阅读 2019-07-07 15:52:18
    Corda架构Corda的重要特性Corda网络Corda账本 Corda的重要特性 1.没有区块链,没有挖矿,是一个permissioned network 2.没有广播,是点对点的消息交流方式 3.用UTXO模型来记录状态(类似比特币) 4.基于JVM的...

    Corda的重要特性

    1.没有区块链,没有挖矿,是一个permissioned network。
    2.没有广播,是点对点的消息交流方式。
    3.用UTXO模型来记录状态(类似比特币)。
    4.基于JVM的平台,使用Kotlin编写(可以用Java,Clojure等)。

    Corda网络

    Corda网络是可验证的P2P网络,其中每个节点都是托管Corda服务并执行称为CorDapps的应用程序的JVM run-time environment。
    在这里插入图片描述
    • Corda网络是全连接的图
    • 没有全球广播或gossip网络
    • 通信仅在点对点的基础上进行
    • 数据是在need-to-now的基础上共享的
    • peer通过TLS使用AMQP / 1.0进行通信
    • 图的边表示通信的可能性,而不是持久性连接
    • 类似电子邮件和SMTP
    在这里插入图片描述
    网络中主要有下面几种成员:
    Doorman(门卫):执行有关信息节点在被允许进入网络之前必须提供的规则。 如果同意,则使用根权限签名的TLS证书对节点的标识进行认证。
    要加入网络,节点必须联系Doorman并提供所需信息。 如果通过验证,节点将从网络许可服务接收一个 root-authority-signed TLS 证书,(一个 TLS 证书和一个签名证书(signing certificate)作为 well know identity)。这个证书会在今后同其他节点的沟通中作为该节点的身份证明被使用。
    Nodes(节点):具有运行Corda的唯一网络标识的JVM run-time,具有两个接口:网络层(与其他节点交互)和RPC(与节点所有者交互)。
    Network Map Service(网络地图服务):发布IP地址,通过该地址可以访问所有节点以及节点提供的证书和服务。
    Notary(公证人):对账本更新验证唯一性和可能性。
    Oracles:众所周知的服务,如果他们陈述事实并且该事实被认为是信任则签署交易
    (使用Apache Artemis嵌入式消息服务的消息代理来实现日志关系型数据库存储数据)

    其他概念:
    Network Map Service
    发布可以通过其访问网络上每个节点的IP地址,这些节点的身份证书和它们提供的服务
    (用于负载均衡和网络可视化。地图是一种可以被缓存并分发到全网络的一种文档。因此地图不用要求高可用性:如果地图服务处于离线状态,新接入节点就没法注册到该服务,已接入的节点也没法分发相关状态变化出去,不过,其他的会一切照常进行。Network map类似于微服务中的 service discovery,Corda中节点的互相发现并不是通过广播的方式发生,而是通过注册Network map获取其它节点的信息,进而找到对方)
    Identity
    Corda的Identity可以代表组织的合法身份(用于交易中的各方)和网络服务的标识(用于提供与交易相关的服务)
    identity分为well konwn(众所周知的)或confidential(保密的),众所周知的身份是法人实体或服务的证书。 此证书将在网络地图服务中发布,供任何人访问。
    机密身份仅发布给使用identity参与交易的人。

    Corda账本

    在这里插入图片描述
    账本的特征:

    • 没有中心化的账本。每个账本是针对于每一个节点的,每个节点维护这一个独立的数据库(vault),有自己的账本结构,并且只维护自己的账本,只能看到自己的账本,没有节点能够知道所有的内容。
    • 一旦这些facts(类似于数据库中的rows)中的一个被网络中的多个节点间共享了的话,网络中的所有知道这个fact的节点的数据库会同时被更新。
    • 不是账本上的所有facts都是需要被共享的(比如图中的fact11就不被任何节点共享)
    • facts是不可篡改的,可以用来对某个静态的快照进行分析
    • 没有账户,易于并行交易
    • 由于依赖哈希函数来识别之前的交易状态,因此交易不可能乱序
    • 所有的历史记录都会被记录

    Corda的状态

    状态(state)是不可变对象,表示在特定时间点一个或多个Corda节点已知的事实。下图表示一个代表Alice欠了Bob £10的state。
    在这里插入图片描述
    state是通过将当前状态标记为历史状态并创建新状态来演变的。下图表示一个state的序列。
    在这里插入图片描述
    States 可以包含任何的数据,这就允许了它可以代表任何的类型的事实(比如股票,借款,KYC 数据,身份数据等等)。
    state图中,右边是数据本身,例如图中描述了 Alice 欠 Bob 的10美元的情况;左上是这条数据所关联的 contract;左下是 participants,Corda 不会在每个节点上记录每笔交易,participants 表示哪些节点需要记录这条 state 数据。
    state 是不可篡改的,当真实世界中的事实发生变化时,Corda 会将已经成为历史的 state 标记为 consumed。
    Corda 网络中的每一个节点都维护着一个 vault,它是一个关系型数据库,其中跟踪了所有 states 的当前以及历史的 states 数据,当然每个节点只能够看到跟它有关的数据。如下图所示。
    在这里插入图片描述

    Corda账户模型–UTXO

    UTXO模型中,交易处理的基本单位是一个交易记录,任何一个交易的输入都是某一个交易的输出。UTXO的消费是不会掰开花的,只能拿出合适的一个全花出去,然后接受对方找零(其实不是对方找零,而且比特币交易系统自动为我们做的找零操作,UTXO接收方(目标地址)是感知不到的)。
    所有的交易输入都必须来自于前面一个或者几个交易的UTXO输出,并且每一笔的交易支出总额等于交易收入总额。
    在这里插入图片描述
    举个例子:
    operations:
    (1)A给X支付一笔5个比特币;
    (2)B又给X支付一笔2个比特币;
    (3)C给X支付一笔1个比特币;
    (4)X给其他某个人转出支付一笔3.5个比特币。
    results:
    (1)之后,X钱包里有一笔大小为5的UTXO收入交易记录,共一笔,净UTXO:5
    (2)之后,X钱包里有一笔大小为5的和一笔大小为2的UTXO收入交易记录,共两笔,净UTXO:7
    (3)之后,X钱包里有一笔大小为5的,一笔大小为2的和一笔大小为1的UTXO收入交易记录,共三笔,净UTXO:8
    (4)之后,X的钱包里基于(3)的基础上,新增一笔支出大小为5个UTXO,然后新增一笔大小为1.5的收入交易记录。净UTXO:3–>4.5

    Corda交易

    Corda 使用 UTXO模型来使账本上的每条 state 都不可更改。对于账本上数据的变更都是通过使用 transaction 的方式来做的,就是将0条或多条已经存在的 input state 的记录变为历史记录,然后再新增0条或多条新的 output state。
    一笔交易如下图所示:
    在这里插入图片描述
    注意:

    • 交易可以包含任意类型的任意数量的输入和输出。
    • 可以合并或拆分可替代资产(例如将2美元的state和5美元的state合并为7美元的state)。
    • 交易是原子的:要么接受所有交易的更改,要么都不接受。
    • 任何节点都可以创建交易提案
    • 默认情况下,交易提案是未提交的状态
    • 有两种基本类型的交易: 公证变更交易(用于更改state的)和 一般交易(用于其他)

    交易链

    仅仅验证提议的交易本身是不够的。我们还必须验证导致创建交易输入的交易链中的每个交易。transaction 中包含的 input 应该是在账本中已经存在的,应该是前一个 transaction 添加进去的 output。所以我们需要在新的 transaction 中引用这些已经存在的记录,然后把他们在账本中消费掉(consume,本质上是设置为历史记录)
    这些 Input state 的引用包含两部分:创建这个 input 的 transaction 的 hash 和这个 input 所指的前一个 transaction 带来的 output state 在 output list 中的位置或者说索引值。
    在这里插入图片描述
    一个交易链的例子:
    在这里插入图片描述

    提交交易

    在这里插入图片描述
    要提交事务,必须满足以下条件:

    • 交易有效性:
      • 该交易具有合约有效性
      • 该交易由所有要求方进行数字签名(为了成为真正的一笔交易,transaction 必须要获得所有需要的签名。每一个要求的签名者会将签名附加在 transaction 上来表示他们已经同意了这次更新。通过在 commands 中列出的所有的公钥信息,我们就知道了这个 transaction 里所有要求的签名人的列表)
      • walking the chain(仅仅检查提议的交易本身信息是不够的。我们还需要检查跟产生当前这个 transaction 的 inputs 有关的所有以前的 transaction 链。这被称作 walking the chain)
    • 其他有效性:oracle,时间戳,附件(有些时候,我们会有一些数据可以在不同的 transactions 中被重用。比如:一个公共假期的 calendar,支持的法律文档,一个货币代码的表格。针对这些中情况,我们使用附件。一个 transaction 可以通过 hash 引用 0 个或者多个附件。这些附件是 ZIP/JAR 文件,可以包含任何内容。这些附件中信息可以用来验证 transaction 的有效性。),TimeWindow(一些时候,我们希望一个交易仅仅在一个指定的时间点被批准执行。例如:在一个指定的日期之后执行一个选项,一个债券只能在它的过期日期前被赎回。在这些情况下,我们给 transaction 添加一个 time-window。time-windows 制定了交易会在哪个时间点被提交。
      )…
    • 交易唯一性(通过Notary验证):没有其他已提交的交易消耗了我们提案的交易的任何输入

    复合密钥

    为了映射自然世界中各种复杂的多方交易,Corda中引入了“复合公钥”(composite-keys)。其中的公钥以树结构组织:所有的叶子节点就是各个参与方的key,指定了权重,上层节点则约定必须达到的加权阈值。
    一个签名集合的有效性可以通过这样 的方式确认:从底往上行经这棵树,对其中所有具有有效签名的密钥的权重求和,并与阈值相比较。通过使用权重和阈值,可以编码多种多样的情况,包括 使用 AND 和 OR 的布尔表达式。
    比如下面这个例子中,三人的公钥权重默认都是1,那么整个command有效的条件是:“alice和bob都要签名”或“只要charlie签名”。
    在这里插入图片描述

    智能合约

    合约有效性是指:

    • 每个state都指向一个合约
    • 合约执行是确定性的,它对交易的接受仅基于交易的内容
    • 一笔有效的交易必须被包含它的每个输入和输出状态的合约接受

    合约的限制
    交易是否accept仅仅基于输入的transaction的内容:检查 inputs,outputs,commands 的数量,时间,附件等。
    contract 来判断 transaction 是否有效是在一个具有确定性结果的 sandbox 中进行的。因为 contract 没有办法访问到外部的信息,它只能检查 transaction 自身的有效性,比如它不能够检查确认当前这个 transaction 是不是已经同其他相关方达成了共识取得了其他方的确认。
    所以在各方提供最终的签名确认之前,各方应该对transaction 的内容进行检查来确定他们是否同意这个对账本的更新,即使这个 transaction 是合约有效(conceptual valid)的。任何一方是不会因为 transaction 是 contractually valid 就能够去提供签名。比如他们可能不愿意去提供一个巨额的借款,或者可能不会同意购买一个资产花费的钱的金额,虽然这些能够正常地通过 contract code 的验证,即 contractually valid,但是还是不会去接收这个 transaction 的。
    在这里插入图片描述

    Notary(公证人)

    Notary可以避免双花。一个网络中可以有多个 notaries,一个notary服务可以分布在不同节点上,每个 state 都会有一个指定的 notary,而且 notary 也只会去公正那些 input 指定它为公证人的 transaction。
    每一个 notary 运行一个不同的共识算法(consensus algorithm)。
    为了负载均衡,可以将交易负载分散到多个notary上,为整个平台提供更高的吞吐
    为了降低延迟,可以通过选择物理上更接近交易方的notary,最大限度地减少延迟

    当单个事务需要消耗具有不同指定公证人的几个状态时,或者当一个节点由于隐私或效率问题而倾向于为给定的交易使用不同的公证人时,会更换公证人。
    注意,一个合法交易的所有输入必须基于同一个notary
    在这里插入图片描述
    Notary如何避免双花呢?看看下面的例子:

    • Alice要通过一个交易把10元的资产转移给Dave的时候,如果这笔资产没有在之前转移给别人,那么任何一个Notary当然都不可能在自身的数据库中查到使用过的记录,因此都会认为这个10元钱的资产状态是有效的。
    • Alice想要实现“双花”攻击,也就是把这笔资产同时转给Carol、Dave,他会怎么做?此时如果他选择N1来做这两笔交易确认的话,N1作为验证者,无论是采用任何同步、串行等机制,一定会实现根据历史状态查出这个资产已经转移过一次的信息,从而拒绝这两笔交易中还未成功的那个
    • Alice选择将这两笔交易分别发送给N1、N2进行确认,期望有可能进行攻击。每个状态会有一个notary“字段”,要求那个发现待验证交易的一个输入项对应的notary不是自己的时候做出反应(在这个例子中是N2),他会拒绝验证那些包含notary属性不等于自己的状态的交易,因为这笔资产的状态对应的notary一定是N1
    • Alice从Bob和Carol那里分别收到10块钱,其中与Bob的交易是N1确认的,与Carol的交易是N2确认的。他要把这20块钱给Dave
      • Corda专门设计了一种交易类型——notary变更交易,用于将一个状态在两个notary之间转移。

    Oracle

    这个Oracle不是数据库的Oracle,而是一种服务。在许多情况下,交易的合约有效性取决于某些外部数据,例如当前的汇率。一个事实可以作为command的一部分包含在交易中。Oracle是一种服务,只有在包含的事实为真时才会对交易进行签名。
    为了给一个 transaction 提供签名,Oracle 需要看的唯一的信息就是 transaction 里边的 command。向 Oracle 提供任何其他的信息会造成信息泄露。相类似的,一个 non-validating notary 只需要看到 transaction 的 input states 而不需要关注 contract code 是怎么写的,如果把 contract code 也发给了 non-validating notary 的话也会造成信息泄露。
    因此用到了一个技术叫做Transaction tear-off
    oracle需要看到的唯一信息是它们的嵌入的command。
    同样,non-validating公证人只需要查看交易的输入状态。
    使用Merkle树“tear off”oracle /公证人在向他们签名之前不需要看到的交易的任何部分。
    在这里插入图片描述

    在这里插入图片描述

    Flows

    Corda 使用了 flows 来步骤变得自动化。一个 flow 是一系列有顺序的步骤来告诉一个节点应该如何实现一个指定的账本更新,比如发行一个资产或者结算一笔交易。
    Flow是Corda中控制参与节点如何更新State的自动化流程,它对如何获取交易方的签名进行了封装。一个标准的flow流程包括获取链上数据,创建一笔交易,自签名之后发送给对方方进行交易验证,再签名,最终在双方的账本上分别提交交易。Corda网络上的节点之间可能拥有数千个交易方和数十万个并发流。
    一旦一个业务流程被封装在了一个 flow 中并且在节点中作为 CorDapp 的一部分被安装好之后,节点的 owner 可以在任何时间通过使用一个 RPC call 来告诉节点开始这个业务流程。Flow 将所有的网络,I/O 和并发问题都抽象了出来,这个节点 owner 就不需要关注这些了
    节点上所有的动作都是发生在这些 flows 的上下文上的。与 contract 不同,flows 不是在 sandbox 里执行的,也就是说节点可以在执行一个 flow 的过程中来进行一些动作比如 networking,I/O 或者随机地使用一些资源。
    下面是一个转账的Flow例子:
    在这里插入图片描述
    在这里插入图片描述

    结尾附上Corda架构图:
    在这里插入图片描述
    CorDapp:
    在这里插入图片描述
    Corda节点架构:
    在这里插入图片描述

    展开全文
  • Corda允许您构建可互操作的区块链网络,并在严格的隐私下进行交易。 Corda的智能合约技术使企业能够直接进行有价值的交易。 拉请求是欢迎的! 内容 文献资料 文档-Corda文档。 万物的去处。 技术白皮书-Corda的...
  • corda 我最近启动了一个针对特定用例的Corda性能的项目。 该项目的结果使我们在170多个节点的网络上一天之内处理了1.15亿个请求。 此外,Corda每秒能够处理6300个请求,确认满足了网络的最高要求。 迄今为止,这是...

    corda

    我最近启动了一个针对特定用例的Corda性能的项目。 该项目的结果使我们在170多个节点的网络上一天之内处理了1.15亿个请求。 此外,Corda每秒能够处理6300个请求,确认满足了网络的最高要求。 迄今为止,这是迄今为止已部署的最大的Corda网络,并且实现了最高的吞吐量。 证明Corda可以在非常苛刻的环境中交付。

    这项研究是由埃森哲(Accenture)为DTCC进行的,该公司还研究了另一个DLT平台数字资产。 有关更多信息,请参见新闻稿。

    DTCC宣布研究结果,表明DLT可以支持美国股票的交易量…
    突破性的研究表明,DLT每天可处理超过1亿笔交易纽约/伦敦/香港……www.dtcc.com

    在这篇文章中,我将利用我在该项目中获得的经验来描述如何还可以从Corda中获得最大收益。 我希望不久的将来将会有与我们为DTCC所做的类似的项目,并且我希望这里的信息将有助于向其他开发人员指明正确的方向。

    结果怎么样? 好吧,这并非没有困难。 但是,我认为我们做得很好。 更确切地说,我们证明,如果精心设计网络并精心设计CorDapp,Corda可以实现高吞吐量。 是的,我知道我基本上是在说,如果您做的一切正确,那么一切都会很好。 真的很重要。 在整个项目中调整CorDapps时,我们发现了可大大提高应用程序性能的途径。 进行这些更改可以使我们越来越接近我们的目标。 但是,如果我们不以特定方式设计网络,那么这一切都将无关紧要。

    需要Corda Enterprise来实现最高的性能
    这是将性能提高10倍或将计算机的内核数提高最简单的方法。 除其他事项外,Corda Enterprise允许在节点内运行的Flow Worker的数量从1增加到很多。 这影响了可以在节点内异步运行的流的数量。 但是,这不会改变在每个版本上以相同速度运行的各个Flow的性能。 实际上,没有企业版,您将永远无法实现极高的性能目标。

    如果您的用例不需要达到这种性能,那么开源版本将满足您的需求。 例如,由于DTCC处理的请求量和需要处理的比率非常大,因此我们100%需要将Enterprise用于我们的项目。 另一方面,如果我们要处理贷款的处理和加工。 与DTCC的需求相比,流经节点的请求速率将大大降低。 在这种情况下,使用开源就足够了。

    方便地,企业代码和开放源代码兼容,使您可以轻松切换。 部署方面存在差异,并且在进行更改时很有可能需要摆弄这一方面。

    企业版本和开放源代码版本之间的兼容性使您可以同时尝试两者,从而确定最适合您的需求。 这样,您就可以开始在开源上编写应用程序,直到认为有必要切换到企业版为止。

    考虑一下您的网络
    我确实非常想强调网络体系结构的重要性。 我什至不想考虑如果坚持我们的原始设计将会获得的性能。 实际上,我们取消了原始设计,因为它存在根本缺陷,并且会阻止实现我们目标的任何希望。 就个人而言,我认为这部分是关于Corda的一半,一半是关于设计好的解决方案的。

    分片以提高大规模性能
    在撰写本文时,Corda不支持负载平衡。 当前,单个节点为其代表的身份处理所有工作。 这是他们充分意识到的领域,也是他们在不久的将来要努力进行的工作。 如果在那里,那么可能有可能仅仅依靠旋转大量支持单个Corda节点的实例。 这将导致更多的计算能力,从而提高吞吐量。

    由于负载平衡尚未准备就绪,而且我们只有一个参与者坐在网络中间,这是处理请求的巨大瓶颈,因此我们不得不以不同的方式处理整个网络设计。 作为补偿,我们必须考虑一种方法,以便将我们自己的水平缩放比例提供给系统,因为必须删除位于中间的单个节点。 如果不解决这些问题,我们将无法实现每秒6300笔交易的网络吞吐量。

    我们的解决方案? 分片。 我们确定了一种方法,可以从逻辑上将这个参与者分解为很多很多小的部分。 每个处理请求彼此并行。 这需要一些额外的逻辑来将请求路由到正确的分片节点。 但是,此解决方案可能节省了项目。 我们从未测试过单个瓶颈节点的性能,但是,我100%确信我们不会达到目标。

    下面我提供了两个图表。 一种使用单节点设计的示例过程,另一种采用分片方法。

    单节点

    科尔达故事

    分片

    科尔达故事

    我将让图表说明一切。 由于该信息仍然是机密的,因此我将不进一步研究该实现。 那里应该有足够的信息来理解我们为什么做和做什么,而不是我们如何实现。

    您可以想象第二种设计将产生更高的吞吐量。 它还具有在将节点添加到网络时线性扩展的优势。

    使用原始设计时,吞吐量对于少量节点可能是可以接受的。 但是,当您遇到较大的数字(例如100),甚至可能只有10时,您将注意到性能下降。 这完全是由于整个网络都依赖单个瓶颈节点可以处理请求的速率。

    消除多个公证人的额外瓶颈

    可以提高网络整体性能的另一个领域是使用多个公证人。 当网络的吞吐量已经很高时,单个公证人将开始成为工作流程的瓶颈。 遵循与上一节相同的想法。 公证人可以分片。 允许每个人处理较小数量的交易。

    每当我说“多个公证人”时,我只是想澄清一下我不是在谈论公证人团体。

    我已经写了一篇有关利用多个公证人提高网络吞吐量的文章,涵盖了这个主题,而不是重复我自己,我将带你去那里。

    科尔达故事

    调整那些Cordapps

    在Cordapps上。 您可以在这里做很多事情来提高性能。 大部分来自尝试尽可能少地做。

    • 我需要发送所有这些交易吗?
    • 对方是否真的需要签署此交易?
    • 我的交易上有太多状态吗?
    • 发起方和交易对手之间的流跳了多少次?

    这些都是对流程性能至关重要的问题。 我敢肯定还有其他地方可以提高性能(稍后我会介绍),但这是我现在唯一想到的地方。 我确定你知道图片。

    让我们快速看一下最后一个问题。

    • 发起方和交易对手之间的流跳了多少次?

    这实际上涵盖了我提出的其他一些观点。 无论如何。 每次跨网络跳转时,Flow的性能都会下降。 它需要从一个Corda节点传播到另一个节点,并且可能需要在某个时候回来。 在此期间,由于网络延迟和将流指向磁盘的检查点的过程,您正在积累性能成本。

    网络延迟可以说明一切,不需要进一步说明。 另一方面,检查点需要充实一些。 检查点是序列化Flow当前执行的过程,以便在发生故障时可以从特定点重新启动它。 这样做需要序列化整个Flow堆栈,这可能会很大,因此要执行的过程成本很高。

    考虑到此信息,请确保您考虑是否真的需要进行这些跳跃。 尽量减少它们。 如果这样做,我相信您会看到应用程序性能的提高。

    这对性能有好处吗?

    对对对。 虽然,我们没有衡量包括多线程在内的影响,但我确信它取得了很好的改进。 但小心点。 如果操作不正确,可能会有点麻烦。 在撰写本文时,Corda不支持Flows中的多线程。 如果这样做,您将得到一些奇怪的错误。 话虽如此,这是可能的。 您可以在Corda服务中执行此操作,该服务在Flow的范围之外运行。 通过将一些处理委托给服务,我们能够利用线程来启动新的Flow,每个Flow都是异步运行的,处理相似但分离的任务。

    我在之前的Corda Services异步流调用文章中对此进行了介绍,该文章深入探讨了该主题,并解释了为什么您在尝试该方法时可能最终陷入困境。

    科尔达故事

    使用Corda感觉如何?

    我发现使用Corda相对简单。 当您尝试实现更复杂的用例时,确实会变得更加困难。 但是,在大多数情况下,许多流程可以遵循相同的简单结构。 在交易中添加一些状态,进行验证,让所有必要的各方签署并提交交易。

    随着事情变得越来越复杂,您需要牢记哪一方需要做什么。 例如,花费现金。 作为发起者,您不能将他人的现金状态放入交易中。 您需要向他们发送一些信息,并要求他们将其添加到交易中。 像这样的场景花了我一段时间来处理。 随着越来越多的开发人员花时间在Corda上工作,我相信这些概念将变得更容易理解。 将发布更多示例,并将分发有关如何编写良好Flow的知识。

    此外,我支持Corda提出的关键概念 。 仔细阅读这些内容和提供的文档后,我对Corda的理解大大提高了。

    关键概念– R3 Corda V3.3文档 本节介绍Corda平台的关键概念和功能。 适用于 docs.corda.net的新手。

    向前进

    现在,我不代表Corda或R3,但是由于我们在整个项目中都与他们紧密合作,因此我可以说该平台可能有所改进。

    • 使部署多个Corda节点更加容易。 R3与我们合作产生了一个框架,可以更轻松地部署节点,可以对其进行适应和推广,以使其适合更广泛的受众。
    • 性能。 Corda代码中的一些区域可以进行调整,以便为获得良好的性能而让路。
    • 更好的多线程。 如前所述,这可以在Corda Services中完成,但有可能将其中一些转移到Flows中。 主要侧重于异步启动多个subFlow并等待其完成。

    结语

    在项目快要结束时,它肯定很忙,但是我们在1个月内就能够实现巨大的性能提升,这是疯狂的。 一旦我们改进了CorDapp,以充分发挥其性能,我们的人数便从““”升至“哇”。 值得庆幸的是,我们正确地设计了网络,以使这些数字成为可能。 如果网络没有按照原来的方式组合在一起,那么世界上所有的调整都将无法挽救它。

    因此,Corda能否获得良好的吞吐量? 是。 是的你可以。 使用Corda Enterprise可以实现更高的性能目标,并且可以减少最终工作量。 但是,这并不是正确的想法。使用本文中介绍的信息,您应该对如何设计高性能Corda应用程序或网络有更好的了解。

    展望未来,Corda的性能只会越来越好。 将其与如何设计应用程序的好主意相结合,应使您的数字从屋顶冒出来。

    最后,在关闭这篇文章之前,我只想感谢R3,尤其是Stefano在此项目期间与我们紧密合作。

    如果您发现此帖子有帮助,可以在Twitter上@LankyDanDev关注我,以了解我的新帖子。

    翻译自: https://www.javacodegeeks.com/2018/12/throughput-corda-story.html

    corda

    展开全文
  • CORDA是一个开源区块链项目,从一开始就为业务而设计。只有CORDA允许您构建在严格保密的情况下进行交易的可互操作区块链网络。CORDA的智能合约技术允许企业直接交易,有价值。
  • corda 自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章。 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux...

    corda

    自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章。 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux。 为什么这样 第一,因为我们可以。 第二,因为它允许我们流式传输来自Corda节点的事件。 这使我们能够跟踪流的进度或检索对Vault的更新,并将其发送给注册到相关端点的任何客户端。 将WebFlux与Corda结合使用确实会带来一些问题。 有些来自Corda,有些来自Spring。 虽然,Spring问题与我有关,但我期望Spring Boot + WebFlux组合默认对我有更多作用。

    科尔达

    在这篇文章中,我假设您对Corda有一定的经验,但是如果您确实需要有关Corda的一些信息,我建议您阅读我以前的文章: 什么是CordaCorda 开发 。 此外,我还建议您看一下使用Spring WebFlux做事,作为WebFlux的介绍。

    本教程的内容将使用Corda的3.2开源版本。 我实际上是根据3.1开始写这篇文章的,但是在此期间发布了较新的版本。 因此,有一些基于在这些版本之间移动的注释。

    我们还将在Kotlin中实现所有内容,但本文的内容也可以在Java中实现。

    示例应用程序简介

    我们将为一个非常简单的应用程序建模,该应用程序不会提供太多使用,因此,出于这篇文章的目的,我将它们一起打包。 该应用程序将由一个发送方(由MessageState表示)的一方发送给另一方。 为此, SendMessageFlow将运行,一旦运行,双方将拥有消息的副本,仅此而已。 简短而简单,但应为我们提供足够的知识来证明WebFlux如何与Corda配合使用。

    结构体

    通常,我从查看依赖关系开始。 尽管由于将代码分成了单独的模块,所以最好先查看小示例应用程序的结构。

    +-- app
    |   +-- {spring code}
    |   +-- build.gradle
    +-- cordapp
    |   +-- {flow code}
    |   +-- build.gradle
    +-- contracts-and-states
    |   +-- {contracts and states code}
    |   +-- build.gradle
    +-- build.gradle

    这是应用程序结构的快速视图。 app将包含所有Spring代码,并将通过RPC委托给Corda节点。 cordapp模块包含流逻辑, contracts-and-states按照名称的建议进行操作,并包含契约和状态代码。 cordapp模块和contracts-and-states模块都打包到Cordapp Jars中,并转储到Corda节点中。

    这些模块中的每个模块都包含一个build.gradle文件,该文件包含其相关的构建信息和相关性。 由于本文不是直接着眼于编写Corda代码,因此我们将不继续详细研究每个模块及其构建文件。 取而代之的是,我们仅在帖子末尾重新整理流代码,以便我们专注于Spring实现。

    Spring模块的依赖

    以下是app模块的build.gradle文件(包含Spring代码):

    我不是Gradle的专家,因此该代码段中可能有一些可以做得更好的事情,但它确实可以做到。

    因此,我想强调一些事情。 使用Spring Boot 2.0.3.RELEASE并与此kotlin-spring使用,使用kotlin-spring插件向所有标有某些Spring注释的Kotlin类添加open 。 这在很多情况下都是必需的,因为Spring要求某些类是非最终的。 这在Java中不是问题,但对于Kotlin来说是有问题的,因为默认情况下所有类都是final。 有关该插件的更多信息,请访问kotlinlang.org

    spring-boot-starter-webflux了WebFlux依赖关系以及常规的Spring Web服务器代码,以使一切正常运行。

    rxjava-reactive-streams ,这是一个有趣的问题,稍后我们将看到它的作用。 由于Corda使用RxJava 1.xx而非较新的RxJava2,因此其Observable不会实现Spring WebFlux用于返回React流的Java 8 Publisher接口。 此依赖关系将这些较旧的Observable转换为Publisher因此它们与WebFlux兼容。 我们稍后会在查看代码进行转换时再次谈到。

    最后, netty-all版本被强制为4.1.25.Final以解决依赖关系问题。

    路由功能

    WebFlux引入了一种功能性方法,用于将请求路由到处理请求的功能。 有关更多信息,请参见使用Spring WebFlux进行操作 。 我不想深入探讨WebFlux的工作方式,但我们将快速定义路由功能。 主要原因是由于使用Kotlin而不是Java。 Kotlin提供了使用DSL定义功能的另一种方法。

    以下是定义本教程路由的代码:

    routes bean接收MessageHandler bean(我们将在后面进行讨论)并将两个URI映射到该MessageHandler找到的函数。 与Java实现相比,DSL允许的版本略短。 此片段中有几个部分需要重点关注。

    ("/messages")定义两个路由功能的基本请求路径。 DSL允许功能从此基本路径嵌套自己,并帮助传达路线的结构。

    一个函数在发送请求后返回的响应中接受TEXT_EVENT_STREAMtext/event-stream ),同时还将APPLICATION_JSONapplication/stream+json )指定为正文的内容。 由于我们已经定义了Content-Type ,因此在大多数情况下,我们可以假设我们将发送一个POST请求(就是这样)。 POST从以前的配置中进一步嵌套,并添加了另一个MessageHandler函数来接受请求。

    第二个功能从Corda节点接收更新。 为此,它返回APPLICATION_STREAM_JSON并期望将GET请求发送到/messages/updates

    处理函数

    在本节中,我们将看一下上一节中几次提到的MessageHandler 。 此类包含执行实际业务逻辑的所有功能。 路由只是达到这一点的一种方法。

    我以前的文章“用Spring WebFlux做事”将比本文更深入地解释这些示例中更多WebFlux的特定部分。

    下面是处理程序代码:

    首先,我们应突出显示NodeRPCConnection类及其类型为CordaRPCOps的属性proxy 。 我从示例Corda和Spring应用程序 (由R3员工编写)中窃取了NodeRPCConnection 。 长话短说, NodeRPCConnection创建到Corda节点的RPC连接,并且proxy返回CordaRPCOpsCordaRPCOps包含所有可用的RPC操作。 这就是Spring与Corda节点交互的方式。

    让我们仔细看看updates功能:

    此功能返回新消息,将其保存到Vault中。 如果您有一个监视来自Corda节点的更新的应用程序,则这种端点非常有用。

    此代码段中与Corda相关的代码全部包含在trackNewMessages函数中。 它使用CordaRPCOpsvaultTrackBy访问保管库服务,并开始跟踪对任何MessageState的更新。 由于我们尚未将任何参数传递给该函数,因此它将仅跟踪UNCONSUMED状态。 vaultTrackBy返回一个DataFeed对象, DataFeed对象可以用于通过snapshot属性检索保管库的snapshot也可以通过访问updates属性来返回一个Observable以允许其订阅更新事件。 这个RxJava Observable是我们用来将数据流回调用者的工具。

    这是我们需要使用我前面提到的rxjava-reactive-streams的第一个实例。 toPublisher方法接受一个Observable并将其转换为Publisher 。 请记住,WebFlux需要Java 8兼容的React式流库,这些库必须实现Publisher 。 例如,Spring倾向于使用提供MonoFlux类的Reactor

    创建Publisher ,需要将其馈送到ServerResponse 。 由于目前一切顺利,我们将通过ok方法返回200响应。 然后将Content-Type设置为APPLICATION_STREAM_JSON因为它包含流数据。 最后,响应的主体从trackNewMessages中获取Publisher trackNewMessages 。 现在,端点已准备好由发出请求的客户端进行订阅。

    现在,完成了从节点到客户端的流更新功能。 实际保存新消息怎么办? 此外,是否有任何信息可以传递给发送者有关执行流程的信息? 因此,让我们回答这两个问题。 是的,我们可以使用WebFlux保存新消息。 是的,流程可以返回其当前进度。

    下面是post函数的代码,该函数在流的流进度时将新消息保存到发件人和收件人的节点上:

    proxy.startTrackedFlow启动一个流程,该流程的进度可以由添加到该流程的任何ProgressTracker跟踪。 此类中定义的startTrackedFlow委托给上述函数,并返回其progress属性; 一个Observable<String>其事件由ProgressTracker的进度组成。

    传递到流中的MessageState是从请求传递的Message对象创建的。 这是因为它包含的信息比MessageState本身少,因此可以更轻松地将消息数据输入到端点。 parseMessage传递的字符串X500名称转换为CordaX500Name ,然后假定存在网络中,转换为网络中的Party

    然后通过created方法将其打包到响应中。 指定Content-Type来告诉客户端它包含text/event-stream 。 消息的路径使用在执行流之前创建的UUID 。 例如,这可以用于检索特定的消息,但是您需要自己实现该消息,因为我太懒了,因此本文不做。

    创建一个客户

    现在已经设置了端点,我们应该创建一个可以发送请求并使用发送回它的流的客户端。 稍后,我们将简要地看一下流代码,以更全面地了解正在发生的事情。

    为了将请求发送到响应式后端,Spring WebFlux提供了WebClient类。 发送请求后, WebClient可以对响应中发送的每个事件做出React。 下面的MessageClient就是这样做的:

    MessageClient包装并使用WebClient将请求发送到WebClient的构建器中指定的地址。 在该课程中,关于反序列化还有一些额外的配置,但是我想暂时重新介绍一下,因为还有一部分内容涉及该主题。

    和以前一样, 使用Spring WebFlux做事提供了WebFlux特定方法的深入解释。

    因此,让我们单独查看每个请求,首先将POST请求发送到/messages端点:

    post方法创建一个用于指定请求内容的构建器。 这应该与我们之前定义的端点匹配。 建立请求后,请调用exchange方法将其发送到服务器。 然后将响应的主体映射到Flux<String> ,以使其可以订阅。 那就是使用React流的本质。 订阅响应后,客户端将决定对每个事件执行他们希望执行的任何处理。 在这种情况下,它只是打印出ProgressTracker的当前步骤。

    如果我们通过这段代码发送请求,我们将收到以下信息:

    STEP: Verifying
    STEP: Signing
    STEP: Sending to Counterparty
    STEP: Collecting signatures from counterparties.
    STEP: Verifying collected signatures.
    STEP: Done
    STEP: Finalising
    STEP: Requesting signature by notary service
    STEP: Broadcasting transaction to participants
    STEP: Done
    STEP: Done

    这些是SendMessageFlowProgressTracker定义的步骤。 是的,我知道我还没有向您显示该代码,但是请相信我。 真的没有太多其他。 如您所见,流返回的每个字符串值都将“ STEP”附加到自身

    现在进入到/messages/update端点的GET请求:

    同样,在这一点上没有什么可显示的。 但是,在幕后,实际上需要大量工作才能使它工作。 我需要打通电话才能解决的所有问题都围绕着序列化和反序列化。 我们将在下一部分中进行介绍。

    对此请求的响应如下:

    UPDATE: 0 consumed, 1 produced
    
    Consumed:
    
    Produced:
    56781DF3CEBF2CDAFACE1C5BF04D4962B5483FBCD2C2E428352AD82BC951C686(0)
    : TransactionState(data=MessageState(sender=O=PartyA, L=London, C=GB, 
    recipient=O=PartyB, L=London, C=GB, contents=hello there, 
    linearId=1afc6144-32b1-4265-a06e-73b6bb81aef3_b0fa8491-c9b9-418c-ba6e-8b7840faaf30, 
    participants=[O=PartyA, L=London, C=GB, O=PartyB, L=London, C=GB]), 
    contract=com.lankydanblog.tutorial.contracts.MessageContract, 
    notary=O=Notary, L=London, C=GB, encumbrance=null, 
    constraint=net.corda.core.contracts.WhitelistedByZoneAttachmentConstraint@4a1febb5)

    关于此端点的好处是,它现在与节点保持连接,该节点将继续将所有相关更新发送回此客户端。 上面的请求是原始POST消息的更新。 客户端收到的任何新事件都会在客户端上输出更新。 这就是使此类端点非常适合触发进程或仅在与Corda节点本身分开的前端上显示最新数据的理想之选。

    序列化和反序列化

    在本节中,我想集中精力正确设置序列化和反序列化。 从/messages/updates端点检索到的数据需要正确地序列化其数据,以传递给客户端,客户端也需要能够反序列化响应数据。

    通常,Spring会为您做很多事情,而且仍然会做,但是WebFlux似乎需要一些额外的步骤才能正确设置它。 免责声明,这是根据我的经验,如果您知道执行此操作的更好方法,我将很高兴收到您的来信。

    Corda Jackson支持

    Spring默认情况下倾向于使用Jackson,并且很方便地,Corda本身提供了很多Jackson设置。 JacksonSupport.cordaModule为诸如PartyCordaX500Name类的类提供了一些序列化和反序列化。 如果在某些基本情况下需要对Corda类进行序列化或反序列化,则这可能会满足您的需求。 在Spring中,您可以创建一个默认的ObjectMapper将检索并添加到其自身的bean。

    但是,此路线有一些警告。 由于模块依赖于ObjectMapper可以访问节点信息,例如通过RPC客户端CordaRPCOps访问节点信息,因此无法反序列化某些类。 否则,反序列化PartyAbstractPartyAnonymousParty将会失败。 不仅如此,由于不安全,此功能现已从Corda 3.2弃用。 JacksonSupport.cordaModule也已移入其自己的类( CordaModule )。

    我下面提供的解决方案也是Corda从现在开始建议采用的解决方案。

    以下是MessageClient/messages/updates端点检索更新时引发的异常(对于本节的其余部分,将使用相同的端点):

    com.fasterxml.jackson.databind.ObjectMapper cannot be cast to net.corda.client.jackson.JacksonSupport$PartyObjectMapper

    由此,我们可以确定我们的ObjectMapper类型错误,并且实际上需要是PartyObjectMapper的子类型。 再进一步,我们可以看到在JacksonSupport类中也找到了该映射器。 现在,剩下要做的就是创建这个映射器,并使用它而不是默认的ObjectMapper

    因此,让我们看看如何做到这一点:

    这将创建一个RpcObjectMapper ,它实现PartyObjectMapper并利用RPC检索节点信息,从而可以反序列化各种参与方类。 在createDefaultMapper, CordaModule了之前的CordaModule ,并感谢Spring,对于大多数需要序列化或反序列化的实例(以后要特别注意),它现在是默认的对象映射器。

    一些更多的序列化和反序列化配置

    现在……我实际上处于一个很奇怪的位置。 我想通过所有其他步骤来使端点正常工作。 但是,无论我做什么,我似乎都无法重新创建曾经遇到的所有错误,然后才能使它起作用。 我不知道该说些什么……我的异常被吞没在某处,阻止我看到正在发生的事情。 无论如何,我们必须继续。 值得庆幸的是,我知道为什么我添加了其余的代码,但我无法再为您提供每个更改都已修复的例外……

    Soooo,让我们看一下我们早先开始研究的rpcObjectMapper的最终产品:

    这里有一些补充。 JsonComponentModule作为bean添加,以便它拾取定义的@JsonSerializer@JsonDeserializer自定义组件(在其他类中)。 似乎即使将其作为模块添加到映射器,如果要查找和注册自定义JSON组件,它仍然需要创建bean本身。

    接下来是MixinModule 。 此类解决了在反序列化Vault.UpdateSecureHash时出现的问题。 让我们仔细看看。

    Mixin允许我们将Jackson注释添加到类上,而实际上没有访问类本身的权限,这显然是我们无法控制的,因为这是Corda代码库中的对象。 另一个选择是将其添加到我们之前讨论的CordaModule ,但这是CordaModule

    Vault.Update需要此方法,是因为它具有名为isEmpty的方法,该方法不能很好地与Jackson配合使用,Jackson感到困惑,并认为isEmpty与一个名为empty的布尔字段匹配。 因此,当将JSON反序列化回对象时,它将尝试为该字段传递一个值。

    MixinModule本身只是一个类,其构造函数将VaultUpdateMixinSecureHashMixin添加到其自身中。 然后,映射器就像添加其他模块一样添加该模块。 任务完成。

    添加到VaultUpdateMixin的Jackson批注是@JsonIgnore ,这可以说明@JsonIgnore 。 序列化或反序列化时, isEmpty函数将被忽略。

    接下来是SecureHashMixin

    3.1升级到3.2后,我已经添加了此功能。 对我来说,似乎忘记了为SecureHash添加Mixin。 CordaModule包括用于SecureHash.SHA256序列化和反序列化,但不包括SecureHash 。 上面的代码是从CordaModule复制和粘贴的, CordaModule一个类与Mixin绑定在一起。

    包含此内容后,将解决3.13.2之间的差异。

    我想我会为此提出一个问题!

    定制序列化器和反序列器

    要序列化Vault.UpdateAttachmentConstraint接口需要它自己的自定义序列化程序:

    HashAttachmentConstraint可谈的,因为只有HashAttachmentConstraint实际上有任何字段。 这与稍后反序列化器匹配,在反序列化器上读取type JSON字段以确定创建哪个对象。

    需要自定义反序列器的最后两个类是ContractStateAttachmentContract (与之前的序列化程序匹配):

    ContractStateDeserialiser是一个非常懒惰的实现,因为在本教程中仅使用一种状态。 AttachmentConstraintDeserialiser使用序列化程序中定义的type字段来确定应将其转换为AttachmentConstraint哪种实现。

    WebFlux特定的配置

    由于使用了WebFlux,本小节将介绍额外的必需配置。 您已经在MessageClient看到了一些配置,但是还需要做一些额外的工作:

    客户端需要这个bean能够反序列化application/stream+json以及响应中返回的对象。

    要使用配置中定义的Jackson2JsonDecoder ,必须指定WebClientExchangeStrategies 。 不幸的是,没有编写ExchangeStrategies类来拾取我们已经创建的Jackson2JsonDecoder 。 我希望这种配置在默认情况下可以工作,但是哦。 要添加ExchangeStrategies ,必须使用WebClient构建器。 一旦完成,我们终于到了。 完成打包响应的所有序列化以及从客户端使用响应序列的反序列化已完成。

    总结了我希望在本文中介绍的所有与Spring相关的代码。

    快速了解Flow代码

    在结束之前,我将简要展示为完成本教程的目的而编写的流程:

    这是一个非常简单的流程,增加了一个ProgressTracker/messages请求用于跟踪流程的当前状态。 简而言之,此流程将传递给它的MessageState并将其发送给交易对手。 在流程中移动时, ProgressTracker将更新为相关步骤。 可以在Corda文档中找到有关使用ProgressTracker更多文档。

    关闭时间

    老实说,这比我想象的要长得多,而且花了我的时间比我希望的要长得多。

    总之,Spring WebFlux提供了使用响应流在响应事件到达时进行处理的功能。 当与Corda一起使用时,可以跟踪流程的进度,并可以保持持久的库更新流,随时准备在它们到达时采取行动。 为了充分利用Corda的WebFlux,我们还必须研究确保对象由服务器正确序列化,然后由客户端反序列化,以便可以使用它们。 Lucky Corda确实提供了其中一些功能,但是缺少一两个类或功能,因此我们需要确保使用提供的对象映射器来使用它们。 不幸的是,WebFlux需要比使用Spring模块时通常所需要的更多的配置,但是没有什么不能解决的。

    这篇文章的其余代码可以在我的GitHub上找到

    如果您喜欢这篇文章,可以在@LankyDanDev的 Twitter上关注我,我在其中发布新帖子的更新(尽管最近它们的运行速度有所降低)。

    翻译自: https://www.javacodegeeks.com/2018/07/streaming-data-corda-node-spring-webflux.html

    corda

    展开全文
  • java收银系统源码Corda 示例指南 (Kotlin) 描述 该 CorDapp 允许节点就任意文本字符串达成一致,但仅限于未包含在上传到节点的黑名单中的各方。 黑名单采用 jar 的形式,包括单个文件blacklist.txt 。 blacklist....
  • corda

    2018-01-14 22:45:00
    账本:corda 从每个节点的视角看待账本都是不一样的。并不是所有节点有所有账本信息的。valut视为SQL数据库,只保存 两两节点之间的数据库 状态:状态是不变的对象,代表共享的事实,比如特定时间的协议、合约要想...

    账本:
    corda 从每个节点的视角看待账本都是不一样的。并不是所有节点有所有账本信息的。
    valut视为SQL数据库,只保存 两两节点之间的数据库

    状态:
    状态是不变的对象,代表共享的事实,比如特定时间的协议、合约
    要想改变状态,将旧值的事实标记为历史的,复制旧值并改变一些属性
    共享事实或协议随时间的生命周期由状态序列来表示
    vault(SQL数据库) 追踪每个状态序列的头部
    从每个peer的视角看,分类账本包含在vault中追踪的所有状态序列头(或非历史的) 状态
    若想得到当前分类账本状态(设计到不同 类型协议),只需拿出所有状态头或所有未消费的状态都拿出来,就可通过分类账获得与你交易的所有对手方的完整视图。

    交易:
    交易原子性 事务性
    未提交的交易是更新账本的请求
    交易由数字签名,所以强制它输出状态不可变
    交易请求需要验证 这与 交易创建 相对独立的进行
    任何人都可以发起交易请求, 然后 与该交易有关的人都验证(通过合约代码进行)并签字了之后, 还有公证服务签字 才能成功提交写库,输入状态标记为历史的,产生新的输出状态了。
    合约:
    合约代码是特定环境下纯粹的可执行的函数,基于 need-to-know(需要知道所需的) 验证交易,并且确定它们是否是分类账的有效更新

    法律文书
    法律文书被合约引用, 当合约代码不足时,可以依赖

    命令
    命令随交易出现,并表明意图,并通过列出的公钥指定所需的签名者

    时间戳
    时间戳权威机构由公证服务提供 提供可信的时间 验证
    时间戳断定 交易发生在特定的时间窗口中,并不是一个点

     

    流程 flow
    阻塞方式编写的代码不能停止和重启,采用 checkpoint。
    因为流程一步步的, 酷似 nodejs中的回调地狱反人类设计,corda中采用 checkpoint ,做了某些流程之后,将先前的操作持久化到磁盘上,此时 宕机的话 从 最近的checkpoint 重新开始发起即可。
    使用一些已经签名的子流程,可以避免重复造轮子。
    流程是轻量级的进程(纤程 (协程)而不是线程,用户模式运行的轻量级线程),用于协调复杂、多步骤, 多节点之间需要互动所需的节点才能就共享的事实达成共识

    展开全文
  • corda_用Corda开发

    2020-05-25 04:45:52
    corda 在上一篇文章中,我概述了Corda想要实现的目标以及为此所做的设计决策。 知道这些信息很高兴,因此我们可以对平台有所了解,但这不会帮助我们编写可以利用Corda的系统。 为此,我们需要了解Corda的各个组件...
  • Corda 培训解决方案 该 repo 包含 Corda 为期两天的培训课程实践练习的所有解决方案。 该存储库分为两部分:Java 解决方案和 Kotlin 解决方案。 致所有外部培训师: 这个 repo 将在 3 月 26 日进行重大升级。 主要...
  • Corda 培训模板 该存储库包含 Corda 两天培训课程实践练习的所有说明和课程模板。 该存储库分为两部分:Java 模板和 Kotlin 模板。 您可以使用您喜欢的任何语言完成培训。 致所有外部培训师: 这个 repo 将在 3 月 ...
  • R3和Corda 说起Corda,不得不提R3。R3的全名是R3CEV。是一家成立于2015年9月的一家创业公司。 其中: C 即加密技术。代表全球金融市场中加密技术和分布式总账智能协议。 E 即交易平台。代表创新的资产交易解决方案...
  • corda-map-源码

    2021-03-19 07:25:30
    这是一个React组件,是Corda网络的地图可视化。 要使用该组件: 预安装 首先,您需要下载@r3/r3-tooling-design-system ,然后将样式表导入项目中的某个位置。 import '@r3/r3-tooling-design-system/lib/index....
  • 本文主要从Corda的网络结构、共识机制、节点和业务流四个层面进行了初步的解析。Corda是一个独特的区块链平台,它允许在法律上可识别的交易对手之间进行私人交易,以易于使用的方式保持传统区块链的优势。另外值得一...
  • Corda API: Flows

    2018-09-27 22:10:06
    阅读本文之前,你应该对 Corda 核心概念 - Flow 比较熟悉了。 一个 Flow 的例子 在我们讨论 flow 提供的 API 之前,让我们来想一下一个标准的 flow 应该像什么样子。 我们可以想象一个 Alice 和 Bob 之间同意一个...
  • Corda技术细节知识记录与理解(一)

    千次阅读 2019-01-20 12:14:03
    Corda源码中的注解的理解 一,需要理解的注解有如下 @StartableByRPC We also mark InitiatorFlow as StartableByRPC, allowing the node’s owner to start the flow via RPC. 如果没有此注解的话,节点对应的...
  • Corda开发

    2020-06-11 11:08:24
    在上一篇文章中,我概述了Corda想要实现的目标以及为此所做的设计决策。 知道这些信息很高兴,因此我们可以对平台有所了解,但这不会帮助我们编写可以利用Corda的系统。 为此,我们需要了解Corda的各个组件如何工作...
  • 有关更多详细信息,请参见Corda文档上的“页面。 设定 首先,使用以下命令克隆此存储库: git clone https://github.com/corda/cordapp-template-java.git 并将目录更改为新克隆的仓库: cd cordapp-template-...
  • Corda令牌SDK 提醒 该项目是Apache 2.0许可下的开源项目。 这意味着您可以提交PR来修复错误,并在当前不可用的情况下添加新功能。 什么是令牌SDK? 令牌SDK的存在使CorDapp开发人员可以轻松创建使用令牌的CorDapp。...
  • 这次是官方首次披露他们的系统 Corda 的相关细节,Corda 宣称的去「区块链」概念博人眼球,系统设计上确实有许多区别于区块链的点。通篇读下来发现 CTO Brown 讲述团队在设计这个系统的背后思考,对于国内参与金融...
  • 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux。 为什么这样 第一,因为我们可以。 第二,因为它允许我们流式传输来自Corda节点的事件。 这使我们能够跟踪流的进度或检索...
  • 与分布式超级账本技术(如Hyperledger Fabric或R3 Corda)相比,以太坊区块链保持了相似性和差异性。在对区块链和分布式超级账本平台进行有根据的评估及其为企业带来的价值时,根据平台的核心功能和特征对平台进行...
  • 在 Docker 上使用 Prometheus、Grafana 和 ELK 监控 Corda 节点 Kibana 最大虚拟内存太低 博文 在此处查看博文。 第一步:准备工作空间目录 我们将在此步骤中创建目录结构并下载必要的文件。 需要3个罐子: corda...
  • 本文中,我们将简要分析 Hyperledger Fabric,R3 Corda 和以太坊这三种分布式账本技术(DLT,distributed ledger technologies)间存在的最显著差异。本文的目的在于为决策者提供一个新的 DLT 指南,了解 Hyperledger...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,740
精华内容 696
关键字:

corda