区块链原理及Fabric学习笔记

区块链原理及Fabric学习笔记,第1张

区块链

什么是区块链?(参考文章)

区块链是一种新型去中心化协议,能安全地存储比特币交易或其它数据,信息不可伪造和篡改,可以自动执行智能合约,无需任何中心化机构的审核。 交易既可以是比特币这样的数字货币,也可以是债权、股权、版权等数字资产,区块链技术解决了拜占庭将军问题,大大降低了现实经济的信任成本与会计成本,重新定义了互联网时代的产权制度。

区块链(Blockchain)是由节点参与的分布式数据库系统, 它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger)。它是比特币的一个重要概念,完整比特币区块链的副本,记录了其代币(token)的每一笔交易。通过这些信息,我们可以找到每一个地址,在历史上任何一点所拥有的价值。

区块链是由一串使用密码学方法产生的数据块组成的,每一个区块都包含了上一个区块的哈希值(hash),从创始区块(genesis block)开始连接到当前区块,形成块链。每一个区块都确保按照时间顺序在上一个区块之后产生,否则前一个区块的哈希值是未知的。 这些特征使得比特币的双花(double-spending)非常困难。区块链是比特币的核心创新。

交易:一次对账本的 *** 作,使账本的状态发生一次改变。区块:记录了一段时间内的交易的状态和结果,是对当前账本的状态的一次共识。链:由区块按照发生顺序串联而成,可以看做是整个账本状态变化的日志记录。创世区块:比特币区块链的第一个区块,创建于2009年,我们称之为创世区块。它是比特币区块链里所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将到达创世区块。
每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。因此,每个节点都把该区块作为区块链的首区块,从而构建了一个安全的、可信的区块链的根。

区块链和比特币的关系

比特币是区块链的第一个、也是目前最大的应用,区块链是比特币的底层技术,区块链的诞生离不开比特币,可以说是没有比特币就没有区块链了。换句话来说,区块链的优点比特币都有。

因为交易的本质是“将账户A中减少的金额增加到账户B中”。如果人们有一本公共账簿,记录了所有的账户至今为止的所有交易,那么对于任何一个账户,人们都可以计算出它当前拥有的金额数量。 而比特币的交易信息都被记录到一个去中心化的账本里面,而区块链恰恰是用于实现这个目的的账本,其保存了全部交易记录。

由于比特币一出来就比区块链的名声大很多,别人只知道2008年由中本聪第一次提出了区块链的概念 ,在随后的几年中,区块链成为了电子货币比特币的核心组成部分,作为所有交易的公共账簿。但是几乎所有的人只记住了比特币可以交易买卖赚取差价,可以用来全球支付,压根不知道比特币只是区块链的一种表现形式而已。

比特币是基于区块链的应用技术发展而来的数字货币,没有区块链就没有比特币,区块链是比特币的根源和基础。

比特币的运行原理参考文章

Fabric

超级账本(Hyperledger)

超级账本是区块链技术中第一个面向企业应用场景的开源分布式账本平台。超级账本项目为透明、公开、去中心化的企业级分布式账本技术提供开源参考实现。

官网


超级账本可以分为两大类

框架项目:提供区块链开发相关平台,提供开发环境以及相关的SDK(软件开发工具包)。如:Fabric实用工具:区块链应用的测试、部署、管理相关的工具。如:caliper

HyperLedger Fabric

Hyperledger Fabric是一个区块链的实现,由Digital Asset和IBM提供;是Linux基金会托管的Hyperledger项目之一。
Hyperledger Fabric利用容器技术来托管称为“链码”的智能合约,其中包含系统的应用程序逻辑。
与其他区块链技术类似,Hyperledger Fabric使用智能合约 *** 作账本,并且是一个通过所有参与者管理交易的系统。

Channel

在 Fabric 中,channel 代表了一个私有的广播通道,保证了消息的隔离性和私密性,它由 orderer 来管理,相当于是order的一个模块。channel 中的成员共享该 channel 的账本,并且只有通过验证的用户才能在 channel 中进行交易,与一个 channel 相关的属性记录在该channel的初始区块中,可通过 reconfiguration 交易进行更改。

建立channel的功能是Hyperledger Fabric与其他区块链系统相比一个很大的不同,它允许参与者为交易新建一个单独的账本。参与者并不希望所有的交易信息(比如提供给部分客户的特定价格信息)都对网络中所有参与者公开。只有在同一个channel中的参与者,才会拥有该channel中的账本,而其他不在此channel中的参与者则无权查看到这个账本的相关信息。这就保证了私有的功能。

channel的初始区块由 create channel 交易生成,peer 向 orderer 发送该交易时会带有的 config.tx 文件,该文件定义 channel 的相关属性。

在Fabric启动的时候会创建一个内部的System Channel,是系统的一个默认通道,可以用来创建其他的UserChannel。Order启动的时候必须要有System Channelgenesis blockgenesis block里规定了所有关于system channel的配置,所有的orderer都必须拿到相同的genesis block才能启动。

创建Channel

创建一个新的userChannel,实际上是向SystemChannel发送一个NewChannel的Transaction,包括这个通道的配置信息,组织信息等。然后Order中就会创建一个新的UserChannel,根据刚才创建新的channel的时候提交的信息就会生成新的channel的genesis block。

这里要注意,新创建的通道userChannel和SystemChannel是没有关系的,相互隔离的。

同时,系统会在执行创建新的通道的当前目录创建一个channel.block文件,这个文件是其他节点加入这个通道的时候需要用到的文件。peer channel join -b mychannel.block

智能合约(参考文章)

智能合约就好像是合同一样,是双方当事人基于意思表示一致而成立的法律行为,为私法自治的主要表现。”在现在的日常生活中合约常常是由人或者指定的机构来代为执行的,这就是传统合约。所谓的"智能"就是脱离了人和机构,交由计算机去管理和执行的自动行为。

“智能合约(Smart contract)"这个概念由计算机科学家、加密学家尼克萨博(NickSzabo) 在1993年提出并且在1994年完成了《智能合约》论文。该论文成为了智能合约的开山之作。作为一位通过给比特币打下基础而受到广泛赞誉的密码学家,尼克萨博为智能合约下的定义:“A smart contract is a set of promises defined in digital form, including agreements on which contract participants can execute these commitments.。

ChainCode(参考)

chaincode 是开发人员按照特定接口编写的智能合约,个人觉得实际上就是智能合约的具体实现。 chaincode是一个运行在ledger上的软件,对资产和交易指令编码来修改资产。.通过 SDK 或者 CLI 在 Fabric 的网络上安装并且初始化后,该应用就能访问网络中的共享账本。

chaincode的开发一般是使用GO或者JAVA,由于超级账本本身就是由go语言编写的,因此一般选用GO语言。chaincode的代码需要定义一个结构体,在这个结构体上实现init和invoke两个函数。main函数作为chaincode的启动入口,init和invoke是两个重要的函数,当应用程序请求智能合约fabar后invoke函数会执行,然后根据函数的入参来决定具体执行什么内容。使用GetFunctionAndParameters解析调用的时候传入的参数。

获得调用的函数

GetArgs() [][]byte 以byte数组的数组的形式获得传入的参数列表GetStringArgs() []string 以字符串数组的形式获得传入的参数列表GetFunctionAndParameters() (string, []string) 将字符串数组的参数分为两部分,数组第一个字是Function,剩下的都是ParameterGetArgsSlice() ([]byte, error) 以byte切片的形式获得参数列表

chaincode最重要的 *** 作就是对状态数据库(State Database)的增删改查,Fabric提供了三个接口实现对StateDatabase的 *** 作。

增改数据PutState(key string, value []byte) error删除数据DelState(key string) error查询数据GetState(key string) ([]byte, error)

智能合约的安装、使用、升级

安装合约

智能合约制定完成了之后,要安装在Fabric网络的节点中才能够使用,安装的同时注明版本号,保证应用的版本控制。

例如:peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

-n:指定名称
-v:指定版本号
-p:指定要安装的智能合约

一个通道上可以部署多个智能合约,这些智能合约可以相互调用,不同通道上的智能合约也可以相互调用但是只可以查询数据不能修改数据。不同的智能合约组合可以解决复杂的业务逻辑问题。

实例化

安装智能合约之后还需要进行实例化才能真正的执行智能合约。实例化的过程,实际上就是将合约编译并打包成容器镜像,然后启动运行,每个应用只能被实例化一次,可以发生在任何安装了chaincode的peer节点上运行。

例如:peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

实例化的时候产生链码容器,命名默认是dev+当前节点的命名。-p是指定背书策略,OR ('Org1MSP.member','Org2MSP.member')是指两者中的一个即可。再比如:OR(OrgA, AND(OrgB, OrgC)),表示组织OrgA单独背书即可,或者组织OrgB和OrgC一起背书,“OutOf(1, OrgB, OrgC)”,表示要求除组织B和组织C外的另一个组织进行背书。

使用合约

实例化之后,用户就可以根据合约的内容进行交互了

例如:peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

-C:指定通道
-n:指定链码的名称
-c:指定交互的时候的函数和参数

这里要注意:同一个通道中如果已经安装了智能合约,那么其他的安装了智能合约的节点也是可以查询到的,即使这个合约并不是实例化在这个节点上。同一个通道中没有安装合约的节点是无法进行这个通道的账本的查询等一系列 *** 作的,因为这些 *** 作都是基于智能合约来进行的。

合约升级

当我们的智能合约需要添加新的功能或者出现bug需要升级的时候,就要通过upgrade交易来实现。

这个时候首先通过install交易把新的代码安装到正在运行智能合约的peer节点上,安装的时候注明是一个新的迭代的版本。然后向这个安装了新版本的智能合约的节点发送upgrade交易即可升级。

状态数据库State DataBase(参考文章)

在Hyperledger Fabric的项目中支持的数据库有两种

LevelDB:这个是peer节点中内嵌的集成的数据库,默认的键值对状态的数据库。CouchDB:可选的外部状态的数据库,能够存储任何链码中建模的二进制数据,作为一个json格式的文档库,当链码的数据被以json格式建模时候,可以实现复杂的查询。

由于CouchDB作为独立的数据库和节点数据一起运行,所以安装部署会更加复杂一些。

安装CouchDB状态数据库

在 Hyperledger Fabric 环境中,如果需要使用 CouchDB,那么必须在 docker-compose.yml/docker-compose.yaml或自定义的配置文件中声明 CouchDB 容器,然后在各个 peer 容器中 environment 属性中声明相关环境内容,且在 depends_on 属性中指定声明的 CouchDB 容器的名称。

锚节点

锚节点是一个peer节点,由于我们每一个组织可能包含多个节点,每个组织需要和其他组织进行通信,就需要一定的机制。每个组织会在自己所包含的所有节点中选择一代表作为锚节点,之后这个组织和其他的组织进行通信都是使用这个锚节点进行通信。这个锚节点可以在配置文件里面进行设置,每个组织都只能有一个锚节点。

背书策略

背书策略是背书的交易条件,区块链的peer节点预先定义了一组背书策略,只有满足了这个背书策略,背书才会有效,对于链码的调用交易首先需要满足背书策略。

交易背书的基本流程

首先客户端创建按交易并选择发送给选择背书的peer节点背书的peer节点模拟交易、产生背书签名提交客户端的背书交易并通过排序服务广播排序服务向peer节点提交交易

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2991783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存