未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

Connor 币安下载 2022-09-05 214 0

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

历史背景

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

什么是智能合约

智能合约是一种特殊协议,旨在提供、验证及执行合约块链智能合约

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

展开全文

智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易块链智能合约

智能合约包含了有关交易的所有信息,只有在满足要求后才会执行结果操作块链智能合约

智能合约和传统纸质合约的区别在于智能合约是由计算机生成的块链智能合约。因此,代码本身解释了参与方的相关义务。

三个原则

智能合约与区块链的结合形成了智能合约法规自动执行系统块链智能合约,该系统有三个重要的原则:

区块链架构演变

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

区块链架构演变

以太坊的智能合约

两个概念

“虚拟机”是计算机领域里面的一个术语,可以理解为一个虚拟环境,在这个虚拟环境中可以随意进行操作,而不影响计算机性能块链智能合约

以太坊本质上就是一个虚拟机,只不过它是一个点对点的、去中心化的虚拟机(英文缩写EVM)块链智能合约。像所有区块链技术那样,全世界的节点都会在自己的电脑上运行软件,这个包含全世界节点的“世界级计算机”就被称为以太坊虚拟机(EVM)。以太坊虚拟机,我们可以理解为一个系统, 这个系统是用来为以太坊智能合约创建运行环境的。

2. “以太坊账户”—— “正常账号”+“智能账户”块链智能合约,以太坊设置了这两种账户:

“正常账户”(也就是EOA账户)里面只有当前的以太坊钱数块链智能合约,由我们手中的私钥控制,可以发起转账交易;

“智能账户”,不仅有以太坊钱数,还有程序代码,代码的执行是由交易触发的,每当收到相应的消息,这些代码就会被执行,这个智能账户就是智能合约的载体块链智能合约

两个账户的关系

正常账户可不依靠智能合约

首先是以太坊的“正常账户”块链智能合约。从以太坊“正常账户”转 移以太坊的时候,转账方式和比特币差不多:我把3个以太坊从我的账户转移到依依的账户,这个转账使用的是正常账户,需要输入依依的钱包地址、转账的数额,和比特币转账很像,就不多说了

智能账户通过合约来约束执行

然后是以太坊的“智能账户”块链智能合约。从以太坊“智能账户”转移以太坊的时候,就涉及到了虚拟机和智能合约。例如, 我决定在发工资那天给依依转3个以太坊,这就相当于我 们达成了一个约定,那么当我发工资那天,虚拟机就会运行特定的代码,3个以太坊会自动从我的智能账户中转出3 个以太坊给依依。

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

智能合约

Fabric联盟链架构图

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

Fabric 智能合约

Fabric的智能合约称为链码(chaincode),分为系 统链码和用户链码块链智能合约。系统链码用来实现系统层面的功能,用户链码实现用户的应用功能。

链码被编译成一个独立的应用程序,运行于隔离的Docker容器中块链智能合约

Fabric链码和底层账本是分开的,升级链码时并不需要迁移账本数据到新链码当中,真正实现了逻辑与数据的分离, 同时,链码采用Go、Java、Nodejs语言编写块链智能合约

链码运作流程

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

链码运作流程

链码交互流程

Fabric链码通过gprc与peer节点交互流程

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

链码交互流程

链码开发基础

链码开发的基础,一句话总结起来就是:一个基类,两个查询,一个写入块链智能合约

▲一个基类:ChaincodeBase

Java中ChaincodeBase是自定义链码的合约基类,里面的run(ChaincodeStub stub, String function, String[] args)方法是peer调用链码的入口函数,其中必须自定义一个init方法,用于合约初始化及升级初始化动作块链智能合约

GO由于其动态接口的特性,不需要特别声明实现合约接口块链智能合约。但是必须实现两个接口方法:

▪ Init(stub shim.ChaincodeStubInterface) :init用于合约初始化及升级初始化动作;

▪ Invoke(stub shim.ChaincodeStubInterface):Invoke 是 peer 调 用 链 码 的 入 口 函 数 ;

ChaincodeStub里面包含丰富的账本操作,常用的有getCallerCertificate(), getState(k), putState(k,v), invokeChaincode(…), rangeQueryState(k1,k2), getTxId()等块链智能合约

▲两个查询:getState(k) 与 rangeQueryState(k1,k2)

getState(k) 获取单独的key对应的value值块链智能合约

rangeQueryState(k1,k2) 获取k1开始,k2结束的所有k-v对象, 返回的是个Map<String,String>对象, 其中k1,k2按字典序排序块链智能合约

▲一个写入:putState(k,v),

写入数据,此处要注意下,putState数据并不会马上落到账本上, 要等到第二段交易提交共识达成后,数据才会落地块链智能合约

链码开发经验

1.以Json方式存储业务实体并在key上建立索引

因为只有一个key-val状态数据库,value为Json的数据可以快速解析,key上加一些字段简单索引字段的值, 如Pk_TxId交易id_某字段值, 来实现范围查询块链智能合约

fabric的k-v库用的leveldb,插入的key值用的字典序,所以索引字段值必须固定长度,否则调用stub. rangeQueryState(k1,k2)进行范围查询, 会取出一堆不正确数据块链智能合约

如: stub. rangeQueryState(‘id12’, ’id1234’), 会取到id121111111的数据块链智能合约

2.写入的数据不能立即获取到

通过putState写入的数据并不会立即落到账本上, 要等到第二段交易所有peer节点共识达成后,数据才会落地块链智能合约。因此不可以立即获取之前写入的值,比如批量插入数据,利用putState写入数据,再通过getState函数来判断主键是否重复。

3.链码里面的方法需要加锁吗

不需要块链智能合约。peer节点已经实现了消息队列,发给链码的链码消息都是顺序执行的,不是并行执行的。

链码事件

在Hyperledger Fabric中块链智能合约,有三种类型的事件监听器:

1. 块监听器(block Listener):

当需要监视添加到Fabric 分类账的新块时,我们使用它块链智能合约。当新块被提交给节点上的Fabric 分类账时,将通知Fabric客户端之后,应用程序可以采取某些行动。

2. 交易监听器(tx Listener):

当需要监视组织节点上的交易完成时,我们使用它块链智能合约。当新块被提交给节点上的Fabric 分类账时, 将通知客户端,然后客户端将检查块以查找已注册的交易标识符。如果找到交易,则将通过交易ID,交易状态和块编号通知回调函数。

3. 链码监听器(chaincode Listener):

我们在需要监控将从我们的链代码中发布的事件时使用它块链智能合约。当新块提交到Fabric 分类账时,将通知客户端,然后客户端将检查链代码事件名称字段中的已注册链代码模式。

智能合约的不足

安全问题——目前全网中有89%的智能合约代码都或多或少存在安全漏洞/隐患,这是一个非常惊人的调查结果,对社区而言也是一个巨大的风险因素块链智能合约

智能合约审计

随着智能合约的增多乃至未来可能的大规模发展,对各种合约代码的审计也将会变成一个专门的、专业的领域块链智能合约。智能合约审计报告中将包含以下内容:

智能合约的标准化,模块化

智能合约的未来

未来智能合约的发展确实应该有如下几方面:

安全性:技术迭代,智能合约产品不断完善,可将成熟、历经验证的合约产品封装成模块运行块链智能合约

【文章版权归原作者所有,转载时请注明出处@柚子工道块链智能合约。文中部分配图来自网络,如有侵权,请及时联系删除】

未来柚科技|柚子工道技术咖分享:区块链-智能合约开发基础及完整生命周期

评论