使用chaincode(使用柴暖时需要发车嘛)_币百科_智行理财网

使用chaincode(使用柴暖时需要发车嘛)

智行网 0

欧易okx交易所下载

欧易交易所又称欧易OKX,是世界领先的数字资产交易所,主要面向全球用户提供比特币、莱特币、以太币等数字资产的现货和衍生品交易服务,通过使用区块链技术为全球交易者提供高级金融服务。

APP下载   官网注册

使用chaincode可能是相关行业人士都值得关注的知识,在此对使用柴暖时需要发车嘛进行详细的介绍,并拓展一些相关的知识分享给大家,希望能够为您带来帮助!

首先,你这程序和你的意思貌似对不上哦。chainLinkcode 如果是个2进制或者16进制的,你左移右移,还是有意义的,但问题是10进制。

如果我是你

chainlinkcode = chainlinkcode /1000;

linkcode = chainlinkcode 00;

如果是为着节省空间,定义成unsigned short, 那应该没必要呢,其实都是4字节的int,处理器运行起来反而快。

Build Your First network提供了一个 fabric 的示例网络。该示例网络中由两个组织构成,每个组织维护两个 peer 节点,演示了基于链码查询2个账户余额与转账操作。

first-network 中有一个启动脚本 byfn.sh,利用构建的 Docker 镜像快速启动网络。该脚本会启动一个 orderer 节点和四个归属两个不同组织的 peer 节点,还将启动一个cli运行脚本,它将 peer 节点加入通道(Channel)、部署和实例化链码,并根据已部署的链码驱动交易执行,以下是byfn.sh的帮助文档。

执 up -o etcdraft启动脚本,指定使用raft共识算法

通过cryptogen工具生成组织成员关系和身份证书、密钥等文件。调用configtxgen工具生成节点与通道配置文件,包括Orderer节点上系统通道的创世区块文件genesis.block,新建应用通道的配置交易文件channel.tx、组织锚节点配置更新交易文件Org1MSPanchors.tx与Org2MSPanchors.tx等。

用户执行network_setup.sh脚本启动Fabric网络,该脚本调用networkUp函数,该命令会检查网络实体的证书是否生成,如果没有则首先生成相关证书目录。

generateCerts主要执行了cryptogen generate –config=https://yrb114.com/crypto-config.yaml

根据crypto-config.yaml生成网络成员组织结构和对应的身份证书、签名私钥等文件,并保存到默认的crypto-config目录,身份证书等文件在对应的目录msp/ 中,TLS证书与密钥文件保存到tls/ 中。

crypto-config.yaml主要包含的fabric排序节点证书配置以及fabric组织证书配置。

Template 模板定义节点的配置模式

Specs 另外一种配置模式

Count 节点总数

Hostname 全限定域名 命名格式

Domain 域名

Users 添加到管理员的用户帐户数

采用Specs模式配置了5个排序节点

采用Template模式配置了两个组织,每个组织2套公私钥和证书,包含普通User数量为1

ordererOrganizations目录 :包含Orderer组织类型的身份证书.pem文件、签名私钥文件 _sk文件、TLS证书(证书.crt文件和密钥.key文件)

peerOrganizations目录 :包含Peer组织类型的身份证书.pem文件、签名私钥文件 _sk文件、TLS证书(证书.crt文件和密钥.key文件)

这些文件通过docker-compose工具,基于docker-compose-cil.yaml、docker-compose-base.yaml等配置文件,将目录作为挂载卷到容器的指定目录。

调用replacePrivateKey基于docker-compose-e2e-template.yaml文件创建新的配置文件docker-compose-e2e.yaml。进入Org1组织的CA目录,获取私钥文件名作为PRIV_KEY,替换docker-compose-e2e.yaml文件的CA1_PRIVATE_KEY。同理替换CA2_PRIVATE_KEY。

执行generateChannelArtifacts函数,使用configtxgen工具基于configtx.yaml创建节点与通道配置文件,包括Orderer通道的创世区块,应用通道配置配置交易文件channel.tx,锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx

Orderer系统通道的创世区块

执行configtxgen命令,创建Orderer创世区块文件genesis.block

新建应用通道的配置交易文件

执行configtxgen命令,创建应用通道的配置交易文件channel.tx,后续执行peer channel create读取文件。

锚节点配置更新交易文件

执行configtxgen命令,创建锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx,后续执行peer channel update进行更新。

返回到network_setup.sh脚本,判断是否启用了CouchDB标志位(默认关闭),使用docker-Compose工具执行docker-Compose-cil.yaml文件,启动Fabric网络。

继续分析network_setup.sh脚本,默认COMPOSE_FILES是docker-compose-cli.yaml文件,当设置了kafka共识或者raft共识,则使用对应的yaml文件。

Orderer节点继承了docker-compose-base.yaml中的orderer.example.com配置属性,Orderer节点容器启动时执行如下命令

docker-compose-cil.yaml文件

继续追踪base/docker-compose-base.yaml,找到orderer.example.com服务,挂载目录和暴露7050端口。

orderer的配置还是引入peer-base.yaml中的orderer-base服务

4个Peer节点继承了docker-compose-base.yaml中对应容器名称的配置属性,Peer节点容器启动时执行如下命令

docker-compose-cil.yaml文件中Peer节点配置。

docker-compose-base.yaml文件中Peer节点的配置。

引入peer-base.yaml中的peer-base服务

docker-compose-cil.yaml文件中CLI客户端配置。启动完 orderer 节点、peer 节点和 CLI 容器之后,实际是调用 script.sh 脚本,该脚本是在 CLI 容器中执行,CLI 容器其实就是用户客户端,只不过是命令行客户端,运行在容器中。默认情况下CLI 的身份是 admin.org1,连接 peer0.org1 节点,执行 script.sh 脚本

script.sh脚本顺序执行默认的测试流程,包括创建新的应用通道、添加节点、更新锚节点、安装链码、实例化链码、调用链码、查询链码等操作。

Fabric要求创建、加入与更新通道的权限必须具有通道组织的管理员身份。调用setGlobals设置全局环境变量,CLI客户端能够灵活切换指定容器的管理员角色,可以直接连接并操作指定的Peer节点,先切换到Peer0/Org1节点。

接着采用Org1管理员身份执行peer指令,将通道配置文件Channel.tx发送给Orderer节点,创建mychananel的应用通道。如果创建成功,则返回一个创世区块block,它会存储在 peer 节点的文件系统中,包含 channel.tx 指定的通道配置信息。

遍历所有节点,调用setGlobals切换指定节点,执行peer指令,将Org1组织包含的Peer0/Org1和Peer1/Org1节点加入mychananel应用通道,将创世区块mychananel.block设置成命令行参数。Org2组织类似。

joinChannelWithRetry 函数中的 setGlobals 是设置 CLI 容器的环境变量的函数。例如:setGlobals 1 2 设置 CLI 的身份为 admin.org2,连接 peer1.org2 节点。

使用 peer channel join 命令让节点加入通道,$CHANNEL_NAME.block 就是前面创建通道成功时返回的区块,该区块在上面 org1.peer0 创建通道时保持在 CLI 容器内,所以能直接使用。节点成功加入通道后会创建 CHANNEL_NAME.block 开头的链。

一个组织只能有一个锚节点,节点加入通道后才能进行更新,连续两次调用updateAnchorPeers,更新两个组织的锚节点配置,用Org1管理身份更新Peer0/Org1的配置,并指定锚节点配置更新文件Org1MSPanchors.tx,Org2组织同理。

连续两次调用installChaincode分别在Peer0/Org1和Peer2/Org2中安装chaincode_example02链码,并将链码命名为“mycc”且版本1.0,如果链码安装成功,在指定安装目录/var/hyperledger/production/chaincodes下存在name.version的链码文件。

实例化链码必须在安装过链码的节点上进行,同一个通道内所有节点上相同的实例化数据在通道账本中是共享的,用户只需要在任意一个Peer节点上成功执行一次实例化链码操作,并通过排序打包后将实例化数据广播到其他节点上,通道内所有合法节点都可以访问该链码的实例化数据。

实例化将链码添加到通道上,启动目标节点的容器,初始化与链码相关的初始值,这里的初始值为 [“a”,”100″,”b”,”200″]。”实例化“ 过程会产生链码的容器,例如: dev-peer0-org1.example.com-mycc-1.0 。实例化过程需要指定背书策略,通过 -P 参数设置,这里的策略定义为 AND (‘Org1MSP.peer’,’Org2MSP.peer’) ,表示任何交易必须要有 org1 和 org2 节点的共同背书。

Peer0/Org1上调用链码查询函数chaincodeQuery和链码调用函数chaincodeQuery。查看A的余额,并从账户A中向账户B中转账10元。

Peer3/Org2上安装链码,执行查询A的余额,检查余额是否为90元,如果是说明转账成功。

使用fabric提供的cryptogen工具生成文件模板

$ cryptogen showtemplate crypto-config.yaml

进行修改,添加一个组织,一个orderer节点.

根据crypto-config.yaml文件生成证书文件:

$ cryptogen generate –config=crypto-config.yaml

查看生成的证书文件夹结构:

需要从fabric的源码案例中拷贝configtx.yaml文件

$ cp $GOPATH/src/github.com/hyperledger/fabric-samples/first-network/configtx.yaml

对configtx.yaml文件进行修改.

修改之前,创建一个文件夹,来保存即将创建的创世区块文件

将创建区块文件和通道的命令写到一个脚本中! generate.sh

脚本文件和配置文件的目录结构:

执行generate.sh文件生成创世区块文件和通道,其实只有一个组织,也没必要生成锚节点更新文件..

$

配置docker-compose文件:

启动容器, 启动后查看容器运行情况

$ docker-compose up -d

$ docker-compose ps

在这里,创建两个脚本文件,用于docker容器的管理

clear_docker.sh 文件:

restart.sh 文件:

创建配置文件的时候,有两个文件可以进行参考…

修改后的sdk配置文件:

创建出一个模型对象,给其赋值,并开始初始化sdk

使用 pkg/fabsdk/fabsdk.go中的New()方法进行实例化

创建请求之前,需要使用 gopackager.NewCCPackage 方法生成一个resource.CCPackage 对象,传递两个参数,一个是链码的路径(相对于工程的路径), 一个是GOPATH的路径.

安装链码,使用pkg/client/resmgmt/resmgmt.go文件中的方法

创建请求之前,需要生成一个*cb.SignaturePolicyEnvelope类型的对象,使用 third_party/github.com/hyperledger/fabric/common/cauthdsl/cauthdsl_builder.go 文件中的方法即可,提供了好几个方法, 使用任意一个即可.这里使用 SignedByAnyMember 方法: 需要传入所属组织ID

实例化链码

使用 pkg/client/channel/chclient.go 中的 Execute() 方法,来进行数据写入的操作:

rsp, err := model.Channelclient.Execute(req)

写入之前,要创建请求:

tempArgs是要传给链码的参数,可以做下封装,就不受参数个数的限制了

使用 pkg/client/channel/chclient.go 中的 Query() 方法,来进行数据查询的操作: 查询之前,同样需要创建请求.

链码在工程中的路径应该是 工程名/chaincode文件夹

比如:

driverFabricDemo/chaincode

而不应该省略掉工程名这样写: chaincode

错误原因:cert.URIs 和 tpl.URIs 这两个字段没有被定义.

进入tpl对象中, /usr/local/go/src/crypto/x509/x509.go 是个结构体,并没有发现 URIs 字段

对go版本进行升级,从1.9.3升级到1.11.3, 再次进入 /usr/local/go/src/crypto/x509/x509.go 文件中,查看结构体内容:

在执行sdk的Excute()方法时报错.

方法不存在,一般是由于链码的Invoke方法中的方法名和Excute()方法传入的方法名不一样.

但是可以肯定的是,链码的Invoke方法中的方法名和,项目中执行Excute()方法时传入的方法名是完全一样的! 但是很奇怪了,为什么会出现这个错误呢? 使用 docker rmi 删除掉 dev-peerx.travle.xq.com 的镜像,再重新运行即可.

在创建实例化链码请求的时候

总是提示

Cannot use str (type *cb.SignaturePolicyEnvelope) as type *common.SignaturePolicyEnvelope less… (?F1) Inspection info: Reports composite literals with incompatible types and values

明明是相同的类型,却总是报错,应该是IDE的问题.把vendor文件夹删除后,就不会有提示了. 再使用vendor对工程进行init 和 add +external 就好了!!

出现这个错误,一般都是配置文件哪个地方写错了,需要细心检查

Fabric 是超级账本联盟推出的核心区块链框架,它适合在复杂的企业内和企业间搭建联盟链。根据超级账本联盟的目标, Fabric 被建设为一个模块化的、支持可插拔组件的基础联盟链框架。;

与以太坊系的Quorum不同,Fabric从一开始就只考虑企业间的应用。其独有的channel概念,将企业根据业务目的不同以不同的子网连接起来, 每一个子网对应一个channel,而每个channel有自己独立的区块链。而Quorum很显然是只有一个公网(所有企业节点都加入进去),企业与企业间的私有业务是通过Private Manager 完成的。

理解channel的最简单方法就是,将它类比为一个消息服务提供的Topic,实际上Fabic最早就是基于Kafka?的分布式消息服务来实现。

? ? ? ?在Fabric网络中,一个企业可以有一个或多个节点加入整个联盟链;一个企业可以加入1个或者多个Channel(子网);? 一个节点可以加入1个或者多个channel。每个channel构成一个子网,所以Fabric 是 一种由子网组成的网络。

那么Fabric是怎么实现智能合约的执行和完成业务上链(将事务结果记录在区块链里)的呢?

与其它框架不同, Fabric 将整个过程分成了三个阶段:

业务背书阶段 : 客户的请求发送的背书节点,通过智能合约完成业务的计算(但不更新状态),并完成背书;将背书结果返回个客户端。

业务的排序阶段 : 客户端将背书结果通过Channel被发送到排序节点(orderer),在排序节点完成事务的排序,并打包到block里,最后下发给所有连接到channel的节点。

业务验证并写入账本阶段 : 通过Gossip 网络,所有Channel的节点都会接收到新的block,节点会验证block中的每一个事务,确定是否有效:有效地将会跟新world state,无效的将会标志为“无效”,不会更新World state,但整个block会被完整的加入到帐本中(包括无效的事务)。

根据以上的描述,Fabric 节点实际可以分为? ,普通节点和Order节点:

?Peer, 普通节点, 完成背书(包括只能合约的执行)和验证.

orderer,? 排序节点,完成排序。

加入orderer节点的Fabric网络可以被描述如下:

每一个Channel,都定义了所有属于channel的节点,但是并不需要所有节点都连接到Orderer 节点(节点间可以通过gossip 协议通讯来传播私有数据或事务).

? ? ? ?在区块链中,共识是区块链的基础。与公有链不同,联盟链的共识要求所有加入账本的事务是确定的、最终的,也就是不可以有分叉,区块与区块间的顺序是一定的,只存在唯一条链。在Fabric 中,这个客观需求正是由排序实现的,所有的事务将被提交给orderer节点获得确定的顺序,并最终打包成block进入帐本。 Fabric 从1.4.1开始支持基于Raft实现排序服务,? 可以认为基于Raft实现共识。

基于RAFT的排序服务相对于早期的Kafka 具有更好的分布性,配置更加简单,是联盟链里常用的一个常用的达成共识的算法,Quorum就 默认使用RAFT作为共识层。简单的说,RAFT是一个leader和follower的模式, 所有加入RAFT网络的节点,任意时候都有一个leader,? 只有这个leader有权决定事务的顺序,并打包成Block,其它节点只能作为follower提交事务和同步block。

基于FAFT网络,每个企业可以有一个或多个节点参与到Orderer中去。在Frabric中企业间的网络连接可以变化成如下形式:

? ? ? ?区块链的使用用户在以太网中被称作EOA(External of Account), EOA的载体是钱包。我们沿用这个概念,来看看Fabric是如何实现用户和发起事务的。Fabric中EOA是一个CA中心发布的certificate(x.509),一个Certificate代表一个Identity(这与以太坊还是有很大区别的, 以太坊中一个EOA其实是一个hash地址),EOA能够参与的channel以及被授权的操作是有channel的MSP( Membership Service ?Provider)决定的(如下图)。

注:certificate 是一种密码学上验证身份的通用做法; certificate包含了个人的信息,公钥以及发布这个certificate的CA的签名。验证方只需要拥有这个CA的证书(包含CA的公钥),就可以验证这个签名是否正确,certificate的内容是否有篡改。简单的说,通过CA和Certificate,我们可以获得一个可验证的的身份和信任链。

? ? ? 如上图,fabric中通要使用wallet作为EOA的载体,一个Wallet中可以包含多个Identity(x.509 certificate)。 Identity 通过 CA提供的信任链来验证正确性。

? 验证了身份之后, Fabric 通过MSP在区块链网络中解决该身份是否代表组织的成员和在组织内具有什么角色。例如,channel首先会验证当前用户Identity是否是有效地身份,然后通过MSP查看其所处的企业和具有的角色,最终确定该用户是否有权执行操作。

可以说,Fabric的访问控制是通过MSP来完成的。在每一个需要访问控制的地方都需要定义一个MSP。? 例如,每个channel都定义一个MSP,这个MSP规定了在channel范围内资源的访问权限。 MSP 是Fabric里一个晦涩难懂的概念,也是其赋予企业间安全访问的基础。

前文提到, Fabric 将业务处理和上网分成了三个部分, 背书,排序,验证后加入账本。

其中背书是Fabric执行智能合约的阶段。以太坊中,智能合约是在EVM中执行的,有多种语言支持。 在Fabric,智能合约被称为chaincode: 一个chaincode 可以理解为是智能合约的容器,可以包含一个或多个智能合约, 不用于EVM, chaincode是在 JVM 或NodeJS中执行。

客户应用程序通过智能合约来访问账本,每一个可访问的智能合约都被安装在客户端可以访问的节点上,并被定义在channel里。(有只能合约的节点被称为背书节点,没有只能合约的节点被称未提交节点,提交节点只维护账本)

客户应用提交一个交易请求, 请求到达背书节点, 背书节点首先会验证客户的签名,确保客户的身份有权执行本次交易,接着执行交易提及的智能合约(chaincode),并生成一个背书响应(或者叫做交易提案,tran-proposal)。这个背书响应中通常包含World state 的读集合,写集合, 以及节点对本次交易的签名。这里与以太坊系联盟链最主要的不同是: 背书阶段只模拟交易,并不真正更新交易结果。 而真正更新交易在第三阶段完成。背书节点最后将生成的背书响应fanhui给客户端, 智能合约部分的执行就结束了。

通常一个交易的执行需要多方的签名,所以客户端需要将一个交易发送给多个背书节点,这些背书节点的选择需要满足背书策略的要求。

下图是一个包含有客户、背书节点,提交节点的网络示意图。

根据Fabric官方的参考文档,客户交易的正果过程可使用下图描述。

如上图,从1到3,为背书阶段,4为排序阶段,4.1,4,2, 5为验证提交阶段。 参考 Frabic的节点 概念,可以了解更多在交易细节的概念。??

总的来看, Fabric 更专注于企业间,通过上文,可以让大家对Fabric的基本构成与概念有一个总的了解。? Fabric本身并不神秘,都是使用的现有的企业间的技术。要更好的了解,建议参考阅读分布式消息系统和企业的安全基础设施(CA相关)的支持。与以太坊系联盟链实现比较,? Fabric 的子网更概念对于复杂企业间应用适应更强,但是其复杂的安全考量,使得运营成本很高,另外,Fabric 使用Certificate做为用户身份,有很大的局限性,在新的2.0里,Fabric对于此处将有所改变。

下一篇,我们将来看看Sawtooth?, 由Inter 提供的区块链框架。

区块链之联盟链(一) 认识以太坊

区块链之联盟链(二) 认识Quotum

区块链之联盟链(三) 认识Fabric

区块链之联盟链(四) 认识Sawtooth

都看完了嘛?相信现在您对使用chaincode有一个初级的认识了吧!也可以收藏页面获取更多使用柴暖时需要发车嘛知识哟!区块链、虚拟币,我们是认真的!

相关内容

标签: 节点 文件 fabric
使用chaincode(使用柴暖时需要发车嘛)文档下载: PDF DOC TXT