因为不久后要组队参加区块链比赛,所以新开了这个系列用于记录一些区块链开放相关的知识

本系列是参考Microsoft区块链开发入门内容整理得来的

什么是区块链?

区块链是一种用于保留记录和执行合同的技术,通过使用加密来确保极难更改以前的历史记录,并且允许参与者通过跟踪共享账本的更改来共享工作流程。

为什么不使用集中式数据库?

集中式数据库
下面以一个冰淇淋案例的形式作为后续讨论的基础:
假设你是解决方案架构师,供职于一家生产冰淇淋的乳制品加工公司。你通过供应链接收来自多个牛奶场的未加工牛奶,你的公司将包装好的冰淇淋运输至多个零售商。
运输过程中温度不正确将导致产生食物质量和安全问题,而因为有多个公司负责运输和存储产品,因此很难识别供应链中出错的一方。
因此,你需要创建一个系统,用于快速识别供应链中的问题。
显然,我们可以建立一个集中式数据库,让所有参与者使用它来跟踪运输,实际在许多方案中,集中式数据库都是适当的解决方案。
那么假设我们有一个集中式数据库,该数据库存储有关元素和当前责任方的详细信息。可以让农场主、承运方、工厂和零售商使用同一个集中式数据库。
集中式数据库的优点是可以轻松控制访问权限和一致性,每一方都使用相同的数据库,并由受信任的机构控制访问权限,由于只有一个数据库,所有参与者都使用相同的数据集。
所有参与者都需要相信数据库是准确的,引申一下,就是他们需要信任数据库的所有者不会出于任何目的修改历史数据。
但是如果我们的方案不存在受信任的中央机构时该怎么办?如果没有一家公司愿意负责托管集中式数据库,该怎么办?此时就可能无法满足与每个参与者的系统集成要求。

分布式数据库

分布式数据库
如果每个参与者都有数据库的副本会怎样?分布式数据库使用数据库的多个副本并同步更改。在我们的方案中可以让农场主、承运方、工厂和零售商使用自己的分布式数据库。
分布式数据库的优点是每个参与者都有数据库的副本,在自己的数据库副本中,通常能更轻松地控制访问权限以及集成系统和流程。
但是需要同步每个数据库的更改,处理失败和冲突甚至可能会增加复杂性和数据诚信问题。

分布式账本

分布式账本
区块链技术称为分布式账本。与会计账本一样,分布式账本也是事务的历史记录。账本中的每个事务都会影响最终状态。
分布在参与者之间的区块链网络称为联盟网络。通过联盟网络,每个合作伙伴都能查看网络中发生的每个事务。
区块链使用共识规则确保不同节点之间数据的一致性。它还使用加密技术,让参与者能信任数据。
具体而言,它会阻止任何一个参与者或少数参与者修改历史记录。区块链是分散的,因此最适合可以使用分散式数据库的解决方案。
例如,由于成本、控制或成为单一故障点方面的原因,你需要在没有中央机构的情况下支持多个公司。

区块链的工作原理

这些信息可帮助确定区块链是否适合当前方案。

数据是如何分布的?

在冰淇淋方案中,假设有多家公司。
首先在乳制品加工公司建立了一个集中式数据库,但所有参与者都不想成为中央机构,因此可以使用区块链分布式账本,使用区块链将不再需要中央机构。
此外,拥有区块链节点的每个参与者都可获得账本副本,以便他们能够自行审核并与自己的系统集成,但并不要求每家公司都设置属于自己的分层节点,合作伙伴之间可以共享这些节点。
每个节点都通过区块链网络连接到其他节点。
数据分布
例如,Dalia Pelayo农场、冰淇淋工厂和冰淇淋店都各自管理着一个节点。Contoso West和Contoso East是同属一家母公司的两个独立合作伙伴,Contoso 有一个节点。
节点与公司之间不必存在一对一关系。

状态更改

区块链中的数据表示状态,这就是为什么区块链非常适合使用加密货币之类的数字令牌。
可以把这种情况想象为实际货币的所有权:一枚硬币一次只能在一个人的口袋。如果硬币在你的口袋,所有权就是你的。如果将硬币给朋友,状态就会变为你的朋友拥有这枚硬币。
同理,在冰淇淋方案中,货物运输通过供应链,产品的责任方也随运输转移。我们想知道的数据包括责任方、温度以及产品是否合规。区块链使用数据库事务机制将数据的状态从一个值更改为另一个值。
例如,如果我们需要知道冰淇淋是否在低于冰点的温度下存储。在运输冰淇淋的过程中,温度传感器会定期报告温度,报告温度是一个事务,会发送到区块链事务节点。
传感器将温度发送到区块链事务节点
在冰淇淋方案中,在货物运输通过供应链的过程中,每当状态发生更改时,都会发送一个事务。例如,下图展示了向冰淇淋工厂运送货物的典型事务,每个事务都更改了责任方或温度等信息。
账本的当前状态是按顺序应用事务的状态。
事务在不停地生成并发送
发送事务时,会发送到区块链事务节点。假设Dalia Pelayo农场通过Contoso West Shipping运输牛奶。Dalia Pelayo农场的发货系统会向自己的区块链节点发送一个事务。
该事务会将运输责任方从农场主更新为Contoso West Shipping。
责任方更新
在整个区块链网络中,一旦某个结点发送事务,其他节点都会获取事务的副本。
每个结点均可获取事务副本
(注:个人感觉这里面的事务指的应该是类似日志一类的记录)

如何确保账本数据的一致性?

每个节点都会处理事务,但仍需要使用共识机制进行验证。共识机制实现了分布式账本的一致性和信任。
在分布式网络中,很难确定什么是真实的,因为所有节点都可能存在数据更改。如果冰淇淋工厂节点没有收到运输事务,会发生什么情况?他们如何知道牛奶已从农场运出?如果运输公司的冷藏车出了故障,牛奶变质了怎么办?送货公司是否会通过修改账本来逃避责任?

区块链采用一种共识机制,可验证所有区块链节点上的数据并达成一致。共识提供一种方法,让所有分散管理的节点都达到相同的状态。
在转移价值或责任时,事务的顺序很重要。例如,如果你将汽车的所有权转给朋友,就无法再将该项所有权转给同事。此类问题称为双重花费(double spend),可通过共识机制解决。共识可确保事务的顺序正确以及区块链的诚信。
共识的原理是,一组事务作为一个块进行验证,至于这个块是否应属于区块链,整个网络必须达成一致。
共识机制
有几种区块链共识算法,包括工作证明、所有权证明和授权证明。每个算法都以不同的方式解决一致性问题。简而言之,共识提供了一种方法,让分布式账本能达成共同的状态。

什么是块?

块是区块链中存储事务信息的数据群集,块中的事务数通常是基于时间的。
例如,下图显示的块包含了过去 10 分钟内发生的事务。
块的示例
经过共识后,已验证的块会添加到每个节点的区块链中。由于所有节点在该链中都具有相同的块,所以账本能在网络上保持一致。因此,所有节点都以一致的顺序包含相同的已验证数据

如何确保账本不可变?

你可能会认为,如果能控制自己节点中的账本,就能更改副本中的数据,这些数据怎么会不可变呢?
区块链使用加密哈希在块之间创建链接。将块链接在一起后,可以通过共识算法确定事务顺序的一致性。加密哈希可将任意大小的数据映射到固定大小的位表示形式,可以将其视为数字指纹。
比特币使用SHA-256哈希算法。如果在100页的文档上使用SHA-256哈希函数,则函数输出是256位哈希值。
如果只更改了文档中的一个字符并重新生成了哈希,则输出将是另一个256位哈希值。
现在,假设我们将一个块用作哈希函数的输入,输出是块中数据的唯一哈希值。
块通过SHA-256生成256位哈希值
区块链使用哈希来检测这些块有没有发生任何更改。通过在生成下一个块的哈希时包含上一个块的哈希值,这些块会通过哈希链接在一起。
每个块包含上个块的哈希值
每个块包含上个块的哈希值
区块链通过使用哈希来证明数据历史记录未更改,从而实现信任。通过在创建新块时包含上一个块的哈希,将按顺序创建不可变的事务链。
如果修改链中的任何块,后一个块的哈希在验证时就会发现差异。

受信任的逻辑

通过区块链,我们可以存储一致且可信的数据。那么如何添加在每个节点一致执行的逻辑?
在冰淇淋方案中,需要将产品的责任从一个参与者转到另一个参与者以及使用IoT温度传感器中的数据来了解温度是否过高。
分散式应用程序(DApp)是分布式计算系统上的应用程序。Ethereum DApps称为智能合同,包含作为事务的一部分执行的逻辑(操作?)。在Ethereum上使用名为Solidity的编程语言对逻辑进行编程。
智能合同部署到区块链,并按地址引用。要使用智能合同,需创建一个实例,智能合同实例包含状态数据和程序逻辑。
在冰淇淋方案中,智能合同实例包含各种数据,例如负责的参与者、位置以及产品温度是否不合规等,可以执行函数来转移责任或接收实例的温度遥测数据。
智能合同实例
将产品的责任转到另一方时,会执行事务,智能合同逻辑会更新状态数据。
冰淇淋方案中,冰淇淋工厂运输系统会为新的冰淇淋运输活动创建一个智能合同实例。工厂运输系统将发送一个事务,该事务调用TransferResponsibility函数以将运输责任方改为Contoso East shipping。区块链网络将该事务发送到所有节点,每个节点都会执行该智能合同逻辑。
工厂运输系统广播责任变更事务
而在运输过程中,如果制冷装置出现故障且冰淇淋温度升至冰点以上时,IoT温度传感器会监视冰淇淋温度并定期发送事务。如果温度高于冰点,智能合同逻辑会将这批货物标记为不合规。
温度传感器广播不合格货物事务
由于事务包含在块链中,因此当货物状态变为不合规时,会有一个不可变的记录。冰淇淋店可以拒绝收货,避免产生食品安全问题。
与区块链中的数据一样,智能合同也是不可变的,逻辑在部署后便不能更改。因此你可以信任智能合同逻辑始终在所有节点上一致地执行,任何代码更改都需要在新的地址部署新的智能合同。

智能合同是什么?

智能合同是区块链中存储的一种程序。
智能合同将区块链从数据扩展到代码,它们表示各个参与方之间的编码协议,当操作发生时,代码将运行并提供响应。
此类合同的所有条款和条件都以编程方式定义。定义将为区块链的参与者指定规则、要求和奖励。它还会指定如何在各参与方之间传输数字资产。每个智能合同将分配有一个20个字节的地址,用作合同的唯一标识。
智能合同将自行运行,发送事件来触发状态转换,并调用函数。它们非常适用于区块链技术,因为素不相识的人们可以通过它们按照指定的安全方式开展业务,而不需要任何中间商。
智能合同通常与Ethereum一起使用。Ethereum是全球首个可编程的区块链。通过它可以定义智能合同,来帮助传输数字资产,例如以太币。
用于编写合同的语言是Solidity。Solidity是图灵完备语言,这意味着可以通过明确的定义和编码编写复杂的合同。
由于每个状态转换都会进行记录并且都不可变,因此在将合同发布到生产环境之前,应对它进行全面测试。Bug修复可能会产生巨大成本,甚至会严重损害系统。
智能合同的主要属性和优点如下:

  • 透明:区块链用户可以读取智能合同,并可以使用API来访问这些合同。
  • 不可变性:智能合同的执行将创建不可更改的日志。
  • 分发:该合同的输出由该网络的节点验证。合同状态可以公开显示。在某些情况下,甚至可以看到“私有”变量。

用例

智能合同可为许多行业和流程带来好处。可以考虑以下用例。

  • 保险:当发生某些事件时,智能合同可自动触发索赔,从而简化索赔过程。然后,若要确定用户将收到的补偿金额,可在区块链中记录索赔详细信息。此功能可以减少处理时间和人为错误。
  • 投票:智能合同有助于投票自动化和透明化。每个合同都是一种投票,代表着投票者的身份。由于区块链是不可变的,这意味着区块链无法更改,因此无法篡改投票。
  • 供应链:随着物品沿着供应链移动,智能合同可记录所有权,并可确认在任何给定时间由谁负责某项产品。在任何阶段,都可以通过智能合同准确查明产品应处于的位置。如果供应链中的任何一个参与方未能按时送达,其他每个参与方都会知道何处出现了问题。
  • 记录保留:许多行业都可以使用智能合同来提高记录保留的速度和安全性。可以使用区块链技术将记录数字化,并对其进行安全的加密和存储。此外,可以限制访问,以便只有允许的人员才能访问记录。- 财产所有权:智能合同可以记录财产的所有者。通过它们可以快速高效地记录所有权。智能合同还有助于及时安全地转移所有权。

区块链类型

区块链可以是公共的或专用的。 这两种不同的类型决定了谁能参与区块链网络。

公共区块链网络

如果你不需要信任任何人的网络,任何能访问Internet的人都可加入你的区块链网络,不需要进行登录,也不需要向机构申请权限。
公共区块链分散在网络上,且不存在中央机构,网络上的任何节点都可以看到区块链中的所有事务。
第一个区块链网络为比特币创建,比特币区块链网络是公共的,任何人都可以查看所有事务。
例如,可以使用块资源管理器查看最新的比特币块和事务。
公共区块链的共识算法使用加密货币作为验证块的奖励,在验证事务时还可能收取加密货币费用。
公共区块链的隐私保护有限,如果想要保持事务的私密性,应仅与事务中的其他参与者共享公钥。

专用区块链网络

如果部分信任区块链网络的参与者,只有受邀加入区块链网络的参与者才能访问区块链中存储的信息。专用网络是不完全受信任的网络,在专用网络中所有参与者都在区块链的利用方式上达成一致。
联盟区块链是专用区块链,但权限是分布式的,并按网络的最大利益行事。联盟区块链可以限制谁有权参与共识。通过限制为只有参与者可以加入验证来实现信任,由参与者构成的组称为联盟。联盟区块链的共识算法可以使用权限而不是加密货币。
在冰淇淋方案中可能还需要保持部分数据的私密性。例如,各方都知道产品已运出,但可以保持运输细节的私密性。由于我们使用多家运输公司,双方之间的运输细节可能会保密。相互竞争的运输公司只知道事务发生了,无法查看运输细节。

区块链协议

有几个著名区块链协议。最有名的是比特币,比特币区块链网络专为比特币加密货币创建,主要功能是存储比特币值。这些值可以通过不可信的方式从一处转到另一处。
Ethereum是通用协议。Ethereum扩展了比特币创建的内容,提供允许编写小型程序以及进行简单值转移的协议。最终效果是能添加逻辑和代码,而不只是进行简单的固定值转移。
如果要将区块链用于实际解决方案一般使用Ethereum和Hyperledger Fabric 之类的通用协议,它们是可用于多个方案的可编程区块,通用协议使用智能合同对业务逻辑和状态进行编码。

区块链的应用

区块链技术适用于某些特定方案,不应将其用作常规用途解决方案。在许多情况下,集中式数据库是一个更好的选择。考虑使用区块链时,请思考几个关于当前方案的问题。

参与者

  • 是否需要支持多个合作伙伴或公司?
  • 是否要避免存在中央机构?也许对任何一个参与者都不信任。参与者也可能不想依赖于第三方。
  • 参与者是否共享数据或使用涉及多个或全部参与者的工作流?
    区块链技术能保证所有节点的一致性。大多数其他企业对企业 (B2B) 解决方案依赖于同步。同步数据会使B2B系统产生断裂和费用,而分布式数据的一致性是区块链技术的关键优势。

性能

  • 事务吞吐量是否较低?
    根据区块链协议和共识机制,事务处理速率可能较低。
  • 与其他业务合作伙伴进行交互时,是否定义了业务逻辑?
    在事务中执行业务逻辑可能会影响性能。

业务逻辑

  • 业务逻辑是否足够简单?
    在公共区块链上执行复杂的智能合同函数比简单的函数需要更多的加密货币。
  • 业务逻辑是否是静态的且不会更改?
    区块链数据不可变,要更改智能合同逻辑,就需要将新合同部署到新地址,因此如何控制业务逻辑的版本是一个需要考虑的问题。

信任

  • 参与者之间是否需要信任和诚信?
  • 事务的顺序是否重要?
  • 事务是否具有私密性?