长春网站策划,深圳进入政策最新,广西桂林天气,wordpress文章怎么生成海报知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版)
部署的几个阶段
部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)…知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版)
部署的几个阶段
部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)带TLS 部署1排序和2节点, 1组织1通道 一开始就是2节点 cryptogen 能Dapp 带ca server(每个组织一个)带TLS 新节点中途加入 ca server 名词解释 Transaction⼀次Chaincode函数的运⾏。 Transaction存储chaincode执⾏的相关信息⽐如chaincodeID、函数名称、参数等并不包含操作的数据。 World StateFabric区块链系统中所有变量的值的集合。 Transaction实际操作的是数据每个chaincode都有⾃⼰的数据。 Fabric使⽤Rocksdb存储数据⼀个key-value数据库。Key - 变量value - 值。 Fabric将每⼀对key-value叫做⼀个state⽽所有的chaincode的state的合集就是World State。 锚节点Anchor 通道中每个组织Org都有一个锚节点用于同一通道中不同组织的Peer节点发现通道内所有Peer节点。 Fabric的账号体系Fabric的有两种方法获取账号分别是: cryptogen模块根据配置文件生成账号Fabric-ca-server服务器生成账号 一般只有网络组件配备了 TLS 服务器证书而网络用户例如 Admin、User1没有。因为 TLS 中大多数只需要设置服务器身份验证单向身份验证。
模块组成
组织和证书生成器cryptogen
我们将使用该cryptogen工具为我们的各种网络实体生成加密材料x509 证书和签名密钥。这些证书代表身份它们允许在我们的实体进行通信和交易时进行签名/验证身份验证。
Cryptogen 使用一个文件——crypto-config.yaml它包含网络拓扑并允许我们为组织和属于这些组织的组件生成一组证书和密钥。每个组织都提供了一个唯一的根证书 ( ca-cert)它将特定组件对等节点和排序节点绑定到该组织。通过为每个组织分配一个唯一的 CA 证书我们模拟了一个典型的网络在该网络中参与成员将使用自己的证书颁发机构。Hyperledger Fabric 中的交易和通信由实体的私钥 ( keystore)签名然后通过公钥 ( ) 进行验证signcerts。
区块和交易生成器configtxgen
该configtxgen工具用于创建四个配置工件
orderer genesis block,channel configuration transaction,and two anchor peer transactions - one for each Peer Org. orderer块是ordering服务的Genesis Block通道配置交易文件在Channel创建时广播给orderer 。顾名思义锚点交易指定了该通道上每个组织的锚点。 Fabric-ca fabric-ca server rootintermediatecluster fabric-ca clientdb sqlite3postgresmysql
系统组织架构图
(1)Fabric系统组织架构图 (2) 应收账款融资业务场景系统架构图 Fabric项目开发流程图 上图中每个步骤分为3个部分分别表示当前步骤需要的Fabric模块、配置文件以及需要完成的工作。
链码chaincode
和以太坊相比Fabric链码和底层账本是分开的升级链码时并不需要迁移账本数据到新链码当中真正实现了逻辑与数据的分离。
链码被编译成一个独立的应用程序fabric用Docker容器来运行chaincode里面的base镜像都是经过签名验证的安全镜像包括OS层和开发chaincode的语言、runtime和SDK层。一旦chaincode容器被启动它就会通过gRPC与启动这个chaincode的Peer节点连接。 Fabric的智能合约称为链码chaincode分为系统链码和用户链码。
系统链码 系统链码: 包括系统的配置, 仅支持Go语言, 在Peer节点启动时会自动完成注册和部署 配置系统链码CSCC负责管理记账节点上的配置信息加入通道等背书系统链码ESCC对读写集转换和签名背书msp管理. 背书节点执行用户链码之后会执行ESCC生命周期系统链码LSCC负责管理链码的生命周期如安装、实例化、升级、查询验证系统链码VSCC负责签名验证策略验证. 节点写入账本之前需要运行VSCC。查询系统链码QSCC负责ledger查询如区块、交易数据、区块链信息等MVCC: 比对读写集的版本
用户链码 用户链码: 用户链码用于实现用户的功能真正实现了逻辑与数据的分离。 运行在链码容器中通过Fabric提供的接口与账本平台进行交互。开发语言go、java、python、node.js, 目前fabric对go语言的链码支持的最好
链码的生命周期
1. 链码的安装是单次单节点的。
2. 链码的存储(install)是可以多个链共享的实例化(instantiate)的时候才会记录到不同链的账本数据里不同链的数据是独立隔离的。
3. Chaincode**必须**安装在对等方上才能成功地对账本执行读/写操作。此外直到init对该链代码执行或传统事务读/写例如查询“a”的值之前不会为对等方启动链代码容器。模拟执行事务时会容器启动。链码内常用的系统方法
shim.ChaincodeStubInterface APIs 分为五类
• State 操作:
GetState(key string) ([]byte, error)
PutState(key string, value []byte) error
DelState(key string) error
RangeQueryState(startKey, endKey string) (StateRangeQueryIteratorInterface, error)• Chaincode相互调⽤:
InvokeChaincode(chaincodeName string, args [][]byte) ([]byte, error)
QueryChaincode(chaincodeName string, args [][]byte) ([]byte, error)• Table 操作:
CreateTable(name string, columnDefiniGons []*ColumnDefiniGon) error
GetTable(tableName string) (*Table, error)
DeleteTable(tableName string) error
InsertRow(tableName string, row Row) (bool, error) ReplaceRow(tableName string, row Row) (bool, error)
GetRow(tableName string, key []Column) (Row, error)
GetRows(tableName string, key []Column) (-chan Row, error)
DeleteRow(tableName string, key []Column) error• TransacGon操作:
GetArgs() [][]byte
GetStringArgs() []string
GetTxID() string
ReadCertAttribute(attributeName string) ([]byte, error) GetCallerCerGficate() ([]byte, error)
GetCallerMetadata() ([]byte, error)
GetBinding() ([]byte, error)
GetPayload() ([]byte, error)
GetTxTimestamp() (*Gmestamp.Timestamp, error)
VerifyAttribute(attributeName string, attributeValue []byte) (bool, error)
VerifyAttributes(attrs ...*attt.Attribute) (bool, error)
VerifySignature(cerGficate, signature, message []byte) (bool, error)• Event操作:
SetEvent(name string, payload []byte) error如何调用链码 终端里输入命令调用 更改: peer chaincode invoke 查询: peer chaincode query 应用程序(DApp)使用sdk(HFC - HyperledgerFabricClient)提供的接口调用 (API包含了交易处理、 安全的成员管理服务、 区块链查询和事件处理等) fabric-client NewChannel: 接口可以创建通道sendTransactionProposal: 可以调用链码里的函数 fabric-ca enroll: 用户登录 (如:用Admin登录)register: 新用户注册 (如: 用Admin登录后, 注册一个新用户User1) fabric-network evaluateTransaction: 读数据 它只是选择连接配置文件中定义的对等点并将请求发送给它在那里对其进行评估。此交互不会导致更新分类帐 submitTransaction: 写数据 SDK 不会与单个对等点交互而是将submitTransaction提案发送 到区块链网络中每个所需组织的对等点。这些节点中的每一个都将使用这个提议执行请求的智能合约以生成一个交易响应它签名并返回给 SDK。SDK 将所有已签名的交易响应收集到单个交易中然后将其发送给排序节点。排序节点收集来自每个应用程序的交易并将其排序为一个交易块。然后它将这些块分发到网络中的每个对等点在那里验证和提交每个事务。最后SDK 会收到通知允许其将控制权返回给应用程序。 SDK调用链码示例 (老版本, 1.4版本之前) var Fabric_Client require(fabric-client); //加载sdk模块
var channel fabric_client.newChannel(mychannel); //创建通道
var peer fabric_client.newPeer(grpc://localhost:7051); //连接peer节点
channel.addPeer(peer);
var order fabric_client.newOrderer(grpc://localhost:7050) //连接排序节点
channel.addOrderer(order);var request {chaincodeId: myChaincode, //调用哪个链码fcn: testFunc, //调用链码里的哪个函数args: [arg1, arg2, arg3], //参数chainId: mychannel, //哪个通道的链码txId: tx_id};
channel.sendTransactionProposal(request); //发送交易开发链码主要用到的语言是golang因为fabric对它的支持目前最好。而应用层使用sdk的开发其它语言也可以nodejs是比较通用和快速的选择。 部署和调用链码之前需要先创建通道、加入通道、更新锚节点然后才能进行有关链码的操作比如安装链码、实例化链码、invoke和query等。 往现有网络中添加新 Peer 的步骤 channel创建时可指定允许哪些组织内的peer加入, 但组织内的peer仍需手动加入channel 将向Org1添加一个peer1.org1.example.com。目标是这个新的 peer 将成为通道的一部分并且能够在需要时处理链码查询和背书。
为peer1.org1.example.com生成加密材料 可使用 **cryptogen**推荐使用 **fabric-ca** 创建一个包含此新peer的 docker compose 文件将此新对等点加入现有频道 peer channel join 将链码安装到该节点 peer chaincode install但不需要再次实例化
构建多主机多节点部署 不同的order由谁来布, 中途怎么加order? 构建多节点部署的挑战之一是 docker 容器之间的通信。
extra_hosts
Hyperledger Fabric 中三节点双通道设置演示
Hyperledger-fabric 区块链多主机 简单不需要依赖任何外部组件 不利的一面是IP是静态配置的 操作方法 docker-compose.yaml 中为每个组件增加 extra_hosts:- orderer.example.com:127.0.0.1- peer0.org1.example.com:127.0.0.1- peer1.org1.example.com:127.0.0.1Docker Swarm
多台主机上的 Hyperledger Fabric 使用 Docker Swarm 和 Compose
使用基于 RAFT 的订购服务进行多主机设置
好的一面显然是原始配置只需少量修改即可使用并且配置中没有编码IP等静态信息。结构网络依赖于外部组件Docker Swarm这可能会使设置和操作复杂化
Kubernetes (k8s)
实现起来似乎比前两种机制更具挑战性