流程图
1 | graph TB |
1 | graph TB |
peer/main.gonode.Cmd()peer/node/node.gocommon.InitCmdpeer/node/start.go:serve()mgmt.GetLocalMSP().GetType()aclmgmt.NewACLProviderlsscc.DeployedCCInfoPrivider{}identityDeserializerFabtoryOperationsSystem.Start()metricsProvidermembershipInfoProviderledgermgmt位于core/ledger/ledermgmt/ledger_mgmt.go:initialize()peer.CacheConfiguration() 配置信息缓存。serverConfig 加载服务端配置NewPeerServer 生成用户节点通信服务。NewDeliverEventsServer 生成传输区块和块事件服务startChaincodeServer 启动链码服务startAdminServer 启动admin操作服务默认公用peer节点端口NewEndorserServer 生成背书服务initGossipService 初始化流言服务sccp.DeploySysCCs("", ccp) 部署系统链码NewLifeCycle 初始化生命周期管理服务peer.Initialize 节点初始化registerDiscoveryService 注册节点发现服务LoadPreResetHeight 检查节点账本是否重设RegisterEndorserServer 注册背书服务peerServer.Start() 节点服务启动1 | graph TB |
调用peer channel create的时候,会创建$CHANNEL_NAME.block的文件在程序目录。
容器内安装ping
调试环境下启动链码容器,链码会连接节点的端口,会导致访问不了,因此需要调整启动容器的参数。把peer的地址修改下。
实例化链码调用在账本中无法查询。

Organization 组织
组织(organization)代表一组拥有共同信任的根证书(可以为根CA证书或中间CA证书)的成员。
这个概念很重要,因为Fabric的共识是基于组织为单位的,并不是成员的节点为单位。
这些成员由于共享同样的信任根,彼此之间信任度很高,可以相互交换比较敏感的内容。同一个组织的成员节点在网络中可以被认为是同一个身份,代表组织进行签名。组织中成员可以为普通成员角色或者管理员角色,后者拥有更高的权限,可以对组织配置进行修改。
组织一般包括名称、ID、MSP信息、管理策略、认证采用的密码库类型、一组锚点节点位置等信息。通常情况下,多个组织为了进行数据沟通,可以加入到同一个通道中。
这里就涉及到一些细化领域的定义问题:
组织以行业为单位,比如中国银行、建设银行所有的银行作为一个组织。即每个银行是一个成员,节点服务托管。
组织以银行为单位,比如中国银行、建设银行分别为一个组织。
这个问题的,本质上还是数据问题。
情况一:银行没有节点。
网络层面是同一个身份,当这个行业都没有自建节点的时候,并且是被三方托管的时候,就没有必要单独成为一个组织。
情况二:银行有节点,并且每个银行之间数据私有,不期望别的银行知道。
银行自建区块链节点,参与共识认证过程,那么每个银行都可以作为一个单独的组织。
银行要参与链码的管理相关的事务,比如,确认链码升级、共识策略变化等操作。
本质上是对区块链节点数据存在安全要求,期望独立开发区块链操作相关的应用,并且数据存储在自己的服务器上的时候。
工具默认生成结构
1 | ├── ordererOrganizations [排序组织] |
查看节点证书信息
1 | openssl x509 -in peers/peer0.government.peer.com/msp/signcerts/peer0.government.peer.com-cert.pem -text -noout |
验证节点证书的签发机构
1 | openssl verify -CAfile ca/ca.government.peer.com-cert.pem peers/peer0.government.peer.com/msp/signcerts/peer0.government.peer.com-cert.pem |
验证Government组织的管理员证书签发机构。
1 | openssl verify -CAfile ca/ca.government.peer.com-cert.pem users/Admin@government.peer.com/msp/signcerts/Admin@government.peer.com-cert.pem |
在Fabric中CA有2类,一类是通信层面的TLS证书。另外一个层面是节点,用户层面的证书,这块证书是涉及节点权限,用户访问权限的控制。
TLS的CA表示着,访问端口的时候,需要带上对应端口使用的TLSCA证书文件。
Broadcast,广播
客户端将请求消息(例如完成背书后的交易)通过 gRPC 接口发送给 Ordering 服务。Orderer 进行本地验证处理后,会转化为入队消息发给后端共识模块(如 Kafka)。
发给 Orderer 的 Broadcast 请求消息包括链码的实例化、调用;通道的创建、更新。
整理一些看SDK实现时候有意思的代码
在Fabric的SDK的新的版本,引入了Gateway在后续版本中建议使用此模块来访问Fabric网络,因为这个库简化了高可以的访问。
1 | // fabric-network/lib/gateway.js |
1 | /** |
区块链交互本质上和网络交互存在一个相同的问题,当发生在区块链层面的数据提交发生成功或者失败的时候。
业务层面,应该如何避免数据不一致的问题。
例如:
A程序,发出一个请求。
B程序开始处理。
A程序崩溃。
A程序重启后,如何处理在崩溃瞬间的任务处理策略,是应该重试还是修正。
联盟链本质上存在一个问题,CAP问题,没有事务,如何解决最终一致性问题,并且有效的返回前端用户正确的响应,是我们应该考虑和解决的问题。
传统的分布式事务和区块链存在差异,传统事务是可以重试,在业务过程失败, 区块链执行成功的情况,理论上是不应该重试,重试会导致区块链网络存在新的交易记录。
整个本质上还是分布式事务处理问题
CAP在区块链上的问题,个人觉得使用ebay的方案就可以了。支付宝DTS方案,基于2PC模式肯定也不适合区块链场景。
蘑菇街的方案个人感觉比较适合常规的分布式事务的处理,理解起来比较简单,不过在真实的场景实现应该还有很多细节问题。
执行操作
1 | Generate Blockchain Transaction Id |
重启后执行
1 | For each message in queue |
浏览器接口行为,当多台负载的情况下,一个崩溃后会导致数据重试到其它服务器,这个时候区块链层面的交易ID是不同的。
因此,不能在崩溃重启的时候,直接重写旧的交易数据,因此区块链只兜底,在区块链数据已经写入的情况,中心化数据库没有写入时的数据一致。
基于用户会话的接口控制,必须保证用户同时只能登录一个地方,这个有可能不符合需求,比如需要浏览器,手机同时登录,这个时候,如果不是公用Token的处理模式,就会导致存在问题。
解决在多台服务负载的情况下,保证数据一致性
分布式事务问题, 可能是金融系统最难处理的问题之一了
CAP原则, 在分布式系统中, 一致性(Consistency)、可用性(Avaliability)、分区容错性(Partition Tolerance), CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
因此, 在分布式系统中都不追求强一致性, 只需要保证最终所有节点的数据一致即可.
ACID数据库在写入和更新资料的时候保证事务的正确可靠必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。