超级账本发现之旅(三):深度分析第一个区块链应用

简介:

上一篇文章中, 通过执行node query.js, 查询Fabric 网络, 并返回了10辆车的信息:

#node query.js


命令行的输出如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

这是10辆车。 Adriana拥有的黑色特斯拉模型S,由Brad拥有的红色福特野马,由名叫Pari的人拥有的紫罗兰菲亚特Punto等等。 分类帐是基于键/值的,在这个实现中,关键值是从CAR0到CAR9。 这一点将变得特别重要。


查询账本的实现


现在让我们来看看底层的实现。 使用编辑器(例如atom或visual studio)并打开query.js程序。

应用程序的初始部分定义了某些变量,如链码,通道名称和网络端点:


640?wx_fmt=png&wxfrom=5&wx_lazy=1


下面的代码用来构造对于汽车的查询, 注意前面的注释, 这个注释中指明, 如果调用queryCar, 则参数args就要传入汽车的key, 也就是CAR0等;在这个例子中指明是用queryAllCars, 则返回所有的car对象

0?wx_fmt=png

在上面的request对象中, 通过chaincodeId来指定需要调用的chaincode,如上面所示, chaincode是fabcar.

那么这个名为fabcar的chaincode, 具体是什么样子的呢?来看一下代码。首先这个chaincode是放在下面的这个目录下的:

0?wx_fmt=png


打开这个chaincode 源文件,是用Go 语言编写的, 最上面定义了SmartContract 以及Car 两个类, 其中Car 是主要的Model 对象, 有Make,Model等几个属性。

0?wx_fmt=png

下面的两个方法则是和Fabric 网络有关, 主要是通过shim对象进行交互。

    第一个方法是Init,从注释中看, init 方法会在chaincode 被实例化时被执行。注释还提及一个最佳实践, 就是建议不要存放任何业务逻辑, 而是把初始化数据等业务逻辑放在一个单独的方法中进行调用,这里是initLedger方法。


    第二个方法是Invoke, 也就是应用程序对于区块链网络的访问, 这里使用Invoke进行访问。在方法内部, 首先通过GetFunctionAndParameters方法来获取要调用的函数方法和参数。这里可以看出, Go 语言和Javascript 语言一样, 变量可以不定义直接使用, Go 语言编译器会根据上下文推导变量的类型;而且还可以返回多个变量。

0?wx_fmt=png

    这里面需要注意的第一点就是, 对于不了解Go语言的同学来说,函数名Init 前面的部分 (s *SmartContract) 是难以理解的, 实际上可以把这个看做Go语言的类方法,记得最前面的SmartContract吗? 前面的SmartContract 代码块中, SmartContract是空的:


// Define the Smart Contract structure

type SmartContract struct {

}


   这个实际上就是Go语言的特色之一, 类方法的动态添加;在这里给SmartContract添加了Init和Invoke 两个方法, 当Invoke 方法被调用时, 则根据传入的参数, 执行queryCar还有queryAllCars等方法。

    下面几个业务方法有  initLedger,queryCar,queryAllCars,createCar和changeCarOwner。 我们来仔细看一下queryAllCars函数,看看它如何与Fabric进行交互。

0?wx_fmt=png

该函数使用Shim接口的函数GetStateByRange在startKey和endKey的args之间返回账本数据。 这些键分别定义为CAR0和CAR999。 因此,我们理论上可以创建1,000辆汽车(假设钥匙被正确标记),并且一个queryAllCars会显示每一个。这个方法的下半部分是转换成json格式返回。

    下面是应用程序调用不同chaincode方法和区块链网络进行交易的示意图:

0?wx_fmt=png


之前我们看到了queryAllCars方法的调用示例, 下面来尝试一下其他的方法。


查询特定车辆


    返回到query.js程序并编辑构造函数请求来查询特定的车。 我们将通过将函数从queryAllCars更改为queryCar并将特定的“Key”更改为args参数。 我们在这里使用CAR4。 所以我们编辑的query.js程序现在应该包含以下内容:

0?wx_fmt=png

然后来执行一下:

#node query.js


结果如下:


0?wx_fmt=png

可以看到最下面的输出:

0?wx_fmt=png

所以我们从查询所有车到只查询一个,Adriana的黑色特斯拉模型S.使用queryCar函数,我们可以查询任何关键字(例如CAR0),并获得与该车相对应的任何代码,模型,颜色和所有者

    现在,您应该对链码中的基本查询功能以及查询程序中的少数参数感到舒适。 更新分类帐的时间到了。。。


更新账本


    

    现在我们已经完成了几个账本查询并添加了一些代码,我们已经准备好更新分类帐。 让我们为新手开一辆新车。

    账本更新的工作,从应用产生一个交易提案(transaction proposal)开始。就像查询一样, 需要构造一个请求对象(request)来确定channel ID, 方法和特定的只能合约, 来指定一个事务(transaction)。 这个应用下一步会调用

channel.SendTransactionProposal    

这个API 来发送交易提案到对等节点来执行背书(endorsement)。


    区块链网络(如背书节点, endorsing peer) 返回一个提案响应(proposal response), 应用会利用这个对象来构建和签名交易请求(transaction request), 这个交易请求会通过调用channel.sendTransction API, 发送到ordering service 节点。  Ordering Service 会把这个事务打包到一个区块中, 并把这个区块发送到channel 中的所有节点来执行验证(在这个例子中只有一个背书节点)。

   最后, 应用会调用eh.setPeerAddr API来连接peer 节点的事件监听端口, 然后通过调用eh.registerTxEvent 来注册和特定事务ID 相关联的事件。 这个API 允许应用来获知一个特定事务的最终状态(例如成功提交或者失败)。把这个过程想象成一个通知机制会更有利于理解。

    这里并不打算更多的解释事务的生命周期, 后续会有更多介绍。

    在这次的最初的invoke 调用中, 我们仅仅是创建一个新的asset:汽车。 在fabcar 目录中,有一个单独的Javascript 文件 ——invoke.js  我们会使用这个文件来执行事务。

    打开文本编辑器, 查看如下代码:

0?wx_fmt=png

    

    你会看到我们可以调用两个函数之一 -  createCar或changeCarOwner。 让我们创造一个红色的雪佛兰伏特,并把它交给一个名叫尼克的业主。 我们在分类帐上使用CAR9,所以我们将使用CAR10作为识别键。 更新的代码块应如下所示:

    

0?wx_fmt=png

保存并执行代码:

#node invoke.js


结果会有很多的输出:

0?wx_fmt=png

然后,我们把注意力在这一行:

0?wx_fmt=png

Peer 节点发出事件通知, 我们的应用由于通过eh.registerTxEvent API , 会接收到通知。

    现在, 我们返回query.js, 把代码修改为查询key为'CAR11'的汽车信息:

    

0?wx_fmt=png

然后执行

#node query.js


查看结果, 发现我们的奔驰C200已经显示出来了:

0?wx_fmt=png


车辆过户


还有一个changeCarOwner的智能合约没有用到, 现在, 你可以自己实现这个功能了吗?


0?wx_fmt=jpeg



原文发布时间为:2017年08月26日
本文作者:查理曼大帝
本文来源:CSDN,如需转载请联系原作者。

目录
相关文章
|
21天前
|
供应链 安全 分布式数据库
探索区块链技术在供应链管理中的应用
【10月更文挑战第21天】 本文深入探讨了区块链技术如何在供应链管理中发挥关键作用,通过具体案例分析,揭示了区块链提高透明度、降低成本和增强安全性的潜力。文章首先概述了区块链技术的基本原理及其对传统供应链模式的挑战,接着详细讨论了区块链如何在不同供应链环节中实施,并分析了其带来的变革。最后,文章提出了企业在采纳区块链技术时可能面临的挑战和应对策略,为供应链管理者提供了宝贵的参考。
|
2月前
|
传感器 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
在当今科技飞速发展的时代,新兴技术的涌现正在改变我们的生活和工作方式。本文将深入探讨区块链技术、物联网以及虚拟现实等新兴技术的发展趋势和应用场景。我们将从这些技术的本质出发,分析它们的发展现状,并展望未来可能带来的变革。同时,我们也将通过一些简单的代码示例,展示这些技术如何在实际中发挥作用。让我们一起探索这个充满无限可能的科技世界吧!
|
2月前
|
存储 供应链 分布式数据库
深入理解区块链技术:原理、应用与挑战
本文旨在探讨区块链技术的基本原理、主要应用及其面临的挑战。通过分析区块链的分布式账本技术、加密算法和共识机制,我们揭示了其如何在无需中心化权威的情况下确保数据的不可篡改性和透明性。此外,文章还讨论了区块链在金融、供应链管理、智能合约等领域的应用案例,并指出了当前区块链技术面临的可扩展性、隐私保护和法律监管等挑战。通过对这些内容的深入分析,我们希望为读者提供一个全面而深入的区块链技术概览。
166 16
|
1月前
|
存储 安全 物联网
未来已来:区块链技术在物联网与虚拟现实中的应用
随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,为我们带来更便捷、安全和沉浸式的体验。
|
1月前
|
存储 供应链 算法
深入探索区块链技术:原理、应用与未来展望
本文将带你深入了解区块链技术的基本原理,探讨其在金融、供应链、医疗等多个领域的应用案例,并展望其未来的发展趋势。通过本文,你将对区块链技术有一个全面的认识,理解其背后的技术逻辑和应用场景。
|
2月前
|
供应链 安全 区块链
探索区块链技术在数据安全中的应用
本文深入探讨了区块链技术如何革新数据安全领域,特别是在保护个人隐私、增强数据完整性和透明度方面的作用。通过分析区块链的去中心化特性、加密技术以及智能合约的功能,文章阐述了这一技术如何有效防止数据篡改、确保交易记录的不可逆性,并促进跨组织间的信任建立。此外,还讨论了当前区块链技术面临的挑战及未来发展趋势,为理解其在数据安全领域的潜力提供了全面视角。
|
1月前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
本文将探讨新兴技术的发展趋势和应用场景,包括区块链技术、物联网和虚拟现实等。我们将深入了解这些技术的发展现状,以及它们在未来可能带来的变革。同时,我们还将提供一些代码示例,以帮助读者更好地理解这些技术的应用。
|
1月前
|
存储 供应链 监控
深入探索区块链技术在供应链管理中的应用####
本文旨在探讨区块链技术如何革新供应链管理,通过分析其核心特性与实际案例,揭示该技术如何增强透明度、提升效率并降低成本。我们将从区块链的基本原理入手,逐步剖析其在供应链各环节中的具体应用,最终展望其未来发展趋势。 ####
78 3
|
2月前
|
供应链 安全 数据挖掘
深度剖析区块链技术在金融科技领域的创新应用与挑战####
本文旨在探讨区块链技术于金融科技(FinTech)领域的革新性应用,分析其如何重塑传统金融服务模式,并深入剖析面临的技术与监管挑战。通过案例研究与数据分析,揭示区块链在提升金融效率、增强安全性及促进金融包容性方面的潜力,同时强调构建健全的法律法规框架与技术创新之间的平衡对于推动行业健康发展的重要性。本文不涉及具体代码实现或技术细节,而是聚焦于区块链应用的战略意义与实践挑战。 ####
|
2月前
|
安全 物联网 物联网安全
揭秘区块链技术在物联网(IoT)安全中的革新应用
揭秘区块链技术在物联网(IoT)安全中的革新应用