区块链是一种全新的信息记录模式,每一个参与者都可以是记录者,分布式账本。它不是一种单纯的技术,是多个老技术和新技术的结合应用,去中心化,如果是联盟链应该是多中心化了,类似于git,p2p下载,数据不可篡改,不可抵赖。
第一代是加密货币, 第二代是智能合约, 第三代是联盟链(私有链)。
共识算法
Merkle 树(简化支付验证),查询的话,区块头(版本号,区块高度,难度值,时间戳,随机数,前一区块哈希,后一区块哈希)
数据库, 任何一个数据库都可以, 中本聪使用 leveldb
boltdb, couchDB
区块链中的联盟链(私有链) 的开源项目Hyperledger fabric,主要代码由IBM,Intel,R3,各大银行等贡献,链中的参与需要授权, 参与者都是经过预先选择的, 并且仅限于这些参与者访问网络。运行在许可模式下,因此可为记录提供更细粒度的访问控制,从而增强了隐私,只有参与交易的各方才必须要达成共识,因此在性能上有所提高。只能在交易层面达成共识, 不能在账本层面达成共识。
Fabric 将节点区分为客户节点(client)、对等节点(Peer)和订购节点(Orderer)。
节点是区块链的通信主体,是逻辑概念。 节点之间通过gRPC 消息进行通信, 对等节点间通信使用 Gossip 协议。每个Peer 节点必定是一个记账节点,除记账节点外,它也开源担任其他一到多种角色,即某个节点可以同时是记账节点和背书节点,也可以同时是记账,背书,主节点,锚节点。
联盟链不允许节点任意加入,因此会对节点认证做出严格的限制,主要是用到了数字证书。
在Fabric 上运行的主要是智能合约, 因此Fabric 的交易定义比比特币要宽泛很多。在比特币上, 一笔交易指的就是转账,而在Fabric 上,任何对数据的增删改查都是交易。
交易流程
智能合约,该术语有两种不同的常用方式,
智能合约代码就是用某种编程语言编写的软件。他作为一个软件代理, 或是代表其中某个一方,目的是履行某些义务,行使某些权限, 并以自动的方式控制分布式账本中的资产。因此,智能合约通过代码执行模拟,或模拟现实世界中合约逻辑,承担了分布式账本的任务和责任,尽管其合法性可能尚未明确。
所有的DLT 都支持以智能合约代码的形式履行智能合约。代码可以使用Go、Java for Fabric、Solidity for Ethereum,以及Java/Kotlin for Corda 编写。在Fabric 中使用了术语“链码”(chaincode),以此作为智能合约的同义词。
在Corda 中,智能合约不仅可以包含代码,还允许包含法律行文。智能法律合约是法律行文,其制定方式可以通过智能合同代码来表达和实施。
智能合约中封装了信息处理的完整方案,以此来经量简化整个网络的信息交易。智能合约通过编写, 可以被升级,通过升级来丰富其功能并增强其对事务的处理能力。所有的参与者都可以按照智能合约中的约定自动执行相关事务处理操作。
简单理解,hyperledger fabric 的区块链通过智能合约进行更新, 并通过共识的协作过程保持一致。
隐私
联盟链(私有链),企业对企业(B2B)网络的参与者对他们所共享的信息非常敏感。HyperLedger Fabric 通过使用channel(频道)的方式,让一组参与者来共同维护一套账本,其他的参与者无法参与其中,在channel 内部的网络对参与者是开放的。
部署实例: 陶辉笔记《区块链开源实现FABRIC 快速部署及CLI 体验》
简书: 李孝伟 《Hyperledger Fabric 基于Kafka 的多机部署》
Java: tualala《基于Hyperledger Fabric 交易系统账户的钱包模型的java Chaincode 实例》
Csdn: Physicaloser 《Hyperledger fabric 在现有组织中增加节点》
调用api 写入,读取等,账本状态交互API,交易信息相关API,参数API
Stub sim.ChaincodeStubInterface
Stub.PutState(key, value)
Stub.GetState(key)
Stub.GetStateByRange(startKey, endKey)
Stub.GetHistroyForKey(key)
Stub.DelState(key)
//创建一个组合对象, 类似hash 对象, 这个用于高并发,官方例子high-throuhput。
//compositeIndexName := “varName~op~value~txID”
Stub.CreateCompositeKey(compositeIndexName, attributes)
Stub.GetStateByPartialCompositeKey(compositeIndexName, keys)
Stub.SplitCompositeKey()
//返回交易提案中指定交易的交易ID
Stub.GetTxID()
chainCode 会执行完逻辑, 但是并不会在stub.PutState 的时候写数据库。
更新智能合约代码放在: /opt/gopath/src/, /github.com/hyperledger/fabric/examples/chiancode/go/***
根目录/opt/gopath/src/ 可以换, 目录 /github.com/hyperledger/fabric/ 保持这样的结构
Fabric
帮助脚本类文件(IBM 写的)
download-dockerimages.sh
generateArtifacts-3o4p.sh yourchannel 生成通道根证书,msp证书,orderer证书,peer证书,tls 证书等等和区块相关文件
e2e_cli/scripts/script.sh
证书:
共识排序服务
Fabric 的区块链, 本身是文件系统,不是数据库, 所以会把区块中的数据在LevelDB 中建立索引。
状态快照, 不支持并行验证
数据存储结构
智能合约代码