区块链研习社

聊聊Fabric下的智能合约

2017-05-30  本文已影响5926人  菜菜子_forest

根据我们《区块链研习社》的课程安排,5月26日社长higer给我们讲解了Fabric下的智能合约创建与使用的课程,在课程中社长以实例的方式让我们直观地感受了下Fabric中的智能合约。课后也给我们布置了作业,让我们自己动手创建一个智能合约,并进行一些操作,作业内容如下:

1、https://crl.ptopenlab.com:8800/bc/#home

2、注册账户,注册一条链

3、部署一个合约,合约场景为数字资产交易,比如股权,货币等,可采用页面示例合约example02

4、执行合约,并实现如下场景:

1) higer资产10000,(你的用户名,比如xiaoming)资产为500

2)将higer资产转移5000给xiaoming

3)查询higer和xiaoming各自剩余资产,确定本次资产转让是否成功

通过本次练习可掌握:

区块链的基本原理,智能合约的基本原理,数字资产交易的实际逻辑,现实世界到数字虚拟世界的抽象能力。

昨晚我趁着娃睡觉的时间完成了本次作业,当时戴着耳机又重新听了一遍课程,跟着课程按顺序操作了一遍,但第一次却没有成功,而后通过查看智能合约源码发现自己的参数设置有问题,于是又重新操作了一遍,最后终于得到了想要的结果。现将我的操作步骤分享出来:

第一步:账户注册

在Fabric中开始创建智能合约之前,首先需要完成用户信息的注册,该功能点击https://crl.ptopenlab.com:8800/bc/#home右上角“Log in”完成(如图),其注册过程很简单,填入邮箱、密码以及密码确认即可。注册完并成功登录之后,右上角将会显示用户名,表示登录成功。随后页面中的点击“MY DASHBOARD”按钮即可进入智能合约管理界面。

第二步:创建智能合约Chain

智能合约Chain的创建可通过点击上图页面中的“Chain”菜单或页面中的Chain图标均可进入Chain创建页面,其页面如图所示。

在页面中点击“Apply a New Chain”,系统会弹出Chain创建页面:

在该页面中我们主要需要填写如下信息:

Name:Chain的名称

Consensus Plugin:共识插件,也称共识算法

Size:节点数

Description:Chain的描述信息

这里需要重点说明的是共识插件,Fabric提供了2种共识插件:noops和pbft。

noops用于开发和测试,它没有共识机制,但是会处理所有consensus message,所以如果要开发自己的consensus plugin,从它开始吧!

pbft即为Practical Byzantine Fault Tolerance的缩写,意为实用拜占庭容错算法。该算法是Miguel Castro (卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来的,解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。该论文发表在1999年的操作系统设计与实现国际会议上(OSDI99)。没错,这个Loskov就是提出著名的里氏替换原则(LSP)的人,2008年图灵奖得主。该算法目前为大部分区块链的核心关键算法。

本文将选择区块链中常用的pbft算法作为共识插件。

信息填写完成后,点击“Apply”按钮即可实现Chain的创建,创建结果如图所示:

第三步:智能合约实例部署

在成功创建Chain之后,我们可以正式开始智能合约实例的开发了。点击“MY DASHBOARD”页面上方的“Smart Contract”菜单,进入智能合约实例部署页面。

在该页面中提供了两个智能合约实例,分别是map与chaincode_example02。其中,map实现的是键-值对查询功能,即输入“Hello”,返回“World”这么一个操作。chaincode_example02实现的是用户之间积分点数转账的功能。因此,根据本次作业的转账要求,此处选择chaincode_example02实例的部署。

在chaincode_example02的右侧有一个红色按钮,点击该按钮弹出“Deploy”菜单,点击该菜单弹出部署页面。

该过程中主要填写内容为:

实例名:Instance Name

函数:Function

函数参数:Arguments

实例名可以根据实际用途进行命名,函数则默认为init函数,当选择完init函数后,Arguments参数为可编辑状态,其默认值为{“a”,”100”,”b”,”100”},一开始我没有太在意这个参数信息,所以直接默认没有修改,但就因为没有对其进行更改导致我后面的转账任务没有完成。后经过仔细检查,在智能合约实例的描述信息中有源码地址,其地址为:

https://github.com/hyperledger/fabric/blob/v0.6/examples/chaincode/go/chaincode_example02/chaincode_example02.go

通过仔细研读该源码,在init函数在程序的37-71行代码中

我发现该智能合约实例的源码发现init中要传入4个参数:用户1名称、用户1的点数、用户2名称、用户2的点数,而默认的值为:

用户1名称:a

用户1的点数:100

用户2名称:b

用户2的点数:100

这和作业中说的higer和xiaoming,还有50000与500点数的要求不符,所以,后来我重新进行了部署,将init参数修改为

{“higer”,”50000”,”forest”,”500”}

设置完成后点击“Depoly”即可实现智能合约实例的部署,系统将自动跳转至智能合约部署页面。在该页面中包含五大模块:

OverView:区块链节点连接状态预览图

Log:智能合约运行日志

Blocks:区块信息

APIs:各类API服务地址

Smart Contract Instances:智能合约实例

在Smart Contract Instances处我们可以看到刚才部署的实例:

点击实例名称右侧的红色按钮,弹出包含“Invoke”与“Query”的菜单,Invoke与Query是Fabric智能合约的两个关键操作。其中,Invoke为功能实现操作,Query为信息与执行结果查询操作。因此,要实现转账功能,首先是执行Invoke操作,然后再通过Query操作来查询执行结果是否正确。

第四步:转账操作

点击Invoke按钮,弹出Invoke操作界面

点击Function的编辑框,弹出“transfer”与“delete”两个选项,此处,我们选择“transfer”,Arguments选项变为["a","b","50"],看到这个参数,我的理解为a向b转账,转账额度为50。因此我将其修改为["higer","forest","5000"],点击“Invoke”,经过短暂的计算后,界面的上方弹出操作成功的提示。

为了验证操作是否成功,执行“Query”操作,弹出Query界面。

在Function中选择“query”,Arguments选项变为["a"],我的理解是此处的a需替换为higer或forest,在我将其替换为higer后,点击“Query”,经过短暂计算,页面上方弹出higer的点数:45000。在初始化时,我给higer设置了50000的点数,在transfer中从higer中转了5000给forest,所以,其点数为45000,查询结果验证了转账的成功。

通过查询forest的点数,发现其为5500,通过双方的点数均证明该转账时成功、有效的。

以上即为我第一次智能合约编写过程,通过这次智能合约的编写让我从智能合约的理论理解转换到了实际操作理解,自己在区块链行业又更进了一步。还有一点体会是,智能合约确实是图灵完备的,合约代码与我们平时的内容差别不大,所以有编程经验的学习智能合约的编写不会太难。最后一点就是,后续要把GO语言学好,这样才能在Fabric中编写自己的智能合约代码!


以下是广告:

我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。

目前入圈价格初始定价50元,50人调整一次价格,每次调整幅度为50元!

上一篇下一篇

猜你喜欢

热点阅读