近期通过对fabric的研究,有很多问题难以解决,不知道IBM推了那么区块链商业项目,是怎么解决的:
1、部署一个合约就会启动一个docker镜像,根据pbft方式,一台机器上部署4个节点,那么启动100个合约就会启动400个镜像,这样是不是启动的镜像太多了,hyperledger为什么要这样设计?难道就是方便用docker吗?
2、什么时候建一个智能合约,是一个应用一个智能合约,还是一个应用可以多个智能合约?智能合约之间貌似不可以相互访问。比如我在A智能合约里创建了3个table,然后B智能合约要去读表里的数据,这样怎么能够实现?
3、fabric开发智能合约需要操作rocksdb,,可是事务处理如何做? 还有就是rocksdb的单表查询,只能根据PK查询,不能根据其他字段查询,怎么处理呢?
目前的v0.6-dev-preview版本确实有一部分功能不够完善,不过在接下来马上要发布的v1.0版本会得到解决。
以下是针对所提问题的个人解答:
1. 4个节点可以部署在4台机器上,这样可以一定程度减少单台机器启动的docker镜像数; 目前一般的系统中并不会部署那么多的合约。Hyperledger使用docker的原因,个人认为有以下几点: 1). 可以实现不同合约之间的隔离, 合约之间无法直接调用,合约之间的交互需要通过peer控制; 2) 可以很容易支持不同语言实现的合约, 目前已支持Golang, Java, 将来也可以很容易地实现其他语言的支持; 3) docker社区较为成熟,使用成本较低。
2. 一个应用可以对应一个智能合约,也可以有多个。智能合约之间可以互相访问,但是需要做好权限控制。API-> https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.InvokeChaincode
3. Fabric节点类似于一个event sourcing系统,每个节点要执行的交易是已经排序好的event,然后顺序执行,并生成一致的结果(非拜占庭节点&确定性输出)。Rocksdb的查询方式确实较单一,不支持类似SQL那么灵活的方式。可以考虑使用https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.GetRows 若这种方式还无法满足需求,可考虑创建额外的索引表来支持复杂的查询方式。在Fabric v1.0会支持更多的存储方式, goleveldb, CouchDB等等,这样会直接提供复杂的查询支持。
收起