当前在公司一直学习和研究区块链的相关知识,在大致了解了公链(bitcoin)之后,即将主要的精力投入到联盟链的学习和研究中。对于联盟链而言,我们是以hyperLedger作为主要的研究对象。本人作为一个区块链行业的小白级人物,将以此系列作为自己学习和调研经历的总结和整理,为后续区块链项目应用提供指导。
本文档作为整个系列的第一部分,介绍的内容大致包括:
区块链作为一个新兴的技术,其作为一个p2p分布式账本技术,以智能合约、安全加密等相关优势,能够彻底改变融资、供应链、以及其他交易网络,为其创新和发展带去新的机遇,同时还能减少运营成本,降低风险。区块链技术本身的发展,大家有目共睹,这里不在赘述。
区块链作为一个刚开发的技术,当前还不能满足商业交易中各种复杂的需求。其扩展性还存在问题,也不能支持私下机密交易,这些限制都是其难以在众多以业务为主的应用程序的运行自如。为了应对各种各样的市场需求,hyperLedger的设计,在保有区块链当前的优势的基础上,以产业应用为重点,解决了现有的缺点,扩展业内先行者的功能。
所谓的超级账本(hyperLedger)其实是一个用于支持企业自定义区块链业务的开发框架。作为一个开源的区块链项目组 ,超级账本还包括4个子项目:Sawtooth、Iroha、Fabric、Burrow。其中fabric最广为人知,也是我们后续主要的研究对象。
在介绍hyperLedger的特点之前,我们先了解下企业级区块链产品的诉求,引出hyperLedger的相关特点,以此来判断超级账本是否能够满足企业级区块链产品的需求。
如上图所示,hyperLedger希望能够构建一个这样的系统:这个系统中包括众多的区块链网络,使得每一个网络账本都能够执行不同的业务。同时,hyperLedger还有一个寻址系统,能够通过一个账本的交易,发现并利用另一个账本中的争当交易和智能合约。
hyperLedger架构的设计满足于各种使用场景下的网络:可以是公开运行,易于融入到移动应用;也可以完全私下运行,参与者需要进行身份验证和授权。hyperLedger能够允许网络之间互相访问,并对参与者进行授权和权限管理。
hyperLedger能够保证区块链用户的业务逻辑和其他交易信息的机密性,做到除了合约涉及的利益相关方或者交易中的资产,没有人能够访问这些数据。
hyperLedger项目组中存在9个正式的子项目,这些子项目解决了区块链的核心的基础问题,比如分布式账本、区块链结构浏览器、不同区块链之间如何进行价值交换等,9个子项目分别为:
hyperLedger在0.6和1.0两个版本在架构上进行了很大的改动,本文档针对V1.0版本进行相关的介绍。
将共识部分提取出来(orderer),同时每一个组织中可以存在多种peer节点,例如背书节点(E),提交节点(C),每一个组织在加上对应的排序节点,就组成了一个区块链网络
整个架构将共识分布拆分为三个:endorser(背书)、committer(提交)、orderer(排序)。上述三个都是不同的节点,其中endorser和committer还保留在peer节点中,交易打包和交易排序已经被独立到orderer节点中。
所谓的chain(链)实际上是包含Peer节点、账本、ordering通道的逻辑结构,它将参与者与数据(包含chaincode在)进行隔离,满足了不同业务场景下的”不同的人访问不同数据“的基本要求。同时,一个peer节点也可以参与到多个chain中(通过接入多个channel);如下图所示:
通道是有共识服务(ordering)提供的一种通讯机制,类似于消息系统中的发布-订阅(PUB/SUB)中的topic;基于这种发布-订阅关系,将peer和orderer连接在一起,形成一个个具有保密性的通讯链路(虚拟),实现了业务隔离的要求;通道也与账本(ledger)-状态(worldstate)紧密相关;如下图所示:
peer 1,2和N订阅红色通道,并共同维护红色账本; peer 1和N订阅蓝色通道并维护蓝色账本; 类似地,peer 2和peer N在黑色通道上并维护黑色账本。
在这个例子中,peer N在订阅了所有通道,我们看到每个通道都有一个相关的账本。 一般来说,我们称不涉及所有peer的账本为子账本,另一种是系统账本,即全账本。
通道和账本的组合是一个虚拟链,因此一个区块链网络可以具有1个共识服务的多个链。 系统通道和全账本构成系统链。 每个区块链网络只有1个系统链。如果交易是公开的,区块链网络可能永远不需要多个链; 所有的交易对所有Peers成员都可见。 然而,在成员间进行私密交易(例如双边合同),单独的链是隔离数据、提供保密的方式。
总体流程如下图所示:在新的架构中,Peer节点负责维护区块链的账本(ledger)和状态(State),本地的账本称为PeerLedger,其结构如下:
整个区块结构分为文件系统存储的Block结构和数据库维护的State状态,其中state的存储结构是可以替换的,可选的实现包括各种KV数据库(LEVELDB,CouchDB等);
智能合约是一个接口的代码实现,部署在Fabric区块链节点上。智能合约是和fabric区块链交互的唯一渠道,同时也是transaction(交易)的唯一来源。
当前fabric的智能合约支持go和java语言进行开发,所使用的sdk是shim包,也就是使用shim包,用go语言进行智能合约的开发。
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
fmt.Println("ex02 Init")
_, args := stub.GetFunctionAndParameters()
var A, B string // Entities
var Aval, Bval int // Asset holdings
var err error
if len(args) != 4 {
return shim.Error("Incorrect number of arguments. Expecting 4")
}
// Initialize the chaincode
A = args[0]
Aval, err = strconv.Atoi(args[1])
if err != nil {
return shim.Error("Expecting integer value for asset holding")
}
B = args[2]
Bval, err = strconv.Atoi(args[3])
if err != nil {
return shim.Error("Expecting integer value for asset holding")
}
fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)
// Write the state to the ledger
err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
if err != nil {
return shim.Error(err.Error())
}
err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
上述是一个智能合约初始化函数,我们注意到该函数在创建新的数据时,使用的是stub.PutState(A, []byte(strconv.Itoa(Aval)))。pushState()即使上述shim.ChaincodeStubInterface中用于进行key-value新增的接口。后续我们可以自行定义chaincode进行transaction的生成。
以下,本人将真实展示fabirc框架的运行,以及智能合约的使用。关于fabric环境的部署比较麻烦,本人将在其他文档中进行详细的介绍。
具体的执行方式和结果如下: