学习以太坊部署智能合约(一) — 区块链基础和智能合约知识!

声明一下,如果你是刚接触区块链,希望好好读一下比特币白皮书,因为正是由于比特币火热,才让我们了解区块链的概念。

区块链

首选,我介绍一下区块链的基础架构,如下图所示:在这里插入图片描述
这是区块链2.0结构 ,源于比特币的区块链技术构建了一个分布式的“全球账本”,创造了区块链1.0 时代;以智能合约为标志的区块链2.0 实现了应用程序在区块链上的上传/下载和有效执行,将整个区块链系统演进成一台“全球计算机”;区块链3.0 的提出,使运行在企业操作系统(enterprise operation system,EOS)上的智能合约开发变得更加便捷。

区块链的数据结构

以比特币为例:每个区块的由区块头(Header)和区块体(Body)两部分组成,其结构如图所示:在这里插入图片描述
Version:比特币软件当前版本号;Pre-block Hash:区块链上前一个区块的的哈希值;Merkle - root:由当前区块中所有交易通过两两SHA256计算,最后得到的哈希值;Timestamp:当前区块生成的时间;Bits:为生成当前区块而设置的目标难度值;Nonce:工作量证明算法中用于动态改变哈希输入值的整数。
由于我们对挖矿原理的了解,挖矿的过程中容易出现分叉,存在着“双花”攻击。比特币的出块速度大概10min左右,以太坊出块时间为15s左右,因此出块时间短,造成的分叉率过高。但是,以太坊引入了CHOST协议(大家可自行学习一下)来处理分叉。

共识机制

共识机制是分布式系统中实现去中心化信任的核心。这里主要了解具有代表性的共识机制和算法:PoW共识机制:依赖节点算力的工作量证明;PoS共识机制:节点所占有股权成反比的权益证明;DPoS共识机制:按既定时间段轮流产生区块的授权股份证明机制;PBFT共识机制:基于拜占庭容错机制。我们了解到的大部分比特币攻击都是从共识机制进行攻击。

智能合约

智能合约的初衷是在没有信任第三方可信权威参与和控制的情况下,借助计算机程序,编写能够自动执行合约条款的程序代码,并将代码嵌入到具有价值的信息化物理实体,将其作为合约各方共同信任的执行者代为履行合约规定的条款,并按合约约定创建相应的智能资产。根据所使用的编程语言和运行环境的不同,将比特币中的智能合约称为脚本型智能合约,将主要运行在以太坊和超级账本中的智能合约称为图灵完备型智能合约,而将正在研发中的kadena 项目中的智能合约称为可验证合约型智能合约。

  1. 脚本型智能合约 :由于比特币中的脚本仅包含指令和数据两部分,其中涉及到的脚本指令(也称为“操作码”,Opcode)只需要完成有限的交易逻
    辑,如编写比特币中UTXO 的锁定脚本和解锁脚本,不需要复杂的循环、条件判断和跳转操作,因此比特币中的脚本型智能合约是一种基于堆栈的功能有限且编写相对容易的简单执行程序,支持的指令不到200 条;
  2. 图灵完备型智能合约 :脚本语言被设计成为仅在有限范围内执行有限功能的简单执行语言,是非图灵完备的语言。使用脚本语言编写的交易指令虽然能够满足比特币应用,但无法适应以太坊平台的开发需求。目前,以太坊主要使用Solidity和Serpent两种智能合约开发语言。其中,Solidity 是一种语法上类似于JavaScript 的专门针对运行在以太坊虚拟机(environment virtual machine,EVM)上的智能合约开发而设计的高级编程语言,也是以太坊平台主推的智能合约开发语言;Serpent 语言的设计类似于Python,具有高效易用的编程风格,是专门针对智能合约的特征而开发的高级语言。在Hyperledger Fabric 中采用GO、Java 等通用语言编写运行在Docker 容器中的智能合约,GO和Java 都是通用性较强的图灵完备语言,能够实现基于联盟链智能合约开发中所需要的应用逻辑;
  3. 可验证合约型智能合约 :可验证语言Pact 的语法类似于LISP 语言,用于编写运行在区块链Kadena 上的智能合约,可实现合约的数据存储和授
    权验证等功能。Pact 语言采用非图灵完备设计,不支持循环和递归,以防止在复杂合约的编程过程中可能存在的安全漏洞以及因此而带来的风险。用Pact语言编写的智能合约代码直接嵌入在区块链上运行,不需要事先编译成为运行在特定环境(如以太坊EVM)的机器代码。

智能合约运行机制

Docker容器原理
参考其他博主: 点我.
智能合约主要包括以下几个阶段:

  1. 智能合约代码的生成 :在合约各方就传统意义上的合同内容达成一致的基础上,通过评估确定该合同是可以通过智能合约实现的(是可编程
    的),然后由程序员利用合适的开发语言将以自然语言描述的合同内容编码成为可执行的机器语言。
  2. 编译 :利用开发语言编写的智能合约代码一般不能直接在区块链上运行,而需要在特定的沙箱环境(以太坊为EVM,超级账本为Docker 容器)中
    执行,因此在将合约文件上传到区块链之前需要利用编译器对原代码进行编译,生成符合沙箱环境运行要求的字节码。
  3. 提交 :智能合约的提交和调用是通过“交易”(transaction,Txn)来完成。当用户以交易形式发起提交合约文件后,通过P2P 网络进行全网广播,各节点在进行验证后存储在区块中。
  4. 确认 :被验证后的有效交易被打包进新区块,经过共识机制,新区块添加到区块链的主链。根据交易生成智能合约的账户地址,之后可以利用该
    账户地址通过发起交易来调用合约,节点对经验证有效的交易进行处理,被调用的合约在沙箱中执行。

结构图如下:
在这里插入图片描述

Hyperledger Fabric中智能合约实现技术

Docker 容器是一个使用广泛的、开源的沙箱环境,Hyperledger Fabric 中的智能合约chaincode(链码)就运行在轻量级的Docker 容器中,并通过gRPC协议与相应的Peer 节点(即存储账本、chaincode 等关键数据,并执行背书及chaincode 代码等特定程序的物理节点)进行交互。基于Docker 容器具有的安全隔离功能,避免了区块链宿主程序遭受容器中恶意合约的攻击,同时防止运行在不同容器中的合约之间的相互干扰。chaincode 的运行过程主要包括:

  1. 打包(package) :将chaincode 安装在Peer 节点,包括创建包和对包签名。具体是指将用开发语言(多使用GO 语言)编写的源代码按照chaincode 部署规范(chaincode deployment spec,CDS)重新定义,并通过签名来检查和确认chaincode 的所有者。如果要让chaincode 拥有多个所有者,首先需要创建一个被签名的chaincode 包(SignedCDS 包),然后让这个包依次被每个所有者进行签名。
  2. 安装(install) :将CDS 规定格式的chaincode安装在一个将要运行该合约的Peer节点上。chaincode只被安装在合约所有者的背书节点上,安装的实质是代码的编译过程。
  3. 实例化(instantiate) :调用生命周期系统chaincode(lifecycle system chaincode,LSCC),在channel(即基于交易规则将区块链网络划分后形成的逻辑单元)上启动一个Docker 容器,实现合约与channel的绑定。实例化过程,会生成对应channel 的Docker镜像和Docker 容器,可以指定背书策略。在成功进行了实例化后,处于激活状态的chaincode 将监听并接收交易请求。。
  4. 更新(upgrade) :更新是一个类似于实例化的交易,即将新版本的chaincode 与channel 绑定。更新后其他与旧版本绑定的channel 仍旧运行旧版本的chaincode。
  5. 删除(delete) :删除chaincode 对应的Docker容器以及每个安装合约的背书节点上的SignedCDS包。在正在开发的版本中,将用stop 和start 交易的指令来停止或重启chaincode,而不需要直接将其删除。

喜欢的请多多关注,多多收藏!共勉!

[1]: Nakamoto S. Bitcoin: a peer-to-peer electronic cash system[EB/OL]. (2018-06-10)[2020-03-10]. https://bitcoin.org/bitcoin.pdf.
[2]:王群, 李馥娟, 王振力, 等. 区块链原理及关键技术[J]. 计算机科学与探索, 2020, 14(10): 1621-1643.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值