内容摘要
这一部关于区块链开发及运维的电子书。
为什么会写区块链电子书?因为2018年是区块链年。
这本电子书是否会出版(纸质图书)? 不会,因为互联网技术更迭太快,纸质书籍的内容无法实时更新,一本书动辄百元,很快就成为垃圾,你会发现目前市面的上区块链书籍至少是一年前写的,内容已经过时,很多例子无法正确运行。所以我不会出版,电子书的内容会追逐技术发展,及时跟进软件版本的升级,做到内容最新,至少是主流。
这本电子书与其他区块链书籍有什么不同?市面上大部分区块链书籍都是用2/3去讲区块链原理,只要不到 1/3 的干货,干货不够理论来凑,通篇将理论或是大谈特谈区块链行业,这些内容更多是头脑风暴,展望区块链,均无法落地实施。本书与那些书籍完全不同,不讲理论和原理,面向应用落地,注重例子,均是干货。
==============================
区块链征信解决方案探索
翻看了无数的文章没有找到一篇关于谈征信在区块链上怎么落地的文章。
现在的情况是大家都知道区块链做征信没问题,区中心化,不可撰改,简直是征信系统而设计的。那么怎么使项目落地呢?没有一篇文章谈到这个问题。可能有些大公司已经实现了,处于技术保密,没有分享。
看来只能靠自己了,以太坊和超级账本一直在研究,最近一段时间研究以太坊比较多,但是发现征信这个系统是在不适合在以太坊上实现,于是有回到超级账本上。
回到超级账本上感觉有点不适应,超级账本没有 Token , 超级账本的合约实现与以太坊完全不同。两个系统是两种思维解决同一个区块链需求。
一看 hyperledger 就是当前IBM风格,hyperledger 特点,体系庞大,结构复杂,难以理解,运维复杂。简单的问题用复杂的方式思考,做出一个复杂的系统,可用性极差。IBM的产品特点是,你只能他们合作,一旦合作(上了船)就摔不掉,从他们小型机,到中间件产品,以及各种行业解决方案。IBM的系统出了问题,只有IBM的人才能解决。
随者 hyperledger 开源,我希望 hyperledger 的风格能脱离IBM的影子。
回到正题,研究了几个 hyperledger 提供的 Example 后,对怎么实现征信需求,有了一点思路。
首先 chaincode 合约并不复杂,由两个核心方法组织,分别是Init和Invoke。其次数据操作类似 map 数据结构, shim.ChaincodeStubInterface 接口提供了 get, put, del 等操作。
需求分析与概要设计
证信系统信息查询问题,一怎样查询?二查询哪些信息?
区块不是关系型数据库,无法实现SQL那样的发杂查询,所以设计接口要尽量迎合区块链的,有些情况需要妥协,适应区块链的弱点和不足。
但是我们可以让数据库和区块链同时存在,相互弥补不足。
数据库部分我这就就不讲了,区块链的实现方式是,使用身份证码号查询,返回 json 数据。
数据结构
首先我们定义一个结构体用来存储身份信息,征信信息远不止这几项,请根据你的实际情况定义即可
package mainimport "fmt"import "encoding/json"type Person struct { No string `json:"no"` Name string `json:"name"` Sex bool `json:"sex"` Age int `json:"age"` Address string `json:"address"`}func main(){ person := &Person{"430725198001190911","景峯",true,30,"Shenzhen,China"} personJson, _ := json.Marshal(person) fmt.Println(string(personJson)); person1 := &Person{ No: "430725198001190911", Name: "Neo Chen", Sex: true, Age: 35, Address: "Shenzhen, China"} json2, _ := json.Marshal(person1) fmt.Println(string(json2)) }
编译,运行,测试定义json是否正确。
neo@MacBook-Pro ~/golang/contract % rm -rf person && go build person.go && ./person {"no":"430725198001190911","name":"景峯","sex":true,"age":30,"address":"Shenzhen,China"} {"no":"430725198001190911","name":"Neo Chen","sex":true,"age":35,"address":"Shenzhen, China"}
最终我们只需要结构体复制到合约代码中。
type Person struct { No string `json:"no"` Name string `json:"name"` Sex bool `json:"sex"` Age int `json:"age"` Address string `json:"address"` }
将征信资料写入区块链
通过下面的函数,将征信数据写入到区块链上。
func (s *SmartContract) createPerson(stub shim.ChaincodeStubInterface, args []string) sc.Response { if len(args) != 6 { return shim.Error("Incorrect number of arguments. Expecting 6") } var person = Person{No: args[1], Name: args[2], Sex: args[3], Age: args[4], Address: args[5]} personAsBytes, _ := json.Marshal(person) stub.PutState(args[0], personAsBytes) return shim.Success(nil) }
查询区块数据
通过下面方法查询链上的征信资料。
func (s *SmartContract) queryPerson(stub shim.ChaincodeStubInterface, args []string) sc.Response { if len(args) != 1 { return shim.Error("Incorrect number of arguments. Expecting 1") } personAsBytes, _ := stub.GetState(args[0]) return shim.Success(personAsBytes) }
删除区块
通过下面方法删除征信数据。
func (s *SmartContract) deletePerson(stub shim.ChaincodeStubInterface, args []string) sc.Response { if len(args) != 1 { return shim.Error("Incorrect number of arguments. Expecting 1") } personAsBytes, _ := stub.GetState(args[0]) err= stub.DelState(args[0]) if err != nil { return shim.Error("Failed to delete Student from DB, key is: "+args[0]) } return shim.Success(personAsBytes) }
这里仅仅讲了一下思路,因为家中刷新(刷墙)所以我的小服务器被覆盖起来了,没有 hyperledger 开发环境,所以无法提供完整的合约代码。
作者:netkiller-
来源:https://my.oschina.net/neochen/blog/1633505