1、区块链技术概述2017年五月1 2016 IBM Corporation12 区块链技术介绍 OBC组网与智能合约3 智能合约的开发与示例2 2016 IBM Corporation3”继互联网后的又一大变革时代到来”、“互联网金融的终极形式”、“价值互联网的开端”、“Record of Things 记录一切”区块链在短短时间内获得了巨大的涟漪效应,IBM在2016年2月开放了OpenBlockChain技术并贡献给了Linux社区,引起了业界巨大轰动。那么区块链到底是怎样的一项颠覆性技术?其特点是什么?IBM区块链平台的特点是什么?未来会如何演变?区块链应用与已有应用的关系是什么?本片将对
2、这些问题逐一解链并进行探讨。序 2016 IBM Corporation4区块链介绍区块链是一种共享账本技术 ,商业网络中的任何参与方都可以查看交易系统记录(账本)什么是区块链? 2016 IBM Corporation5区块链是支撑比特币的底层关键技术区块链技术的分类?公有链Pow/Pos/DPos联盟链OBC/Etherenum pbft共识私有链 2016 IBM Corporation61. 是不受监管的,抗审查的影子货币2.区块链确保“类现金”的货币流通 唯一的, 不可篡改 确定的3. 是区块链首个应用 区块链 不是区块链是支撑比特币的底层关键技术什么是区块链? 2016 IBM C
3、orporation7更进一步什么是(企业级)区块链智能合约隐私保护共享账本共识保证共享账本适当的可见性;保证交易是真实和可验证的交易条款和交易状态内嵌在区块链系统中,驱动交易执行所有参与者一致同意才意味着交易在网络中通过验证跨商业网络共享的,不可更改的,分布式交易记录系统更广泛的参与,更低的成本,更高的效率什么是区块链?区块链是一种分布式多节点“共识”实现技术,通过区块链可以完整、“不可篡改”地记录价值转移(交易)的全过程。区块链的形成按照时间先后顺序进行连接,每一个参与共识形成的节点都有一份区块链信息的完整副本。 2016 IBM Corporation8比特币帐本什么是区块链? 2016
4、 IBM Corporation9OBC帐本什么是区块链? 2016 IBM Corporation10共享账本 记录商业网络中的所有交易 在参与者之间共享 参与者通过同步获取自己的备份 授权许可的,参与者只能看到适当 的交易记录信息 共享的记录系统什么是区块链? 2016 IBM Corporation11智能合约 合约中的商业规则内嵌在区块链系统中,在交易时被执行 可验证的、被签署的 编码在编程语言中 案例: 在公司债权发生转移时执行定义的合同条款什么是区块链? 2016 IBM Corporation12隐私保护 账本是共享的,但是参与者要求其具有隐私保护 参与者需要: 交易信息需要保密
5、 身份不和交易绑定 交易必须是真实的 密码学是这些步骤的核心什么是区块链? 2016 IBM Corporation13共识 共识是交易验证与确认的过程 当参与方是匿名时 交易确认代价高昂 的挖矿过程为匿名者提供验证,但需巨大计算成本(工作证明) 当参与者都是已知且可信时 交易确认的成本降低 多种替代方案 权益证明, 欺诈性交易产生时需要验证 (如债券交易) 多个签名(如5个参与者中3人的同意) 企业级区块链需要“可插拔的”共识什么是区块链? 2016 IBM Corporation14行业采用区块链的好处减少成本及复杂度提高可发现性可信的记录保存共享的可信流程为什么与业务相关? 2016 I
6、BM Corporation15区块链并非万能不适用场景1. 高性能(毫秒级)交易2. 小型组织 (无商业网络)3. 寻找数据库的替代方案4. 寻找消息传递的解决方案5. 寻找交易处理的替代方案为什么与业务相关? 2016 IBM Corporation16区块链技术平台对比 2016 IBM Corporation第一,跨组织协作。在区块链信任机制中,所有成员参与对信任价值的监督、控制和审计,对地址、链、公钥、私钥、摘要等几乎所有数据记录的要素,进行全生命周期的协作密码保护,而且是全球、随机的。一个联盟链,相当于一台全球超级密码、交换机、密钥签名服务器和密码本的总和, 信用连续。第二,永不宕
7、机。因为成员的动态运算机制,所有成员节点,进行实时同步,无法实现局部控制,全球节点的随机分布和相应在运算时钟和动态时间戳的控制下,永远不停机, 信用连续。第三,成员监管。区块链强信任的技术特点,来自其节点成员无中心的安全职责,成员局部的协作综合实现了体系安全的监管全部,融监管与过程之中,实现了系统学中安全的正反馈机制,在目前的计算条件下,尚无法通过跨越动态时间戳的可靠超越, 信用连续。为何要用区块链强信任机制解决中心化系统中信用不连续问题17 2016 IBM Corporation18区块链运营对比 2016 IBM Corporation19IBM开放区块链与Linux社区开放持续投入代码
8、运行环境账簿数据结构模块化(可插式)共识框架模块化(可插式)身份服务P2P网络技术升级包SDK(API)共识算法库(插入模块)成员管理策略区块链网关开发工具管理控制台区块链行业应用基础部分共享账簿(Shared Ledger)增值部分(模块、工具、封装)应用部分项目核心范围内核心APIIBM社区贡献Hyperledger项目 IBM在Blockchain 上持续投入,致力于行业应用 是Linux开源社区 Hyperledger的主要贡献方,致力于协同其他公司共同研发,公布Open Ledger标准(规格说明书),创建基于Linux的开源共享账簿(比Bitcoin更适合行业应用) 推动区块链技术
9、在行业中的应用(行业区块链) Blockchain已经作为一种实验性(网络)服务在Bluemix上推出 基于LinuxOne的开放计算平台对Blockchain的支持 IBM区块链 2016 IBM Corporation20IBM 开放区块链: 贡献给Linux社区的架构及代码Community + CodeCommunity + Code MEMBERSHIP包括OBC参与方的身份识别,隐私,可审计性。 BLOCKCHAIN | TRANSACTIONS经过共识过程进行分布式交易账本处理。 CHAIN-CODE“智能合约”, 提供在区块链上运行业务逻辑的能力。 APIs, SDKs, CL
10、I为开发人员提供以可编程方式控制区块链网络的能力。 2016 IBM Corporation21IBM开放区块链名词解释 Transaction 交易。账页中的一笔记录,用于确认一个事实,执行一段代码(chaincode) Ledger 账薄(账册)。由首尾相连的一组区块(block,有时也称为一个账页)构成,记录交易和区块世界的状态 World State 区块世界的状态。由一组变量组成,指明交易的执行结果 Chaincode 交易中记录的一段代码,其执行结果会改变区块世界的状态(World state) Validating Peer 验证节点。OBC区域链网络中的全功能节点,负责验证交易
11、、记录账薄、达成共识 Non-validating Peer 非验证节点。 OBC区域链网络中的半功能节点,负责验证交易,但不执行交易,也不记录账薄,通常用于代理 Validating Peer,提供REST service转发功能 Permissioned 许可。只接受成员接入,不接受匿名接入 Privacy 隐私。OBC中任何成员都能发起交易,但只有相关方才能知道,其它无关节点无法从交易回溯到交易方 Confidentiality 保密。OBC中只有交易相关方可以看到交易内容,其它无关节点只能验证交易的真实性 Auditability 审计。如果把审计方加入OBC交易,则它可以看到交易,从
12、而审计是否合规 2016 IBM Corporation22帐本结构示意 2016 IBM Corporation23OBC角色划分与工作内容 成员服务(Member Services) 注册(Registration) 身份管理(Identity Management) 可审计(Auditibility) 验证节点(Validating Peer) 进行共识(Consensus) 运行交易(Transaction) 维护账本(Ledger) 发出事件(Event) 非验证节点(Non-Validating Peer) 维护节点间的安全上下文(Secure Context) 代表客户向成员服务
13、或验证节点请求服务 向应用交付事件(Event) 处理API请求 应用(Application) 认证客户 把客户映射到安全上下文(Secure Context) 调用REST API 用户(Client) 登录与交易 2016 IBM Corporation24网络拓扑结构 整个OBC网络中含有两种节点,验证节点(Validating Peer)和非验证节点(Non-Validation Peer)。前者是全功能节点,构成全连通拓扑结构,后者是代理节点,通常挂接在相邻验证节点上 应用程序可以连接在验证节点,也可以连接在非验证节点在OBC网络中需要有一个密钥管理结节,考虑到PBFT算法的3f+
14、1共识机制,典型的容错(允许一个节点故障)环境需要有4个Validation Peer节点成员服务Member Services用户Client用户Client 2016 IBM Corporation25单节点和多节点网络 若OBC网络中只有一个VP节点(极端简化),则应用程序可以直接与该节点连接,执行其上的Chaincode代码,这时VP节点只需要记账,不需要共识 若OBC网络中有多个VP节点,则应用程序可以通过NVP节点(NVP与应用程序可以一对多)间接访问VP(NVP与VP之间多对一),这时VP节点需要验证交易、运行代码、记录账薄、达成共识 2016 IBM Corporation26
15、商业票据的Blockchain应用-星形架构 2016 IBM Corporation27IBM开放区块链参考架构概览(模块与服务) 2016 IBM Corporation28成员管理(Membership) 成员管理提供会员注册、身份保护、内容保密、交易审计功能 OBC所有成员 首先,通过Registration Authority(RA)注册获得许可 然后,通过Enrollment Certificate Authority(ECA)获得注册安全证书(ECert), 第三步(可选),通过Transaction Certificate Authority(TCA)获得交易安全证书(TCer
16、t) 使用二者之一签名发起交易请求 与公有链不同(所有参与方不需要身份认证,可直接进行交易) 2016 IBM Corporation29成员管理模型 2016 IBM Corporation30业务网络动态组建示例:第一个节点 OBC节点相关配置位于 在配置文件的peer小节中,validator_enabled为true表示节点是验证节点,否则是非验证节点discovery_rootnode在启动时使用,当这个参数被设置时节点会使用discovery protocal查找其他节点。这个参数是网络上另外一个节点的IP,这个节点作为网络上所有节点进行discover的起始点。rest_enab
17、led表明节点是否接受REST请求,对于生产环境一般把验证节点设置为false,只让非验证节点接受来自应用的REST请求第一个节点验证节点根节点IP: 9.181.8.8validator_enabled : truediscovery_rootnode: rest_enabled: false 2016 IBM Corporation31业务网络动态组建示例:第二个节点 第二个节点向根节点发送消息DISC_HELLO,含有自己区块链的高度blockNumber和PeerEndpoint。 如果根节点应答的DISC_HELLO消息中的区块链高度高于第二个节点当前持有的,第二个节点立刻发起syn
18、chronization protocol以同步账本的最新状态 此后第二个节点每5秒钟向所有的已知节点(目前只知道第一个节点)发送DISC_GET_PEERS消息获得加入网络的其它节点 第一个节点收到DISC_GET_PEERS消息后,回复包含了PeerEndpoint 数组的DISC_PEERS消息IP: 9.181.8.8validator_enabled : truediscovery_rootnode: rest_enabled: falseIP: 9.181.8.9validator_enabled : truediscovery_rootnode: 9.181.8.8discove
19、ry_period: 5srest_enabled: false第二个节点验证节点第一个节点验证节点根节点 2016 IBM Corporation32业务网络动态组建示例:第三个节点 第三个节点向根节点发送消息DISC_HELLO,含有自己区块链的高度blockNumber和PeerEndpoint。 如果根节点应答的DISC_HELLO消息中的区块链高度高于第三个节点当前持有的,第三个节点立刻发起synchronization protocol以同步账本的最新状态,虽然不执行交易,但是非验证节点维护一个最新的账本副本 此后第三个节点每60秒钟向所有的已知节点(第一、二个节点)发送DISC_
20、GET_PEERS消息获得加入网络的其它节点(考虑到发送间隔,第二个节点应该先于第三个节点发现对方) 第一、二个节点收到DISC_GET_PEERS消息后,回复包含了PeerEndpoint 数组的DISC_PEERS消息IP: 9.181.8.8validator_enabled : truediscovery_rootnode:rest_enabled: false IP: 9.181.9.9validator_enabled : falsediscovery_rootnode: 9.181.8.8discovery_period: 60srest_enabled: true第二个节点验证
21、节点第一个节点验证节点IP: 9.181.8.9validator_enabled : truediscovery_rootnode: 9.181.8.8discovery_period: 5srest_enabled: false第三个节点非验证节点 2016 IBM Corporation33区块(Block)结构message Block version = 1; google.protobuf.Timestamp timestamp = 2; bytes transactionsHash = 3; bytes stateHash = 4; bytes previousBlockHash
22、 = 5; bytes consensusMetadata = 6; NonHashData nonHashData = 7;message BlockTransactions repeated Transaction transactions = 1;message NonHashData google.protobuf.Timestamp localLedgerCommitTimestamp = 1; repeated TransactionResult transactionResults = 2;message TransactionResult string uuid = 1;/ 交
23、易 ID bytes result = 2;/ 交易执行结果 uint32 errorCode = 3;/ 错误码 string error = 4;/ 错误说明 2016 IBM Corporation34PBFT原理介绍: 核心算法 (也叫做3-phase commit) client把一个request广播到所有的replica, 确保primary收到请求 Primary为这个request分配一个顺序号并广播到其他replica;那些replica检查消息的有效性,同意那个顺序号且确认了message和view;如果replica有了m和有效的pre-pare, 就进行下一步 每个r
24、eplica发送一个PREPARE消息给其他的replica,所有收到2f个prepare的replica进入commit 每个replica广播commit消息,一个replica收到2f个commit消息后,就执行(Execute)序号小于n的所有request replica直接返回结果给client, client等待f+1个相同的结果。 周期性地,replica会做checkpoint来清理log在内存中的prepared/committed message Replica通过超时机制来监控primary的状态,并适时触发view change protocol来选举新的primar
25、y。v: view number; n: sequence number; D(m): Digest of request message m;代码实现: /openchain/consensus/obcpbft/pbft-core.go ; 其中:innerStack=innerCPI 2016 IBM Corporation35账链代码(Chaincode) OBC中的智能合约,是通过账链代码(Chaincode)来实现。 业务逻辑(Logic) = 账链代码(Chaincode) = 智能合约(Smart contract) 它嵌在交易中,所有验证节点在确认交易时都必须执行它。 执行环境
26、是一个定制化的安全的“沙箱”(Docker) 目前支持Go, 将来支持Java, Node.js 2016 IBM Corporation36账链代码相关概念账链代码的分类:公开的账链代码:通过公开的交易来部署的账链代码,这些代码能被网络中任意成员调用。机密的账链代码:通过机密的交易来部署的账链代码,这些代码只能被网络中指定的做验证的成员调用。访问受控的账链代码:通过内置令牌的机密交易来部署的账链代码,这些代码能被网络中持有对应令牌的成员调用(即使这些成员不是校验者)。账链代码的操作类型:部署账链代码:通过交易部署新的账链代码。调用账链代码:通过交易调用已经部署的账链代码,也可以在账链代码中调
27、用其他的账链代码。调用操作可以修改账链代码中的变量信息。查询账链代码:通过交易查询已经部署的账链代码,也可以在账链代码中查询其他账链代码。查询操作不能修改账链代码中的变量信息。账链代码的数据存储 账链代码中需要持久化的状态(State),可以存储在世界状态(World State)中。 2016 IBM Corporation37VM & Chaincodetype VM interface build(ctxt context.Context, id string, args string, env string, attachstdin bool, attachstdout bool, r
28、eader io.Reader) error/ 建立 chaincode image start(ctxt context.Context, id string, args string, env string, attachstdin bool, attachstdout bool) error/ 启动 chaincode stop(ctxt context.Context, id string, timeout uint, dontkill bool, dontremove bool) error/ 停止 chaincodetype Chaincode interface Invoke(s
29、tub *ChaincodeStub, function string, args string) (error)/ 调用 chaincode Query(stub *ChaincodeStub, function string, args string) (byte, error) / 查询 chaincodemessage ChaincodeMessage enum Type UNDEFINED = 0; REGISTER = 1; REGISTERED = 2; INIT = 3; READY = 4; TRANSACTION = 5; COMPLETED = 6; ERROR = 7;
30、 GET_STATE = 8; PUT_STATE = 9; DEL_STATE = 10; INVOKE_CHAINCODE = 11; INVOKE_QUERY = 12; RESPONSE = 13; QUERY = 14; QUERY_COMPLETED = 15; QUERY_ERROR = 16; RANGE_QUERY_STATE = 17; Type type = 1;/ 消息类型 google.protobuf.Timestamp timestamp = 2; bytes payload = 3;/ 消息体 string uuid = 4;/ 消息 ID 首先,Validat
31、ing Peer在执行Deploy交易时,OBC框架会自动创建VM(Docker),为其加载(build)账链代码( Chaincode),根据情况启动(start)或停止(stop)账链代码 接着,Chaincode shim会与Validating Peer建立反向连接,接收ChaincodeMessage指令 2016 IBM Corporation38Chaincode操作 2016 IBM Corporation39State操作message PutStateInfo / 存数据 string key = 1; bytes value = 2;message RangeQueryS
32、tate / 批量取数据 string startKey = 1;/ 开始key(含),字母顺序 string endKey = 2;/ 结束key(含),字母顺序message RangeQueryStateResponse repeated RangeQueryStateKeyValue keysAndValues = 1; bool hasMore = 2;/ 是否还有后续数据 string ID = 3;message RangeQueryStateKeyValue string key = 1;/ key bytes value = 2;/ valuemessage RangeQue
33、ryStateNext / 分批取回 string ID = 1;message RangeQueryStateClose / 结束 string ID = 1; 2016 IBM Corporation40账链代码示例(Go) 账户A和B之间相互转账 主函数(源代码链接:G)/ Run callback representing the invocation of a chaincode/ Run callback representing the invocation of a chaincode/ This chaincode will manage two accounts A and
34、 B and will transfer X units / This chaincode will manage two accounts A and B and will transfer X units from from / A to B upon invokeA to B upon invokefunc (t func (t * *SimpleChaincode) Run(stub SimpleChaincode) Run(stub * *shim.ChaincodeStub, function string, args shim.ChaincodeStub, function st
35、ring, args string) (byte, error) string) (byte, error) / Handle different functions / Handle different functions if function = “init” if function = “init” / / 初始化初始化 return t.init(stub, args) return t.init(stub, args) else if function = “invoke” else if function = “invoke” / / 调用账链代码,从账户调用账链代码,从账户A
36、A转转X X元到账户 return t.invoke(stub, args) return t.invoke(stub, args) else if function = delete else if function = delete / Deletes an entity from its state / Deletes an entity from its state return t.delete(stub, args) return t.delete(stub, args) return nil, errors.New(Received unknown function invoca
37、tion) return nil, errors.New(Received unknown function invocation) 2016 IBM Corporation41账链代码示例(Go) 初始化函数:func (t func (t * *SimpleChaincode) init(stub SimpleChaincode) init(stub * *shim.ChaincodeStub, args string) (byte, shim.ChaincodeStub, args string) (byte, error)error) var A, B string / var A,
38、B string / 账户地址账户地址 var Aval, Bval int / var Aval, Bval int / 账户金额账户金额 var err error var err error . . . . . . / / 初始化初始化 A = args0 A = args0 / 获取账户A地址 Aval, err = strconv.Atoi(args1) Aval, err = strconv.Atoi(args1) / 获取账户A初始余额 if err != nil if err != nil return nil, errors.New(“Expecting integer va
39、lue for asset holding”) return nil, errors.New(“Expecting integer value for asset holding”) B = args2 B = args2 . . . . . . fmt.Printf(“Aval = %d, Bval = %dn”, Aval, Bval) fmt.Printf(“Aval = %d, Bval = %dn”, Aval, Bval) / / 将变量信息写入账本中将变量信息写入账本中 err = stub.PutState(A, byte(strconv.Itoa(Aval) err = st
40、ub.PutState(A, byte(strconv.Itoa(Aval) if err != nil if err != nil return nil, err return nil, err err = stub.PutState(B, byte(strconv.Itoa(Bval) err = stub.PutState(B, byte(strconv.Itoa(Bval) if err != nil if err != nil return nil, err return nil, err return nil, nil return nil, nil 2016 IBM Corpor
41、ation42账链代码示例(Go) 转账函数:/ / 该交易从账户该交易从账户A A中转账中转账X X元到账户元到账户B Bfunc (t func (t * *SimpleChaincode) invoke(stub SimpleChaincode) invoke(stub * *shim.ChaincodeStub, args string) (byte, shim.ChaincodeStub, args string) (byte, error) error) var A, B string / var A, B string / 账户地址账户地址 var Aval, Bval int
42、/ var Aval, Bval int / 账户余额账户余额 var X int / var X int / 转账金额转账金额 var err error var err error . . . . . . A = args0 A = args0 B = args1 B = args1 / / 从账本中获取状态从账本中获取状态/ /变量信息变量信息 Avalbytes, err := stub.GetState(A) / Avalbytes, err := stub.GetState(A) / 账户账户A A的当前余额的当前余额 if err != nil if err != nil ret
43、urn nil, errors.New(“Failed to get state”) return nil, errors.New(“Failed to get state”) if Avalbytes = nil if Avalbytes = nil return nil, errors.New(“Entity not found”) return nil, errors.New(“Entity not found”) Aval, _ = strconv.Atoi(string(Avalbytes) Aval, _ = strconv.Atoi(string(Avalbytes) / 讲账户
44、A的当前余额转换为数值 Bvalbytes, err := stub.GetState(B) Bvalbytes, err := stub.GetState(B) . . . . . . Bval, _ = strconv.Atoi(string(Bvalbytes) Bval, _ = strconv.Atoi(string(Bvalbytes)待续待续 2016 IBM Corporation43账链代码示例(Go) 转账函数(续)/ / 该交易从账户该交易从账户A A中转账中转账X X元到账户元到账户B B / / 执行转账操作执行转账操作 X, err = strconv.Atoi(a
45、rgs2) X, err = strconv.Atoi(args2) Aval = Aval - X Aval = Aval - X Bval = Bval + X Bval = Bval + X fmt.Printf(“Aval = %d, Bval = %dn”, Aval, Bval) fmt.Printf(“Aval = %d, Bval = %dn”, Aval, Bval) / / 将执行后的结果写入账本中 err = stub.PutState(A, byte(strconv.Itoa(Aval) err = stub.PutState(A, byte(strconv.Itoa(Aval) if err != nil if err != nil return nil, err return nil, err err = stub.PutState(B, byte(strconv.Itoa(Bval) err = stub.PutState(B, byte(strconv.Itoa(Bval) if err != nil if err != nil return nil, err return nil, err return nil, nil return nil, nil