摘要:2008年,区块链技术走上了舞台。其因去中心化,透明可信等特点受到了科技界的关注,成为了近几年热议的话题。2014年,以太坊平台的出现将区块链技术推到了新的高度。区块链技术采用了分布式账簿,点对点传输,数字加密等技术,杜绝了传统交易模式中的数据造假等行为,从而构建了可信的交易环境和为可信社会奠定了基础。随着智能合约的出现,代码可以按照既定的逻辑自动触发执行无需人为干预。而现今的区块链应用已经从金融延伸到了物联网,智能制造等众多领域。因此,区块链技术将为新一代的网络信息技术带来发展,挑战和机遇。
区块链技术将给我们的生活带来巨大的改变,所以本文的重点就是对区块链技术进行研究,并对区块链技术进行应用。首先对国内外区块链技术的发展现状进行学习,对区块链的分布式账簿,共识机制等核心技术进行研究。最后基于本文中所讲到的以太坊平台,搭建一个去中心化的投票应用,该应用中相关的操作通过智能合约来自动执行。
关键词:区块链;以太坊;智能合约;分布式账簿技术
Abstract : In 2008, blockchain technology took the stage. Due to the decentralization, transparency and credibility, it has attracted the attention of the scientific and technological community and has become a hot topic in recent years. In 2014, the emergence of the Ethereum platform pushed the blockchain technology to a new level. Blockchain technology uses distributed ledger technology(DLT), peer-to-peer transmission, digital encryption and other technologies. Eliminate data fraud and other behaviors in the traditional trading model, thus building a credible trading environment and laying the foundation for a credible society. With the advent of smart contracts, code can automatically trigger execution in accordance with established logic without human intervention. Today's blockchain applications have extended from finance to the Internet of Things, smart manufacturing and many other areas. Therefore, blockchain technology will bring development, challenges and opportunities for a new generation of network information technology.
Blockchain technology will bring great changes to our lives, so the focus of this paper is on the research of blockchain technology and the application of blockchain technology. Firstly, it studies the development status of blockchain technology at home and abroad, and studies the core technologies such as distributed accounting books and consensus mechanisms of blockchain. Finally, based on the Ethereum platform mentioned in this article, build a decentralized voting application, in which the relevant operations are automatically executed through smart contracts.
Key Words:Blockchain; Ethereum; Smart Contract; DLT
目录
第一章 绪论... 1
1.1 背景和意义... 1
1.2 国内外现状... 1
1.2.1 区块链在开源领域发展现状... 1
1.2.2 区块链产业联盟发展现状... 2
1.2.3 国内外区块链政策现状... 2
1.3 主要研究内容... 2
1.4 论文章节安排... 3
1.5 本章小结... 3
第二章 相关理论和技术... 4
2.1 区块链的概念和特征... 4
2.2 区块链的核心技术... 5
2.2.1 分布式账簿... 5
2.2.2 共识机制... 5
2.2.3 智能合约... 7
2.2.4 密码学... 7
2.3 本章小结... 9
第三章 以太坊介绍... 10
3.1 以太坊主要特点... 10
3.2 以太坊核心概念... 11
3.3 本章小结... 13
第四章 去中心化的应用示例实现... 14
4.1 投票系统简介... 14
4.2 投票系统的智能合约开发和部署... 16
4.2.1 智能合约开发介绍... 16
4.2.2 开发工具介绍... 16
4.2.3 智能合约编写和部署... 17
4.3 实现投票平台... 18
4.4 实验结果与分析... 20
4.4.1 功能测试... 21
4.4.2 结果分析... 22
4.5 扶贫资金流管理系统... 23
4.5.1 系统简介... 23
4.5.2 智能合约开发... 24
4.5.3 实现管理界面... 24
4.6 本章小结... 25
总结与展望... 26
参考文献... 27
第一章 绪论
1.1 背景和意义
2008年,中本聪发表文章《比特币:一种点对点电子现金系统》[1]其内容针对现阶段互联网交易进行探讨,指出在交易中缺乏信任的问题。虽然有可信任第三方的介入可以解决部分信任的问题但同时也增大了不必要的成本和交易规模。文中说明我们急需要一种方便快捷而且安全的电子支付交易系统,该系统允许互不相识的两方按照约定进行交易。其中所描述的区块链技术是将特定的信息看做一个区块,其中包含交易的各种信息和前一个块的特征等。通过加密的方式来保证数据绝对性的安全,并形成一个分布式的总账。
区块链可以分为三种:公共链,联盟链和私有链[2]。公有链,是对外开放的,不需要身份验证等操作。联盟链则是专供某些组织或者机构使用,本身并不是一个开放的系统。私有链则是由某个机构所掌握的。
根据区块链对接类型的不同,其可分为三种类型:单链,侧链和互联链[3]。单链是指不依靠其它链就可以运行的区块链系统,这些区块链系统有完整的组件模块,自成一格体系。侧链是指交叉链技术,也就是说不同的区块链之间进行安全地转换。互联链是链接不同的区块链设施,这些区块链设施之间可以进行数据的交换。比如电商、物流和银行之间的联盟链互相交易。
以太坊在其区块链技术中融入了智能合约。通过部署智能合约,我们就将几方的约定上传至区块链中,并同步到各个节点。当有人触发某个事件的时候,智能合约会由以太坊虚拟机自动的执行。因此,智能合约不仅能有效的对信息作出处理,还可以它可以保证合约不受外界干扰,正常执行。
1.2 国内外现状
1.2.1 区块链在开源领域发展现状
区块链技术在开源领域发展迅速,以下简单介绍两个区块链在开源领域的应用。
超级账本项目是Linux基金会于2015年发起的,目前吸引了许多公司加入。其中包括IBM,华为,Redhat等世界五百强公司。该项目的目的是建立一个用于简化业务流程的开放的平台。
企业以太坊联盟是成立于2017年2月。在2018年2月的时候以太坊联盟的会员就超过了150位。该联盟旨在改善区块链的安全性和可扩展性,以及开发一种标准和技术。就目前来看以太坊联盟链仍旧不能满足企业需求,各个企业仍在积极探索如何更好的应用联盟链。
1.2.2 区块链产业联盟发展现状
R3区块链联盟成立于2015年,由全球多家有实力的国际银行参加,其目的是制定区块链在金融行业应用的标准。
区块链货运联盟,由全球100多家物流公司在2017年共同成立该联盟,旨在探讨如何提高物流的透明和效率,通过使用新的区块链技术来整合货运和物流来降低整个过程中的成本。
运营商区块链联盟,该联盟是由Sprint和softbank于2017年成立的,其旨在解决多个子系统可介入区块链平台之间账薄共享的问题。
可信区块链联盟,由华为等100多家中国企业和中国信息研究院共同成立该联盟,旨在共同推进区块链技术在产业中的应用。
1.2.3 国内外区块链政策现状
(1) 国外区块链相关政策
日本政府早在2017年就宣布发展区块链项目,并在3月、4月、7月出台的多项关于区块链和电子货币的政策。其中包括数字资产如何应用,加密货币合法化且纳入法律体制中[2]。为了推广这项技术,日本政府还决定使用比特币交易不需要缴纳任何的消费税。
韩国政府在2017年将比特币形式的汇款方式合法化,并禁止比特币的匿名交易[2]。次年,ICO合法化,并成立区块链相关协会,协调区块链在各领域的发展。
欧洲央行早在2016年就公开宣布了探索区块链技术的计划,并在6月发布了分布式账簿技术的评估报告,该报告主要讨论了区块链技术如何应用在证券市场上。两年后,欧盟22个国家共同建立欧洲区块链联盟[2]。
(2) 国内区块链相关政策
我国在2016年至2018年之间发布并提出的多项指导意见和建议。其目的是提出我国区块链技术的标准化路线和技术发展路线。研究区块链技术的试点应用,并建立基于区块链技术的信用评价机制[2]。
浙江省在2016年至2017年之间发布了多项指导意见。其中包括引入区块链企业进驻,加快区块链等前沿领域研究和产品创新,支持金融机构探索区块链等新型技术,加快区块链在重点领域的推广和应用等[2]。
贵州省在2017年发布了多项措施。其中明确说明将区块链列为三个重点发展方向之一,支持鼓励区块链企业及其相关机构入驻,从入驻开始就为企业和人才提供各种各样的补贴[2]。
1.3 主要研究内容
本课题是对区块链技术进行研究,主要是以以太坊为例对其智能合约进行学习并剖析。通过学习的内容设计并实现一个简单的去中心化的应用。因此,本文工作如下。
(1) 对区块链使用到的部分技术进行学习和研究。
(2) 以以太坊为例对其智能合约进行学习。
(3) 基于现有的知识,完成一个简单的智能合约应用。
1.4 论文章节安排
本文章由四个章节组成,各章节内容安排如下:
第一章 绪论。本章说明了研究课题的背景和意义,并对国内外的各组织、商业公司以及政府对区块链的政策进行了阐述。最后说明了本课题研究的主要内容以及各章节的安排和本章节的总结。
第二章 相关理论和技术。本章对区块链使用的一些技术进行阐述,首先介绍了区块链的概念和特征,随后介绍了其使用的核心技术例如分布式账簿,共识机制,密码学相关内容。
第三章 以太坊介绍。本章对以太坊的特点和核心概念进行了简单的介绍,其中的信息有助于对区块内的信息进行理解。
第四章 去中心化的投票APP示例实现。本章基于以太坊平台,对智能合约进行开发。在主机上通过模拟软件模仿出真实环境下的区块链平台,然后在平台上部署智能合约,并编写可视化的操作界面。本章的重点就是实现从开发到使用智能合约的完整过程。
总结与展望。对本文的主要内容以及成果和不足进行总结,并且对未来区块链的应用进行简单的阐述。
1.5 本章小结
本章对课题的背景和意义进行了阐述,解了现在区块链技术的大环境和现状,以及国内外对区块链技术的态度。最后,对文章各个章节的内容进行安排。
第二章 相关理论和技术
2.1 区块链的概念和特征
如图2.1所示。区块链中第一个区块称为创世块,里面包含一些初始信息,之后的每一个新产生的区块都会按照时间顺序链接到前一个区块之后。后一个区块包含有前一个区块的特征信息,从而保证了会形成唯一的一条链。每一条链都会存储到每一个节点上,也就是说每个节点的区块链信息都是一样的,从而实现了去中心。当需要产生一个新的区块,需要得到全网大于一半的节点确认才会生效,并广播到全网的节点。
区块链技术有以下几点特征来保证数据的安全。
(1) 不可篡改。它不同于基于硬件技术实现的不可篡改,我们在生活中见到的只读CD就是一种基于硬件技术实现的不可篡改。区块链技术是合理的使用了密码学,获取了区块的唯一不可变的特征来实现不可篡改的。一旦修改了任意的一个区块的任意内容,该区块的特征就会改变。这条链就从此处断开了,我们称之为“废链”。对于废链节点会毫无顾忌的抛弃,然后从其它节点同步一条完整的正确的链。只有当超过百分之五十的节点同时受到攻击,在区块链的末端加上一条非正常产生的链这时候该区块连才会被修改,所以不可篡改更像是难以篡改。
(2) 去中心化。指的是区块链并非依赖于某几个节点,这也就保证了没有人可以去操作数据。但是在某些情况下,比如说溯源,它如果从源头就是错的,那就会一直错下去。也就是说区块链并不会去创建一个信任,而是一个信任的载体,数据从上链的那一刻就会保持不可更改的状态。
(3) 账本公开。公开账本,则是表示所有的参与者都可以访问账本的权限。究其原因就是因为每一个节点都要去校验数据信息的有效性,所以参与记账的节点必须要有权去访问历史账本。这实际上带来了一个问题,就是说所有的信息都必须要公开,但是要去验证公开的账本不代表要去公开账本内容,所以未来会有很多加密算法和加密的形式运用到区块链技术中。如零知识加密,门加密等,最终实现验证密文就可以对历史账本进行验证。这样就能达到历史账本是公开的而账本的内容也就是隐私部分可以实现不公开。
(4) 共同维护。共同维护指的是多方参与的共同维,此处的多方指的是进行记账的不止一方。也就是说每个记账方都要按一定的规则来主导记账,具体规则根据共识机制的不同会有差异。但无论怎么差异最终所有的记账方都要去对数据进行验证,全部通过才能算完成。
2.2 区块链的核心技术
2.2.1 分布式账簿
分布式账簿技术,用于在各个网络成员间进行数据共享、同步数据的一种去中心化的技术。网络中的每一个成员都有权利获取账簿的内容,也有义务对账簿进行维护。
传统的分布式存储往往是由单一中心去控制,然后将庞大的数据进行切割,分解之后存储在服务器中。在TB及数据非常常见的今天,服务商不得不增大数据中心的规模。如果使用分布式账簿技术,我们可以保证数据是共同维护,共同决策[4]。每个节点都是平等的,节点和节点之间通过共识来达到数据一致,互相之间不会产生影响。这样做不但降低了维护成本,而且使得被攻击的可能性越来越低。
2.2.2 共识机制
区块链是一个由多个节点构成的一个可溯源、防篡改、可信任的分布式系统,分布式的系统需要保持数据的一致性。通过使用共识算法,就可以保证数据的一致性。而现阶段共识算法多种多样有PoW,PoS等。而其中使用较多的就是PoW和PoS,我们对这两个做详细说明。
(1) PoW工作量证明
PoW算法。其本质是通过计算机计算一个已知的结果,当猜测到的数字哈希值满足设定的难度的时候就会产生一个区块。
哈希问题是具有不可逆转的特点,也就是说你用一串数字可以得到这串数字的哈希值,但是你拿到哈希值却不能通过计算得出这串数字。唯一能采取的方法就是,使用一个数字从0开始计算每个数字的哈希值,直到得到的哈希值与拥有的是一样的。就目前而言,只能通过大量的计算才能算出哈希值。然而大量的计算需要一定时间的积累,这也就是我们的出块速度了。
出块速度不仅仅和采用的哈希算法有关系,还和难度值有关系。比特币的数量是固定的,而且每年全网的算力都是会有变化的。假如说某区块链的PoW算法是全网的算力每40分钟产生一个区块,并以4周为一个周期去调整难度值,这样计算下来每四周期望生成1008个区块。如果实际产生的区块大于1008个就会增加难度值,如果少就减少难度值。公式可总结为如下示:
新难度值 = 旧难度值 ×(产生一个区块实际所需的时间平均值)
在真实的情况下,所有的节点都会去按照这个难度值去同时计算,那么必定会面临分叉的情况。某一个节点在生成新的合法区块之后,会向所有已知的节点广播这条信息,当经过一半以上的节点认证后可以认为是有效的块。在这个过程中,不仅会产生分叉,还会产生一条最长的链,而这个最长链才是大家的共识才是有效的被大家认可的。就拿排队出门举个例子,在只有一个出口的情况下,现有一条较长的队伍A,B,C,D。突然间在B旁边站了一个人E,形成第二条队伍。这时候有共识的人都不会承认E,C,D这条队伍是有效的。新来的人F也会因为共识的原因加入较长的队伍。如图2.2所示:
这样一来E,C,D这条链就是被废弃了,这代表着这个节点之前所付出的努力花费的精力一文不值了。所以会出现了矿池,大家一起挖矿,挖到的矿按照每个用户贡献来合理分配。
(2) PoS[5]权益证明
PoS权益证明是在2013年提出的。之前介绍的PoW它的缺点就是平白无故的耗费算力,有些人认为这是一种浪费,从而实现了一种类似于股权机制的算法称之为权益证明。
其过程类似于资产的抵押,当你是一个人富有的人,这时候你抵押了很多东西,从而得到了很多的股份,你获取记账权的可能就越大,只要你是一个合法的记账者,在记账中产生的服务费就是你的,如果你是一个恶意的记账者,那么在记账的过程中可能要承担损失抵押的风险。
在记账的过程中PoS算法也会根据节点的币龄(节点各个数字货币的持有时间总和)来调整挖矿的难度,也就是说“年轻”的节点会更容易挖到矿,“年老”的节点会更难挖到矿。
一般来说,使用PoS算法的区块链会更难伪造区块。使用PoW算法的区块链只要黑客的算力超过全网的一半便可以随意的攻击区块链。而使用PoS算法的区块链一般来说要掌握全网三分之一的资源才有可能左右该区块链。在攻击的过程中不仅消耗的成本远远大于集中算力的攻击而且攻击主链时自己的资源也会被消耗掉。
值得一提的是以太坊在被黑客攻击之前使用的是PoW算法,之后硬分叉,使用了一种改良的PoW算法。但是由于区块链的特性使用PoW算法的以太坊程序得以保留,称之为以太经典。这从侧面也证实了区块链技术的稳定性,不能被消灭,只能硬分叉。
PoW算法和PoS算法,其主要是用于公有链的。所以其共同点就是对于参与的节点有一定的奖励,根据各个节点做出的贡献不同,发放不同量的代币。它也会针对作恶的节点去进行惩罚。在交易的过程中还会产生gas,来奖励承担交易的节点。而联盟链或私有链他们没有这种鼓励大众参与的需求,而是需要用到绝对可信的数据。所以他们的节点可以认为都是私有的,既然是“自己人”当然可以去省略发放代币或者产生gas的过程。换句话说,私有链和联盟链的节点不需要通过记账来获取激励,它们更多的是维持系统稳定运行,信息绝对正确的义务。
2.2.3 智能合约
智能合约是由尼克萨博在20世纪末提出来的。他认为智能合约是一套使用数字定义并描述合约内容的可由计算机自动执行一种合约[6]。虽然智能合约早早的就提出但是由于技术的原因,迟迟没有实现。2008年比特币的出现使得智能合约有了一个可信的载体使我们看到了智能合约的雏形。比特币中的脚本系统,就可以看做是一个简单的智能合约系统。
从2016年开始,智能合约技术逐渐成为行业内关注的焦,引起了社会各界的关注。智能合约的生命周期一般分为三分阶段:定义合约,发布合约,执行合约[7]。如图2.3示。以以太坊为例,在定义阶段,多方用户共同制定合约,确定合约内容。之后编译为可由以太坊虚拟机识别并执行的特有的二进制格式,同步到每一个节点。每次有事件触发合约的时候,以太坊虚拟机都会自动的执行合约。
2.2.4 密码学
在区块链技术中,我们使用了大量的密码学技术,主要包括:哈希算法,非对称加密等[8]。这些数字加密算法,保证了数据防篡改和机密性的同时也可以对用户身份进行认证,对用户操作进行签名。以下通过这几个方面向大家介绍密码学在区块链中的应用。
l 防篡改
哈希函数又称为散列函数,它具有一下这些特点。
(1) 易压缩:任意长度的输入都得到一定长度的输出。
(2) 易计算:对于给定的对象m其哈希值都是较为容易计算的。
(3) 单向性:得到哈希值得过程不可逆。
(4) 抗碰撞性:弱抗碰撞性,有可能出现两个不同对象哈希值相同。强抗碰撞性,每个对象的哈希值都不相同。
(5) 高敏感性:输入对象的内容产生任何的变化该对象的哈希值就会发生改变。
在区块链中,每一个区块里包含的内容都有以上的几点特性。这就代表了每个区块的“基因”都是独一无二且相互关联有规律的。每一个区块除了含有自身独有的部分信息外还含有上一个区块特征信息。这也就保证了整个区块链是有高敏感性的,当其中一个区块的内容发生变化,该区块的哈希值改变。此时这条链就被看做是一条无用的链,节点会自动同步一条完整的链。
l 机密性
机密性主要由对称加密和非对称加密来解决,而在节点通信的过程中为了防止窃听,还需要用到TLS加密技术。
(1) 对称加密:通过同一个秘钥进行加解密操作。其优点是速度快,安全性较高。对称加密可以分为分组密码和序列密码两大类。分组密码主要特征就是将一段长的需要加密的数据,切分为定长的块来进行加密。序列密码则是以字符为单位进行加密。综上来看,对称加密需要提前分发秘钥而且比较适合对数据量庞大的对象加密。
(2) 非对称加密:通过不同的秘钥来进行加解密操作。分别称之为公钥和私钥,这里要注意的是公钥和私钥是同时生成的,且是唯一的一对。其中公钥是公开的,私钥是私有的。我们通过举例来说明非对称加密是如何使用的。
第一步:王先生生成一对秘钥,公钥为W1,私钥为W2。赵先生生成一对秘钥,公钥为Z1,私钥为Z2。
第二步:王先生与赵先生交换公钥。此时王先生拥有W1,W2,Z1。赵先生拥有,W1,Z1,Z2。
第三步:王先生用自己的私钥W2和赵先生的公钥Z1对数据进行加密,并传输给赵先生。
第四步:赵先生用自己的私钥Z2和王先生的公钥W1对收到的信息进行解密。
如图2.4示,公钥加密私钥解密示意图。
|
(3) TLS加密:TLS加密是一种对称加密和非对称加密相结合的加密算法。究其本质就是利用非对称加密安全地特点,去传输一组对称加密的秘钥。这样一来,既可以使秘钥不泄露,也可以保证对数据快速的进行加密和解密。
l 身份验证
身份验证主要用到了数字证书。我们使用的是TLS加密传输信息,这种方法虽然能够安全地将信息从一个节点传送到另一个节点,但是没有办法保证对通信对端的信任,所以这里首先要对其进行身份验证。
2.3 本章小结
本章主要介绍区块链相关的技术和概念。首先介绍了区块链的概念和它的部分特征。其次阐述了区块链的分布式账簿,共识机制,智能合约和密码学的内容。通过对上述的内容进行学习,为进一步了解以太坊做准备。
第三章 以太坊介绍
以太坊项目,其本质上是一个区块链开发平台[9]。通过使用该平台,开发者可以快速的开发出去中心化的应用。在这个平台上,合约会由计算机按照内容来严格的执行,不会受到第三方的干预。区块链的架构模型如图3.1示。
3.1 以太坊主要特点
以太坊和比特币由很多类似的地方,两者都使用的是公有链,网络上的每一个用户都可以接入,任何接入的用户都要负责维护区块链。
以太坊区块链还具有以下特点。
(1) 拥有图灵完备的智能合约。可通过多种语言编写合约,并通过EVM执行。
(2) 叔块奖励机制,降低矿池优势。
(3) 采用账户系统和世界状态,而不是UTXO,容易支持更复杂的逻辑。
(4) 通过Gas限制代码执行指令数,避免循环执行攻击。
(5) 现阶段的采用的变种的PoW算法,并计划在未来使用PoS算法。
3.2 以太坊核心概念
以太坊项目在比特币网络核心的思想之上又提出了许多具有创意的想法。其中就包括智能合约、账户、燃料等。
(1) 智能合约
以太坊的智能合约可以使用solidity语言进行编写,使用这种简单的编程语言可以降低智能合约的编写难度。智能合约编写完成后通过编译器编译为只有以太坊虚拟机可以识别并运行的特殊二进制文件,通过客户端将智能合约上传至区块链中。
举个例子,可以使用以太坊的智能合约来保证投票的公平公正。在以往的投票应用中,或许以微信为平台,或许自己构建一个新的应用,这些应用都是有中心服务器的。这就代表数据可以很容易的被篡改,或破坏。在使用智能合约编写的投票应用中,所有的操作都是之前定义好的,而且合约内容是不可以被更改的。只能通过定义的方法去访问合约中数据,进行投票或其它操作。
(2) 账户
以太坊使用账户来存储系统状态信息,需要时候的时候直接进行读取[10]。账户模型示例图如图3.2示。而比特币中使用UTXO模型来存储状态信息,当需要使用的时候再去溯源得到最终状态。UTXO模型如图3.3示。具体来看以太坊账户可分为两种类型:合约账户和外部账户。它们两个的关系是调用和被调用的关系。外部账户即是以太币的拥有者指的是某个人。合约账户存储的是合约代码,只能由外部账户来调用。当合约账户被调用的时候,其合约代码在以太坊虚拟机中自动执行并消耗一定了的燃料。
(3) 交易
交易本质上是消息数据的传输,而消息数据又是由多个参数组合而成的。通过多个参数,就可以准确的描述一个交易。一个交易中包含的信息如表3.1示。
表3.1交易信息表
字段名 |
含义 |
to |
目标账户地址信息 |
value |
指定转移的以太币的个数 |
nonce |
交易相关的字串 |
gasPrice |
执行这项交易所需要的燃料价格 |
startgas |
交易消耗的燃料最大值 |
signature |
用户签名信息 |
出于智能合约的便利考虑,以太坊采用了账户的模型,交易状态可以实时保存到账户中。而比特币中的UXTO模型,必须回溯整个历史。UXTO模型和账户模型的对比如表3.2示:
表3.2 UXTO模型和账户模型对比表
特性 |
UXTO模型 |
账户模型 |
状态查询和变更 |
需要回溯历史 |
直接访问 |
存储空间 |
大 |
小 |
易用性 |
难处理 |
易于使用和处理 |
安全性 |
好 |
需要防止被攻击 |
可回溯性 |
可以回溯历史 |
不可回溯历史 |
(4) 以太币
以太币是为了奖励记账的节点而产生的一种代币,其主要目的是作为区块链网络中的通用货币来支付矿工和购买燃料。
(5) 燃料
燃料是执行智能合约所必须的,当燃料耗尽时,智能合约自动终止并回滚状态。也就是说,燃料限制了智能合约可执行命令的上限。
以太币的价格是浮动的,但是燃料的费用是固定的。这就需要以太坊网络根据以太币的价格动态的调整燃料和以太币之间的转化关系。
3.3 本章小结
本章节主要对以太坊项目进行介绍。并对以太坊中的智能合约,账户,交易,以太币,燃料等概念进行阐述。
第四章 去中心化的应用示例实现
本章内容是基于前几章所讲的技术,实现去中心化的投票系统和扶贫资金流管理系统。通过编写应用,来演示如何从零编写并部署一个智能合约。通过实例,来了解如何通过客户端与智能合约进行互动。
4.1 投票系统简介
该系统基于前几章所述的相关概念,实现一个去中心化的投票平台。去中心化投票系统流程图如图4.1所示。去中心化的投票系统主要分为以下几个阶段:用户在去中心化投票系统平台进行注册,之后对密码加密并以文件的形式保存到本机的指定位置。注册完成后,进行账号和钱包地址的绑定。如果没有钱包,则可以进行申请,每一个账户会默认由一定量的以太币。注册钱包后,便可以进行投票操作。选择想要投票的对象,点击投票按钮,再次确认投票即可完成投票操作。在此之后需要等待一段时间,当节点确认之后便可以获取到投票信息。
该系统从系统层次上来说可以分为两层。一层是基于以太坊的Ganache平台的实现的区块链和智能合约,另一层则是一套基于Python、web3、TKinter实现的GUI界面。其主要目的是方便用户与智能合约进行交互。系统的整体架构图如图4.2所示。
图4.2展示了去中心化的投票应用整体架构图[11],其架构大致可分为三层。
应用层:应用层指的是用户可以直接操作的一层,它提供良好的界面和快速的操作方式。同时起到了纽带作用,将用户和区块链相互连接到了一起。该应用的应用层实现主要是以客户端的方式来实现。
区块链网络层:区块链网络层主要是共识机制,按照约定的共识机制来确认新产生的区块是否有效。
区块链存储层:指的是每一个区块,即生成新区块的过程。
相比较于传统的应用系统,需要中心服务器来解决数据存储和信息处理的功能。该系统使用分布式存储,每一个节点就是一个数据库,每一个节点都有处理数据的能力。并且该系统还保证了数据具有不可篡改的性质,大大增强了数据的安全性。
4.2 投票系统的智能合约开发和部署
4.2.1 智能合约开发介绍
合约是一系列的功能与状态的集合,通过特有的方式编译为只有以太坊虚拟机可以识别和执行的特殊二进制代码,并存储于区块链上。合约可用各种各样的语言来编写。例如:LLL和Sperpent等。LLL类似于汇编语言。Sperpent是一种较简洁的编程语言,其高效率和易操作的特点受到开发人员好评。Solidity是以太坊官方推荐的一种编程语言,目前它是以太坊最受欢迎的编程语言。本小节内容,也使用Solidity语言来实现。
4.2.2 开发工具介绍
实现去中心化的应用程序的关键就是开发智能合约代码,相关机构和组织都为我们提供了良好的开发和测试环境。例如Truffle,Remix,Drizzle,Solidity,Ganache等。
在本文中,我们使用Solidity语言编写智能合约,其简单,优雅等特点会在编写智能合约的过程中减少编写的难度。Remix,是一种基于浏览器的集成开发环境。通过使用它,开发者可以很方便的对智能合约进行开发和管理。在本文中,我们也是通过Remix最后对智能合约进行部署。Remix开发界面如图4.3示。
图4.3 Remix开发界面
Ganache是一个用于模拟以太坊区块链系统的工具,通过它可以开发去中心化的应用,也可以用来搭建测试网络。同时它支持在多平台运行并可以通过可视化界面进行操作。我们使用Ganache主要是为了搭建测试网络,方便对去中心化应用的开发和测试。Ganache的主界面如图4.4所示。
图4.4 Ganache的主界面
从这个界面可以看到,新建立的以太坊测试网络使用HTTP协议,部署在127.0.0.1:7545的网络上。此时生成了10个以太坊钱包(可以通过配置修改),钱包地址是一个十六进制的串,每个地址初始会有100个以太币。这里要注意的是,在部署智能合约的时候要选择我们本地的虚拟网络,否则不能成功部署。
4.2.3 智能合约编写和部署
根据需求将投票应用分为以下几个功能,分别是初始化投票列表,投票,查询,验证投票对象是否处于投票列表中,每一个功能拆分成一个函数来进行操作。首先定义变量PersonID用于存储对象id,之后将对象映射到PersonVotingCount,形成一一对应的关系。定义Voting函数,该函数名称与智能合约名称一样,会当做智能合约的构造函数来执行,作用就是用来初始化投票列表。定义VotingforSB函数,该函数会先使用isValidPerson函数检测对象是否在投票列表中,返回布尔值,之后进行投票操作。定义totalVote函数,同样先执行isValidPerson,然后返回对象的票数。定义isValidPerson函数,判断对象是否有效。智能合约完整代码如图4.5所示。
图4.5智能合约代码
部署智能合约的过程中要注意以下几点。
(1) 智能合约的版本需要和声明的一致,否则会出现兼容性问题。
(2) Environment由三个选项分别是JavaScriptVM用于在浏览器中测试,Injected Web3用于搭配MetaMask使用,Web3 Provider用于搭配本地测试环境使用,在选择该选项时,需要输入上一节中提到的测试地址。
(3) Account 可以选择使用的账户。
(4) Deploy 用于部署智能合约时输入初始化的数据。
在部署智能合约的过程中,我先是通过JavaScriptVM在浏览器中测试,通过测试,发现各个功能正常。然后使用Web3 Provider,部署智能合约搭配客户端使用。
在部署完成智能合约后,会出现合约地址,合约abi等信息,将在下一节需要使用到。
4.3 实现投票平台
在上一节中,编写并部署了智能合约。对于用户来说,使用智能合约不能依靠命令行或者复杂的界面。这一节主要是使用Python编写拥有可视化界面的客户端,使用web3模块与智能合约进行交互,访问区块链网络。该投票平台的主要功能和界面如下。
(1) 注册登录界面
用户注册功能。是为初次使用的用户提供的方便与在本机管理钱包地址的功能。当用户初次使用该投票系统的时,只需要输入自定义的密码并点击注册即可。此时系统会将密码加密并以文件的方式存储在本地的配置文件中。之后,用户可以通过较短并容易记忆的密码,访问自己的钱包账户,方便操作。当注册成功时,会自动跳转至投票界面,成为登录状态。此时并无以太坊钱包,可以选择自动获取或者手动的方式输入钱包地址。
用户登录功能。当用户输入密码点击登录按钮时。系统会将密码加密然后与存储在本地文件系统中的密码进行对比,从而验证账户是否正确。当密码验证成功时,会自动跳转至投票界面,选中配置好以太坊钱包。该系统注册登录界面如图4.6示。
图4.6注册登录界面
(2) 投票界面
用户投票功能。投票界面会显示出可投票的对象和每个对象拥有的票数。每一个对象都是互斥的关系,也就是说只能选其中某一个人然后进行单次的投票。当选中某一投票对象并单击投票按钮时,会检测是否有钱包地址,钱包地址是否有效。如果无钱包地址或地址无效,则会弹出相应的警告信息。投票界面如图4.7示。
图4.7投票界面
(3) 确认投票
用户在选中投票对象后,点击投票按钮时会弹出此界面。若钱包地址正确,则会弹出提示话框,点击确认按钮来操作。点击取消,则会取消操作。确认投票界面如图4.8示。
图4.8确认投票界面
在整个投票过程中,还有一个刷新按钮是用来刷新投票结果的。在实际的投票环境中,会根据gas的大小不同,区块链各个节点记账的积极性也不同。类似于拍卖,同样的一件事情,出价高的人会快速的被记账。当区块链数据特别多的时候,由于网络延迟等问题不能及时的更新节点的数据。另一个问题就是,公有链是公开的,是每一个人都可以访问的。也就是说它可以有多个平台多个入口来投票,而每一次的刷新都是需要被动或主动执行的。
4.4 实验结果与分析
在成功开发智能合约、投票平台后等过程后。对二者进行测试,用来验证智能合约和投票平台是否正常工作。
本次实验的实验环境如表4.1示。
表4.1实验环境表
名称 |
版本 |
Windows 10 |
17134 |
Solidity |
0.4.24 |
Python |
3.7.3 |
Web3 |
4.9.1 |
Ganache |
2.0.1 |
4.4.1 功能测试
功能测试主要利用黑盒测试来进行,对系统中的各项功能例如:登录,投票等进行测试并得出测试结论。在系统测试过程中会输入错误的数据或者正确的数据。下面给出部分的测试用例及其结果。
表4.2登录功能测试表
模块名称 |
用户登录模块 |
||
操作人员 |
普通用户 |
版本号 |
无 |
设计日期 |
2019/4/24 |
||
测试类型 |
功能测试 |
||
用例ID |
Case-01 |
||
用例名称 |
用户登录 |
||
测试目的 |
测试用户登录是否正常,错误是否有提示。 |
||
操作步骤 |
输入密码并登录 |
||
预期结果 |
1密码正确,登录成功。 |
||
测试数据 |
Test1 |
注册用户 密码:456 |
|
Test2 |
未注册用户 密码:123 |
||
实际结果 |
1注册用户登录成功。 |
表4.3投票功能测试表
模块名称 |
用户投票模块 |
||
操作人员 |
普通用户 |
版本号 |
无 |
设计日期 |
2019/4/24 |
||
测试类型 |
功能测试 |
||
用例ID |
Case-02 |
||
用例名称 |
用户投票 |
||
测试目的 |
测试用户投票是否正常,错误是否有提示。 |
||
操作步骤 |
1选择投票对象。 |
||
预期结果 |
1钱包地址为空,提示钱包地址为空。 |
||
测试数据 |
Test1 |
钱包地址为空。 |
|
Test2 |
钱包地址为错误地址。 |
||
Test3 |
钱包地址为正确地址。 |
||
实际结果 |
1钱包地址为空,提示钱包地址为空。 |
表4.2是登录功能测试用例表,表4.3是投票功能测试用例表。由以上结果可知该功能可以正常使用。投票信息如图4.9示。
图4.9投票信息图
4.4.2 结果分析
本节的重点就是实现与智能合约的交互,并通过可视化界面的方式展示给用户。由上述信息可知,成功的实现了通过简单的操作就能与智能合约进行交互的功能。该平台的优点和难点总结如下。
(1) 成功部署智能合约后,当事件被触发,智能合约就会自动的执行。
(2) 以太坊的智能合约是和区块链技术相互搭配的,此时智能合约就有了区块链技术的特点。
(3) 从实现的过程可以看出来,通过智能合约开发出来的应用在安全性等方面是比较可靠的。
(4) 在整个过程中,最难的就是智能合约版本之间存在着不兼容的情况。
4.5 扶贫资金流管理系统
4.5.1 系统简介
该系统是一个简单的去中心化扶贫资金流管理系统,其功能包括资金的分配和查看资金流向。资金分配功能的流程图如图4.10示。通过对于国家相关政策的了解发现,扶贫资金一般是由国家发放给省级行政单位,再有省发放至市级行政单位,再有市发放至县级行政单位。最后县级行政单位将资金用于社保,教育等方面。在该示例系统中我通过编写一个中央,两个省,三个市,四个贫困县的模式来展示该扶贫资金流管理示例。两个省是指陕西省和四川省,三个市指咸阳市、宝鸡市和绵阳市,四个贫困县分别是旬邑县、淳化县、扶风县和北川县。该系统所用到的省市县从属关系图如图4.11示。
该系统也是分为两层。一层是基于以太坊的Ganache平台的实现的区块链和智能合约,另一层则是一套基于python,flask,web3,pyecharts实现的基于浏览器端的交互界面。相比较于传统的扶贫资金流管理系统,该示例系统拥有去中心,安全性高,自动执行等特点。
4.5.2 智能合约开发
根据需求将应用分为以下几个功能,分别是初始化省市县列表,转移资金,验证输入和输出对象是否属于省市县列表中和获取各个省市县资金数额。其中每一个功能拆分成一个函数。初始化对象列表的是MoneyFlow函数,该函数对初始化的数据进行处理,并进行赋值操作。资金的增减使用moneyChange函数,该函数主要用于改变某一对对象的资金数额。获取对象资金数额使用getInfo函数。验证对象是否有效使用isValidObject函数,该函数主要用于验证对象是否是在对象列表中。智能合约的完整代码如图4.12示。
图4.12智能合约代码
4.5.3 实现管理界面
在上一小节中,展示了智能合约代码。我们在成功部署和测试完成的基础之上实现基于浏览器的管理界面,从而方便与智能合约进行交互。管理界面主要由两部分组成,一部分是资金流管理界面。如图4.13示。另一部分则是资金流展示界面。如图4.14示。
图4.13资金流管理界面
在该界面中从From一栏中选出对象,To一栏中的对象会根据从属关系发生改变。此时选中对象,在Value一栏中输入数值点击提交即可。
图4.14资金流展示界面
在该界面中,资金流以树的方式展现出来。省、市、县,每一个节点都可以进行折叠。
4.6 本章小结
本章首先介绍了两个系统的基本信息,其次对智能合约进行开发和部署,随后开发了交互平台提供了友好的界面,最后投票应用示例的实验进行总结和分析,对扶贫资金流示例实验进行了简单的描述。
总结与展望
本课题的目的在于通过实验的方式更加的了解区块链技术及其应用。本文以以太坊平台为基础,实现了去中心化的投票应用,该应用中的数据具有去中心,防篡改等特点。在文中首先对区块链在国内外发展的现状进行简述,随后对区块链的特征和概念以及其使用到的部分核心技术进行学习,之后介绍了以太坊平台,最后通过以太坊平台成功的实现了一个去中心化应用的示例。
该系统虽然成功的运行了,但是由于多种原因。这种技术只可以用于私有链和联盟链或者由自己搭建的公有链。本文虽然成功在本地主机上模拟了区块链的环境并成功实现了去中心的投票应用,但是限于实际硬件环境和作者本身的水平以及时间等因素还有很多需要提升的部分。例如可以编写更复杂,功能更多的智能合约,可以提升投票平台的安全性等。这些部分也是作者在以后要更多考虑的。
区块链技术等应用是非常广泛的,它的相关产业也是非常丰富的。大致可以分为基础设施层(硬件),技术扩展层,行业应用层。其中行业应用层包括金融,医疗,法律,能源,物联网,溯源,娱乐等,其应用包含了生活的方方面面。
参考文献
[1] NAKAMOTO S.Bitcoin: A peer-to-peer electronic cash system[J].2008.
[2] 创业邦研究中心.钱塘大数据:2018年区块链发展报告[R/OL].https://www.sohu.com/a/235315007_353595,2018.
[3] 亿欧智库.2018年区块链行业应用研究报告[R/OL].https://www.iyiou.com/intelligence/insight85991.html.
[4] 华为技术有限公司.华为区块链白皮书[R/OL].https://static.huaweicloud.com/upload/files/pdf/20180411/20180411144924_27164.pdf.
[5] KING S,NADAL S.Ppcoin: Peer-to-peer crypto-currency with proof-of-stake[J],self-published paper,August,2012,19.
[6] Szabo N. Formalizing and securing relationships on publicnetworks[EB/OL].[2017-07-19].http://www.firstmonday.org/ojs/index.php/fm/article/view/548/469.
[7] 张帅,延安,贾敏智.基于区块链的众筹智能合约设计[J/OL].计算机工程与应用.http://kns.cnki.net/kcms/detail/11.2127.TP.20190117.2052.027.html.
[8] 杨保华,陈昌.区块链原理、设计与应用[M].北京:机械工业出版社.2017.
[9] 申屠青春,宋波,等.区块链开发指南[M].北京:机械工业出版社.2017.
[10] 张海宁,唐屹,李磊.区块链技术指南[M].北京:机械工业出版社.2016.
[11] 杨茜.基于区块链的智能合约研究与实现[D].西南科技大学.2015