基于智能合约的以太坊可信存证机制

2019-08-01 01:54曹迪迪陈伟
计算机应用 2019年4期
关键词:智能合约区块链

曹迪迪 陈伟

摘 要:针对以太坊平台提供的数据管理功能简单且存在低吞吐率和高延迟的问题,提出一种基于智能合约的以太坊可信存证机制。首先针对以太坊平台暴露的数据管理问题提出一个基于智能合约的以太坊可信存证框架,然后通过集中化数据统一处理、认证数据分布式存储以及高效动态取证这几个方面阐述所提机制的框架和实现,最后通过基于智能合约的系统开发表明了该机制的可实现性。实验及分析结果表明,该方法与传统关系数据库存证相比,增加了处理可信性、存储可信性和访问可信性;与区块链存证相比,丰富了数据管理功能、降低了区块存储成本、提高了存证效率。

关键词:以太坊;智能合约;区块链;可信存证

中图分类号:TP311; TP393.08

文献标志码:A

文章编号:1001-9081(2019)04-1073-08

Abstract: Aiming at the problem that Ethereum platporm has simple data management function and poor performance of low throughput and high latency, a trusted storage mechanism based on smart contract in Ethereum was proposed. Firstly, a framework of trusted storage based on smart contract was proposed for solving data management problem exposed in Ethereum. Secondly, the framework and implementation of the proposed mechanism were expounded from the aspects of centralized data processing, authenticated data distributed storage and dynamic forensics. Finally, the feasibility of the mechanism was proved by the system development based on smart contract. The experimental and analysis results show that compared with the traditional relational database storage, the proposed method increases processing credibility, storage credibility and access credibility; compared with blockchain storage, it enriches data management function, reduces the cost of block storage and improves the efficiency of storage.

Key words: Ethereum; smart contract; blockchain; trusted storage

0 引言

区块链(Blockchain)是一种基于数据加密、时间戳、分布式共识等机制实现去中心化的分布式数据管理技术,具有不可篡改、可追溯、高可信和高可用的特点。区块链的概念最早是在中本聪提出的比特币(Bitcoin)这一虚拟货币中体现,并随着比特币的快速发展得到了应用[1]。随后,以太坊(Ethereum)区块链平台以创建一个永不停止、无审查、自动维护的去中心化的世界计算机为愿景而被提出[2],不仅支持加密货币交易,即内置了类似于比特币的以太币(Ether),而且提供了图灵完备的编程环境,因而可以通过智能合约(Smart Contract)实现去中心化应用程序(Decentralized APP, DAPP)。目前以太坊已拥有超过4200万个账户,部署了超过60万个智能合约,基于以太坊的DAPP也已经超过1000例[3]。以太坊平台提供了相对完善的区块链开发与应用基础,也推动了新问题的发现与研究。

中本聪最早设计区块链是为了实现虚拟加密货币的交易,区别于传统的数据库管理系统,它只能提供有限的数据管理服务[4];同时,区块链中使用的共识机制是基于工作量证明(Proof-of-Work, PoW)的,高度依赖节点算力,复杂度与消耗成本较高,导致系统吞吐率较低、延迟較长[5]。因此,如何提供丰富的数据处理、存证和取证功能,实现高性能的数据管理系统,成为了当前区块链领域研究的热点问题之一。

本文结合以太坊平台的特征,构建一种基于智能合约的可信存证机制,主要包括集中化数据统一处理、认证数据分布式存储与高效动态取证等内容,以实现电子数据在以太坊上的存证交易与还原验证,保证数据的真实唯一、可溯源与防篡改。从数据存证角度来看,区块链的本质是一个构建在对等网络(Peer-to-Peer Network)上的分布式账本,能够保证存证数据的原始性、真实性和完整性,适合应用于司法鉴定、审计、公证、仲裁等权威机构,一旦产生纠纷,权威机构可直接从节点中取证、核证,更有利于司法落地。

1 相关研究

已有的区块链研究多围绕加密货币[6]、协议[7]、架构[8]、安全[9]和发展前景[10]角度进行探讨,而本文从可信存证的角度疏通以太坊平台与数据管理功能之间的联系渠道,实现以智能合约为数据存储方式的可信存证机制,并分析数据的存储编码过程,提供两种取证方式及核证还原方法,聚焦于系统的处理可信性、存储可信性和访问可信性。

处理可信性是指数据处理的正确性,要求事务的并发控制,系统需要保存数据的最终状态。传统的数据库管理系统有诸多的基本要求,其中之一就是处理可信性,但是传统的数据库管理系统在某种程度上是集中式地保持事务的原子性、一致性、隔离性和耐久性,关于这方面已有成熟并相对高效的技术[11-12]。在数据管理方面虽然已有较多的关于分布式系统中共识机制的研究[13-14],但是受制于性能,共识机制通常只应用于主控节点的选择上,一般情况下不会直接应用于事务处理[15]。因此,如何确保数据的处理可信性,同时兼顾事务处理的高效性,是以太坊这一去中心化对等网络平台亟须解决的问题之一。

存储可信性是指数据在存储前后应保持一致性,数据处理过程中不会发生数据丢失或被篡改的情况。这就要求系统一方面既要保证在传统数据库管理系统[11]和事务处理[12]中所要求的事务持久性,另一方面又要在系统发生故障或被恶意攻击时,仍能保证数据在存储前后的一致性和正确性。目前基于区块链技术的可信存证方案大多是在原有的存证机制上引入区块链思想,Zhang等[16]提出了一个基于区块链的云取证流程源,将云系统的存在证明记录通过区块链技术进行加密签名,增强云取证的可信度。Bahga等[17]基于工业物联网(Internet of Things, IoT)平台向云计算制造引入区块链理念,使得不受信任的对等网络不需要可信第三方,用户能够按需访问制造资源。但该类文献中没有涉及在以太坊平台上通过智能合约进行可信存证,且缺少对数据的取证与验证环节。

访问可信性是指数据存证后的可审计及可追溯。在分布式对等网络环境中,为了确保数据被访问时是准确可靠的,需要在验证数据的历史状态时,进行一些查询和事务的相关处理[18]。在传统的数据库管理系统中,数据的当前状态存储于数据库当中,而数据库日志通常记录的是数据的存储过程和历史数据,仅用于发生故障时恢复系统,但不能直接提供查询服务[11],因此,传统的数据管理技术无法直接应用于这一场景。数据溯源在科学数据管理中有着广泛的应用,例如集中式数据库或对等的分布式环境[19],但不能直接应用于以太坊的平台场景。

2 以太坊基础

2.1 区块数据结构

区块链的两大应用:一是比特币,二是引入了智能合约的以太坊。二者在数据结构的具体细节上虽有差异,但整体上基本相同,都是以区块为单位的链式结构,分为区块间的链式结构与区块内的数据结构[20]。如图1所示,每个区块由区块头和区块体两部分组成,头信息是区块的元数据,用于验证区块,并与其父区块和子区块建立关联。通常,区块头中存放了父区块哈希(Parent Block Hash)、时间戳(Timestamp)、随机数(Nonce)、难度目标(Difficulty)、Merkle根(Merkle Root)等。体信息则是交易的序列,存放了自前一区块之后发生的多笔交易(Transaction)。

区块链的两个哈希结构保障了数据的不可篡改性,即区块链表和Merkle树。区块链表基于父区块哈希、随机数、难度目标等数值,通过双SHA256哈希运算得到区块哈希值[21],这就保证了区块之间的环环相扣。Merkle树是一种树形数据结构,其非叶子节点是所有子节点的哈希值,叶子节点是区块的交易哈希,数量为偶数。Merkle树节点从下往上,两两成对,将组合哈希值作为新的哈希值,即新的树节点。重复该过程,直到仅存在一个节点,也就是根节点,而根节点的哈希值就认为是整棵Merkle树的签名值。以太坊不同于比特币的地方在于以太坊拥有针对交易哈希的交易Merkle根,以及针对账户状态数据的状态Merkle根(State Root)[20]。除此之外,以太坊块头还含有收据Merkle根(Receipts Root),用于交易执行日志。以太坊是使用MPT(Merkle Patricia Tree)来计算Merkle根的,其本质是Merkle树与前缀树的结合,提供查找能力,查找路径为以太坊的账户地址,从其树根向下查找到叶子节点中账户的状态数据。

2.2 以太坊账户与交易

以太坊是基于賬户的模型,能够针对状态数据处理复杂的业务逻辑。以太坊账户由一个20字节的地址构成,包含四个部分,即:用于确定每笔交易只能被处理一次的随机数,账户当前的以太币余额,账户的合约代码,以及默认为空的账户存储。其中以太币是以太坊内部的加密燃料,用于支付交易或以太坊虚拟机(Ethereum Virtual Machine, EVM)中的计算服务费用,目前市值已达570美元[3]。

一般而言,以太坊账户分为两种类型:一是外部账户(External Owned Account, EOA),二是合约账户(Contract Account)。两者区别在于外部账户由用户控制,而合约账户由可执行代码,即合约代码控制。以太坊的账户包含四个部分,分别是Nonce、Balance、StorageRoot和CodeHash。Nonce是确定每笔交易只能被处理一次的随机数,用于防范区块链的重放攻击,区别在于外部账户的Nonce表示从该账户地址发送的交易序号,合约账户的Nonce表示该账户创建的合约序号;Balance代表的是账户的以太币余额;StorageRoot是Merkle树的根节点哈希值,默认为空;CodeHash表示账户EVM代码的哈希值,区别在于外部账户的CodeHash是一个空字符串的哈希值,合约账户的CodeHash就是合约代码的哈希值。

以太坊交易被定义为存储从EOA发出的消息的签名数据包,包含三种类型,即以太币转账交易、部署智能合约与调用智能合约。其中,当且仅当合约变量值发生改变时,调用合约才属于交易。以太坊交易包含七个参数,分别是To、Value、gasLimit、gasPrice、Nonce、Data及Signature。To代表了20字节的交易接收方地址,如果交易属于部署智能合约,则To为空;Value表示支付交易的以太币费用,单位是Wei;gasLimit指Gas限制额,用于防止代码的指数型爆炸和无限循环;gasPrice是每一计算步骤需要支付矿工的费用;Nonce是用于确定每笔交易只能被处理一次的计数器,防止重放攻击;Data是调用智能合约时的消息数据,或者是智能合约的二进制代码;Signature是确认发送者的椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm, ECDSA)哈希值。

2.3 智能合约

智能合约是定位于以太坊其中一个特定地址上的代码(其功能)和数据(其状态)的集合[2],是一段计算机程序,通过调用智能合约,依照合约内部规则执行交易,访问合约状态数据,从而实现DAPP。因此智能合约的存在扩展了区块链的功能,丰富了区块链的上层应用[22]。

智能合约首先由以太坊自定义的Solidity、Serpent等图灵完备的脚本语言编写,编译为以太坊特有的二进制格式以太坊虚拟机字节码后,可将部署后的合约存放在区块链上,广播至区块链的其他网络节点上,之后合约每次被调用时才被EVM加载运行。智能合约内部包含了表示“账户地址”的address数据类型,相应地,外部账户的账户地址常被用来进行虚拟货币的交易,合约账户的账户地址常用于调用合约。智能合约的Gas消耗是根据执行时所占用的CPU和内存来计算的,Gas一旦耗尽,合约自动停止执行,从而有效避免了合约死循环与无效交易的发生[20]。

一个智能合约可以由外部账户来部署,也可以由合约账户来部署,部署成功后,以太坊上的任何用户都可以调用该合约进行交易。从数据的可信性角度来看,账户调用智能合约的历史操作将被记录在区块中的交易信息中,调用过程和结果可审计、可追溯。

3 基于智能合约的可信存证

由于区块链技术所能提供的数据管理功能较为简单,且其共识机制的计算量耗费巨大,本文通过结合智能合约的方法来达到更好的系统性能。如图2所示的系统架构,本文提出的基于智能合约的可信存证系统可分为三大部分:1)集中式数据统一处理。为提高系统的处理可信性,本文对需要存证的电子数据进行标准化和集中化的收集与处理,灵活、高效快速、一致地处理数据有助于访问和使用数据来开展以太坊存放交易与应用。

2)认证数据分布式存储。本文在以太坊平台上,通过智能合约定义交易逻辑及访问状态数据的业务规则,将存证数据封存在以太坊交易属性信息中,在区块链中不仅记录了交易结果,而且保存了智能合约本身。随着区块链各个节点间的同步,确保了不同节点下智能合约的一致性与正确性,也保证了系统的存储可信性。

3)动态数据取证。引入复杂的智能合约后,以太坊平台所管理的数据随着规模扩大而越来越多,基于区块内的事务之间的Merkle树结构以及智能合约方法来實现数据的取证查询,与此同时可以与原数据的处理结果进行比对,保证数据存证前后的一致性以及系统的访问可信性。

3.1 集中式数据统一处理

通常需要进行可信存证的数据多为具有法律效益或其他重要用途的文件,包括但不限于医疗行业的电子病历、健康档案、问诊记录、知情同意书,金融行业的证券基金交易,旅游行业的出游人信息、出游合同,家政行业的签约合同、服务照片,产权行业的版权证明、品牌保护、打假维权,等等。数据类型包括但不限于办公文件(doc、txt、 pdf、 ppt、xls、rtf)、图片(bmp、 jpg、 png、gif)、音频(wav、mp3、midi)、视频(avi、rmvb、mov、wmv)等。因此,这就涉及到了对不同文件格式数据的统一处理。

以太坊的区块链与索引是以Key-Value数据组织形式存储在内部的LevelDB数据库[5],如果直接将以太坊作为数据库来使用,这样可以保证数据从一个以太坊节点传送到另一个节点时,传送的数据、发送者、接收者和传送时间戳能够永久保存,且永久不可变。但是这种方式有明显的缺陷:一是无法处理不同文件格式的数据;二是无法提供查询功能;三是区块链作为数据库来使用效率很低,存储成本也很昂贵,系统吞吐率极低,单个确认写入所产生的延迟时间却足足有十几分钟,容量更是达到几十GB[11]。此外,随着节点数量的增加,工作量、延迟时间以及容量上都无法与传统关系数据库系统相比。

因此,本文考虑在基于智能合约进行存证之前,先对不同文件格式的数据进行集中式统一处理,利用传统数据库统一最小化数据,将数据的标识符散列存储至智能合约的存储区。这种方式能够最大限度地降低了区块链存证成本,提高了系统效率,既保证了数据永久抗干扰,又补充了以太坊存证的查询功能。

本文选用MongoDB数据库进行集中式数据统一处理。与其他分布式数据库相比,MongoDB具有文档型存储的优势,任何文件格式的数据都会以二进制的Json格式Bson存储[23],既解决了文件格式不同的问题,又能够最大限度上减少文件所占用的空间,提高数据传输效率,也便于后台服务器与前端的交互。对于文件存储驱动,本文选择的是GridFS,将上传的文件按照256kb的大小分割块,块集合存储于fs.chunks,文件元数据存储于fs.files。如图2所示的系统架构,原始文件经过MongoDB统一处理后会得到很多属性信息,例如表1给出的一个图片证据的处理结果,而需要存储进区块链中的数据仅为文件ID与MD5值,大幅地降低了存证成本,更易于访问和使用数据。

类似地,BigchainDB[24]项目也是使用MongoDB处理数据,但它的查询功能大部分直接使用MongoDB的API来完成,这种方式对黑客来说无疑是一种入侵通道。相比较而言,本文的数据查询功能依赖于智能合约,保证了系统的可信性与安全性。

3.2 认证数据分布式存储

以太坊的智能合约使网络在功能上类似计算平台,系统借助以太坊建立对等网络,合约一旦被共识节点执行,则以太坊中的节点都会遵循相应的规则,可以实现认证数据的分布式存储,同时确保存储可信性。具体地,认证数据分布式存储的步骤可以分为三步:以太坊账户的创建、智能合约的部署交易和智能合约的调用。

3.2.1 创建以太坊账户

对于以太坊集成开发环境(Integrated Development Environment, IDE),本文选择的是Geth(Go ethereum),它是以太坊基金会提供的运行以太坊节点的Go语言客户端程序[25],可与智能合约交互开发DAPP,扩展区块链功能。由2.2节可知以太坊具有外部账户和内部账户,这里的创建是指在以太坊客户端上创建外部账户,而内部账户的创建是通过智能合约的部署来实现。在Geth中本文设置gasLimit、Difficulty、Nonce等参数创建创世区块,在当前节点创建数据存放地址,ChainData存放区块信息,KeyStore存放当前节点下的所有账户文件,设置网络监听端口及用于区分不同网络的唯一标识ID后即可启动以太坊节点,通过personal.newAccount命令创建以太坊的外部账户。

3.2.2 部署智能合约

由2.2节可知,部署智能合约属于以太坊交易,由外部账户来部署,部署成功会返回合约地址与合约账户,实现合约账户的创建。具体地,部署智能合约在本文中包括以下4个步骤:步骤1 使用Solidity编写可信存证合约代码。本文在智能合约中使用一个非固定大小字符串类型的状态变量来声明进行过集中式统一处理的存证数据,声明存证函数用来存储变量值,输入为字符串变量,交易执行成功后返回交易哈希。再声明取证函数用来获取变量值,输出为存证函数的输入,返回区块中最新存储的数据。该合约允许所有人在合约中存储非固定大小的字符串,该数据可以被所有人访问,且没有可行的方法阻止用户发布。所有人也可以再次调用存证函数,传入不同的数据覆盖原字符串,但是之前的数据仍会存储在区块链的历史区块中,无法篡改或抹去。如果想添加访问限制,可以设置合约函数确保只有特定用户可以访问存证函数。

步骤2 编译智能合约。本文使用Remix在线编译器将智能合约编译为EVM字节码,获取合约二进制码和应用程序二进制接口(Application Binary Interface, ABI)。ABI描述了合约函数的调用签名和返回值,是智能合约进行交互的标准方法,包括区块链外部与合约之间的交互和以太坊已存在合约之间的交互。

步骤3 启动以太坊节点。

步骤4 部署智能合约。创建合约对象,声明EVM字节码,部署交易来创建合约账户。该笔交易包含了外部账户地址、智能合约内容、合约账户地址这三个关键信息,其中合约账户的生成是由部署者外部账户和发送的交易数作为随机数输入,通过Kecca-256加密算法创建产生的。外部账户交易会经历5个步骤,即设置矿工账户、解锁账户、发送交易、启动挖矿及查看账户,其中发送交易后交易池中会显示正在等待被打包的交易次数,矿工消耗一定Gas挖矿成功后生成一个新区块,交易信息存储在新区块中,字节码通过Geth的远程过程调用(Remote Precedure Call, RPC)发送至以太坊网络,经过全网验证后,写入到Geth管理的区块链中。

3.2.3 调用智能合约

智能合约的调用方法有三种,以本文合约的存证方法SetData为例,分别是:SetData.sendTransaction、SetData.call和SetData()。三种调用方法的区别在于:第一种会创建新交易,交易被打包后返回一个交易哈希值广播至网络中,会造成Gas的消耗;第二种方法本质是一个本地调用,不会向区块链网络广播任何消息,它的返回值取决于合约中函数的具体代码,不会消耗Gas;第三种是若合约函数的代码有constant标识,则执行call的本地调用操作,若没有constant标识,则执行sendTransaction操作。本文调用智能合约的方法使用的是第三种,且代码中没有设置constant标识,完整的部署与调用流程如图3所示。

由2.2节可知,调用智能合约时如果合约状态值发生了更改,那么该次调用事属于交易,需要矿工消耗Gas进行挖矿打包交易。在以太坊平台上声明智能合约ABI,获得合约实例,此时输入合约名称可返回在代码中定义的合约规则,调用SetData()方法,參数添加进行过集中式统一处理的存证数据,交易完成后将返回交易哈希值,用于后文定位区块及查询访问存证数据。

3.3 动态数据取证

本文提供两种查询取证方式:一是利用智能合约中定义的取证函数,返回最新存入区块的数据;二是借助智能合约的存储编码规则,遍历以太坊的区块信息和交易信息,逆向解码分析展示数据。

对于第一种取证方式,合约中声明的取证函数返回值是存证函数的输入,没有更改合约状态值,所以这种智能合约调用不属于交易,不会消耗Gas,在以太坊平台上调用取证函数即可获取到最新存入区块的数据,但是这种方式无法获取其他区块中的数据,因此本文提出第二种取证方式。

第二种取证方式基于以太坊内部的存储编码规则。由2.1节可知,以太坊计算Merkle根使用的是MPT,它是以太坊用来将Key-Value进行紧凑编码的一种数据组织形式,任何存储数据的细微变化都会导致MPT的根节点发生变更,因此可以校验数据的一致性。MPT包含3种节点类型[26],即叶子节点、扩展节点和分支节点。叶子节点用于数据的存储,其Key对应数据的16进制编码,Value存储的是数据的递归长度前缀(Recursive Length Prefix, RLP)编码[27];扩展节点处理具有共同前缀的数据,Key为共同前缀的16进制边,Value为扩展出的分支节点的哈希值;分支节点处理没有共同前缀的数据,Key为分叉节点哈希值数据,Value一般为空,否则为终止扩展节点的Value值。其中,RLP编码是以太坊中数据序列化的一个主要编码方式,可以将任意的嵌套二进制数据进行序列化,具有5个规则,如表2所示。

以太坊以Key-Value形式来存储数据,账户以哈希散列和RLP数据编码为基础,结合智能合约对数据对象进行映射和转换,将数据按照编码规则映射为MPT,所有节点的Key和Value构建为一个RLP列表,计算根节点唯一证明并保存于以太坊账户中。综上,以太坊采用如下5个编码规则来将智能合约数据结构映射为Key-Value形式:规则1 智能合约中所有数据结构都会被映射为Key-Value的形式,其中Key和Value均是无符号32字节的数据。

规则2 存储成员依照定义位置从零开始索引编排,每次累加数值一,作为对应的Key值存储。

规则3 对于固定长度的数据类型,例如enum、uint8、uint16、uint32等,Value值按照32字节右对齐的规律存储具体的成员属性值。如果长度不满足32字节,则将相邻的存储成员进行压缩合并存储Value值。

规则4 对于可变长度的数据类型,例如string、bytes等,Value值按照32字节左对齐的规律存储;

规则5 如果可变长度类型变量的数据长度大于31字节,则拆分为多条记录来存储,第一条记录的Key值为其索引编号,Value值为数据长度再累加1,数据内容按照32字节大小拆分为多条记录,每条记录的Key值为第一个Key值的SHA3哈希值再累加1,Value值对应拆分的数据内容。

基于上述编码规则,以太坊将智能合约的数据对象映射转换为Key-Value

形式封存在交易区块当中,能够标识区块中是否含有交易信息的字段是transaction.length,若不为0,则该区块存有交易,此时以区块信息中的交易哈希值为索引可获取区块体中的交易序列。区块体中的交易信息包含6个字段,分别是区块号、区块哈希值、交易哈希值、交易发送者、交易接收者以及Input字段。

Input字段包含合约的函数选择器与参数编码,记录了编码后的存证数据。Input的前4个字节指定了函数选择器,是合约函数的KECCAK256算法哈希值[28];接下来的32个字节为参数编码的第一个参数,表示非固定大小字符串的字节偏移量;再接着32个字节为参数编码的第二个参数,是存证数据的字符串长度的十六进制编码;参数编码的第三个参数所占字节是32的倍数,左对齐输出,若数据长度不足32字节的倍数,则在数据右边补0扩展到32字节的倍数。此时对Input字段参数编码的第三个参数进行ASCII解码获取到的就是该交易信息中存储的合约信息,即存证数据。

为辨别存有存证数据的区块,本文在与用户操作交互的应用层,采用B/S架构通过Node.js的Express框架将用户与以太坊可信存证系统相互连接,建立前后端交互,后端与Geth、MongoDB相连,前端循环遍历以表格形式输出当前以太坊节点中的所有区块信息,提供可交互式用户界面。对区块体的交易序列添加索引输出自前一区块之后发生的多笔交易。例如表3给出了一个图片证据存储在以太坊中的交易信息,该交易位于实验节点中第323个区块上,Input字段记录了经过集中式统一处理后得到的文件ID与MD5值。

解码得到的文件ID与MD5值后,通过MongoDB使用GridFS以file_id为索引查询文件,查询成功返回文件名称,再通过mongofiles的get命令下载文件到本地,完成对原始数据的还原。而以太坊中保存的MD5值可与数据库中存储的MD5值作比较,验证访问可信性,验证数据在存证前后的真实唯一、未篡改。

综上,本节实现了集中式数据统一处理、智能合约存证、以太坊取证及核证的过程,基于智能合约的可信存证相对于传统的关系数据库存证具有三大优势:1)分布式完整。传统数据库存证只是将电子数据以备份的形式存放在服务器上,传输过程中数据易破损、易断点、易篡改,而基于智能合约的可信存证采取区块链技术,数据全链条每个节点都有存证,保证了存证信息的完整性和真实性,实现了分布式存证服务。

2)不可篡改。传统数据库中的电子数据因服务器问题或机制不完全容易被篡改,而基于智能合约的可信存证在数据固定前采用哈希算法进行了校验值计算,数据固定过程中运用了时间戳机制、加密机制及分布式共识机制,数据一经存储,任何一方也无法篡改。

3)安全可信。传统数据库存证是第三方本地保存的电子数据,属于自证证据,数据的法律效力容易遭到质疑,而在以太坊平台上基于智能合约的可信存证适用于司法仲裁机构,数据全链条每个节点都有存证,数据安全可信,权威机构可直接从节点中获取验证证据,将存证数据视为直接证据,不需要第三方机构再出具证明。

4 可信性分析

本文在以太坊平台上基于智能合约进行可信存证,指出所有的数据及操作都被永久地记录在区块链数据区块供用户访问。这些存证数据所在的数据区块被同步存储在系统的每一个参与运算的节点中,所有这些节点构成了可信存证系统及其坚韧的分布式数据管理系统,任何一个节点上的数据被破坏可以通过同步节点或访问其他哈希节点来验证确认;同时,任何一个节点上如果数据区块被恶意篡改或删除,都不会影响整个可信存证系统的正常运转。因此,本文提出的基于智能合约的可信存证系统很好地解决了区块链上数据管理效率低延迟长的问题,丰富了数据处理、存证和取证功能,下面对系统的可信性进行分析。

4.1 处理可信性

处理可信性是指数据处理的正确性,系统需要保存数据的最终状态。在传统的数据库管理系统中,用户通过提交事务来处理数据,事务常由过程型语言与SQL语句组合共同构成,事务执行的过程或结果通过日志进行记录。区块链与传统数据库管理系统中的日志在逻辑功能上有所相似,但不同之处在于,比特币区块链仅支持挖矿与转账功能,功能上更倾向于数字货币的交易,对于数据的处理具有很大的局限性。

以太坊的智能合约提供了区块链中的数据处理功能,但如果直接将以太坊作为传统的数据库系统来处理数据,会有无法处理不同文件格式、无法提供查询功能及存储成本昂贵效率低下的缺陷。

因此,本文借助MongoDB数据库对存证数据进行集中式统一处理,将任意文件格式的数据分割为块,块集合存储于fs.chunks,文件元数据存储于fs.files,提取数据的ID和MD5值进行后续的分布式智能合约存储。MD5算法具有压缩性、容易计算、抗修改性、弱抗碰撞和强抗碰撞的特點,如果在分布式存储的过程中数据被某些人作了改动,那么得到的MD5值将有很大变化。此外,原始文件经过MD5加密后为32位的字符串,能够给定固定大小的空间存储、传输和验证,大幅地降低了存证成本,也提供了通道验证数据的完整性,确保系统的处理可信性。

4.2 存储可信性

存储可信性是指数据存储的正确性,即使系统在存储、通信过程中发生故障,甚至被恶意攻击时,只要数据处理结果被确认,存储的数据就不被篡改或者丢失。

以太坊平台整体上可划分为五个层次,依次为网络层、共识层、数据层、智能合约层和应用层[4]。在网络层,以太坊平台的网络传输协议为完全分布且可容忍单点故障的P2P协议,协议用于节点间传输交易数据和区块数据[5]。节点之间以扁平拓扑结构相互连通,不存在中心化节点,具有平等、自治、分布等特性。在数据传输过程中,当相邻节点监听到新交易和新区块时,节点首先会通过工作量证明共识机制或者数字签名哈希运算等来验证交易和区块的有效性,只有验证顺利通过,新交易才能被记录到正在构建的区块当中,随着新区块的成功构建,也就确保了数据的有效性与可信性。

在共识层,以太坊依赖于工作量证明机制来解决区块的容错一致问题。PoW机制能够保证全网数据的一致性和安全性,它依赖的是节点间的算力竞争,要求每个节点基于自身算力来求解SHA256运算,该运算是一个求解复杂但验证简单的计算难题,目的是寻找一个能够满足哈希结果小于区块设定的难度目标的随机数值[29]。任何一个节点上,如果有人想要恶意篡改某一数据区块,需要对该区块及其后续所有区块重新进行哈希运算,计算出合适的随机数,构建出一条比当前被公认的区块链主链更长的链,这个恶意过程所需要消耗的算力超过了整个区块链中正在进行正常挖矿运算的算力总和,因此恶意攻击的难度和成本很高。PoW机制融合了经济激励政策与共识算法,使得以太坊中更多的节点能够参与到挖矿运算当中,主动性的增强了平台的可靠性与安全性。

在数据层,以太坊中每个区块都包含区块体和区块头两个部分。区块体存放了当前区块的所有交易信息,区块头记录父区块哈希、时间戳、Merkle根等数据,其中父区块哈希构建了区块链以区块为单位的链式结构,保证了数据数据的不可篡改性,时间戳是该区块的生成时间,基于交易哈希生成的Merkle根确保了区块内交易数据的完整性与可信性。因此,区块链特殊的数据结构保证了所有区块以链相连、环环相扣,其中任何一个区块被篡改,都会引起该区块后面的所有区块的连环变化。

在智能合约层,以太坊实现了Casper共识[30]。从前所述,PoW牺牲性能来换取数据的一致性和安全性,针对PoW机制低效耗能的缺陷,以太坊平台引入权益证明(Proof-of-Stake, PoS)机制[30-31],根据矿工在区块链中拥有的股权来决定其挖矿的难度,当矿工拥有越多的以太币,越容易找到合适的随机数,挖矿的整体难度就会越低。以太坊又基于PoS机制提出Casper共识,要求节点必须先锁定保证金,才可以参与出块和共识形成,矿工使用保证金对共识结果进行下注,如果投注正确,则可以获得区块的记账权和经济奖励。Casper共识通过对保证金的直接控制来约束矿工的行为,具体来说,如果一个矿工做出了任何系统认为是无效甚至是恶意的行为,其预缴的保证金将会没收,同时也将失去出块和参与共识的权利。因此,共识机制的存在既提高了以太坊平台的性能,又保障了数据的一致性和安全性。

4.3 访问可信性

访问可信性是指数据存证后的可审计及可追溯。本文提供了两种访问方式:一是调用智能合约方法, 二是依据智能合约的编码规则对交易信息进行解码,两种方式都保证了数据被访问时的正确性。

在数据层,以太坊以Key-Value数据库存储索引数据与状态数据,使得系统可以通过哈希键值检索数据。这与传统数据库的预写式日志非常类似,区块数据按照日志文件格式存储,以追加形式写入,支持数据重放,维护了所有的历史操作记录。另外,Merkle树的结构维护一个区块内的事务之间的关系,以太坊区块数据具备了预写式日志不具备的不可篡改性和可追溯性。

在智能合约层,本文系统中的合约方法提供了查询操作,无需共识,也不会更改合约状态值,调用取证函数则就获取到最新存入区块的数据。此外,本文依据智能合约的编码规则还原数据的存储过程,基于区块哈希检索区块数据,又基于区块数据中的交易哈希检索交易数据,通过解码交易数据中的Input字段来还原存证数据。

在应用层,以太坊除了基于以太币的数字货币交易,还支持去中心化应用,本文基于Node.js语言构建Web前端应用界面,通过JSON-RPC请求对以太坊节点上的智能合约进行部署和调用,支持访问可信的区块数据、交易数据和状态数据,使应用程序拥有良好交互性的用户界面。

5 结语

本文区别于传统关系数据库存证,提出了一种在以太坊平台上基于智能合约的可信存证系统。存证后数据全链条每个节点都有存证,数据分布式完整、不可篡改、安全可信,适合应用于司法鉴定、审计、公证、仲裁等权威机构,可直接从运维的节点中获取和验证数据,把存证数据视为直接證据,不再需要第三方机构出具证明。

首先,因为区块链存储成本较大,为提高存证效率,节省计算费用,本文通过MongoDB的GridFS对数据进行集中式统一处理,提高系统的处理可信性;其次,通过部署和调用智能合约对认证数据进行分布式存储,确保系统的存储可信性;最后,通过两种动态数据取证方法提取文件ID与MD5值来进行数据核证,一是调用智能合约方法,二是根据以太坊数据编码规则逆向分析交易信息,保证系统的访问可信性。

在未来的工作中,本研究考虑在智能合约中增加访问限制,只有特定用户可以调用合约方法,但仍然允许任何人访问合约,确保可信存证系统的公开公正。

参考文献(References)

[1] NAKAMOTO S. Bitcoin: a peer-to-peer electronic cash system [EB/OL]. [2018-05-10]. http://www.academia.edu/download/54517945/Bitcoin_paper_Original_2.pdf.

[2] BUTERIN V. A next-generation smart contract and decentralized application platform [EB/OL]. [2018-05-10]. https://cryptorating.eu/whitepapers/Ethereum/Ethereum_white_paper.pdf.

[3] Etherscan. Ethereum unique address growth chart [EB/OL]. [2018-09-02]. https://etherscan.io/chart/address/.

[4] 钱卫宁, 邵奇峰, 朱燕超, 等.区块链与可信数据管理: 问题与方法[J]. 软件学报, 2018, 29(1): 150-159. (QIAN W N, SHAO Q F, ZHU Y C, et al. Research problems and methods in blockchain and trusted data management [J]. Journal of Software, 2018, 29(1): 150-159.)

[5] 袁勇, 王飛跃.区块链技术发展现状与展望[J]. 自动化学报, 2016, 42(4): 481-494. (YUAN Y, WANG F Y. Blockchain: the state of the art and future trends [J]. Acta Automatica Sinica, 2016, 42(4): 481-494.)

[6] TSCHORSCH F, SCHEUERMANN B. Bitcoin and beyond: a technical survey on decentralized digital currencies [J]. IEEE Communications Surveys & Tutorials, 2016, 18(3): 2084-2123.

[7] PASS R, SEEMAN L, SHELAT A. Analysis of the blockchain protocol in asynchronous networks [C]// Proceedings of the 2017 Annual International Conference on the Theory and Applications of Cryptographic Techniques. Berlin: Springer, 2017: 643-673.

[8] GERVAIS A, KARAME G O, WUST K, et al. On the security and performance of proof of work blockchains [C]// Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM, 2016: 3-16.

[9] ATZEI N, BARTOLETTI M, CIMOLI T. A survey of attacks on Ethereum smart contracts (SoK) [C]// Proceedings of the 2017 International Conference on Principles of Security and Trust. Berlin: Springer, 2017: 164-186.

[10] LIN I C, LIAO T C. A survey of blockchain security issues and challenges [J]. International Journal of Network Security, 2017, 19(5): 653-659.

[11] GARCIA-MOLINA H. Database Systems: the Complete Book [M]. New Delhi: Pearson Education India, 2008: 555-615.

[12] GRAY J, REUTER A. Transaction Processing: Concepts and Techniques [M]. Amsterdam: Elsevier, 1992: 22-40.

[13] TSENG L. Recent results on fault-tolerant consensus in message-passing networks [C]// Proceedings of the 2016 International Colloquium on Structural Information and Communication Complexity. Berlin: Springer, 2016: 92-108.

[14] LYNCH N A. Distributed Algorithms [M]. Amsterdam: Elsevier, 1996: 53-73.

[15] BAILIS P, FEKETE A, FRANKLIN M J, et al. Coordination avoidance in database systems [J]. Proceedings of the VLDB Endowment, 2014, 8(3): 185-196.

[16] ZHANG Y, WU S, JIN B, et al. A blockchain-based process provenance for cloud forensics [C]// Proceedings of the 2017 3rd IEEE International Conference on Computer and Communications. Piscataway, NJ: IEEE, 2017: 2470-2473.

[17] BAHGA A, MADISETTI V K. Blockchain platform for industrial Internet of things [J]. Journal of Software Engineering and Applications, 2016, 9(10): 533-546.

[18] VU Q H, LUPU M, OOI B C. Peer-to-Peer Computing: Principles and Applications [M]. Berlin: Springer, 2009: 229-277.

[19] CHENEY J, CHITICARIU L, TAN W C. Provenance in databases: why, how, and where [J]. Foundations and Trends in Databases, 2009, 1(4): 379-474.

[20] 邵奇峰, 金澈清, 张召, 等.区块链技术: 架构及进展[J]. 计算机学报, 2018, 41(5): 969-988. (SHAO Q F, JIN C Q, ZHANG Z, et al. Blockchain: architecture and research progress [J]. Chinese Journal of Computers, 2018, 41(5): 969-988.)

[21] MERKLE R C. A digital signature based on a conventional encryption function [C]// Proceedings of the 1987 Conference on the Theory and Application of Cryptographic Techniques. Berlin: Springer, 1987: 369-378.

[22] LUU L, CHU D H, OLICKEL H, et al. Making smart contracts smarter [C]// Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM, 2016: 254-269.

[23] MongoDB. What is MongoDB? [EB/OL]. [2018-09-05]. https://www.mongodb.com/what-is-mongodb/.

[24] BigchainDB. Meet BigchainDB, the blockchain database [EB/OL]. [2018-09-05]. https://www.bigchaindb.com/.

[25] Github. Go Ethereum [EB/OL]. [2018-08-08]. https://github.com/ethereum/go-ethereum/wiki/.

[26] BONNEAU J. EthIKS: using Ethereum to audit a CONIKS key transparency log [C]// Proceedings of the 2016 International Conference on Financial Cryptography and Data Security. Berlin: Springer, 2016: 95-105.

[27] Github. RLP encoding of Ethereum [EB/OL]. [2018-09-08]. https://github.com/ethereum/wiki/wiki/RLP/.

[28] BERTONI G, DAEMEN J, PEETERS M, et al. Keccak sponge function family main document [EB/OL]. [2018-05-10]. https://pdfs.semanticscholar.org/0978/de0c295f158cd5afe3a145a 2e1fe6497eec7.pdf.

[29] EYAL I, SIRER E G. Majority is not enough: bitcoin mining is vulnerable [J]. Communications of the ACM, 2018, 61(7): 95-102.

[30] 楊保华, 陈昌.区块链原理, 设计与应用[M]. 北京: 机械工业出版社, 2017: 93-97. (YANG B H, CHEN C. Principle, Programming and Applications of Blockchain[M]. Beijing: China Machine Press, 2017: 93-97.)

[31] 申屠青春.区块链开发指南[M]. 北京: 机械工业出版社, 2017: 109-146. (SHENTU Q C. Development Guide of Blockchain[M]. Beijing: China Machine Press, 2017: 109-146.)

猜你喜欢
智能合约区块链
农产品供应链金融信用体系框架设计
基于区块链技术的去中心化数字出版平台研究
区块链技术在互联网保险行业的应用探讨
智能合约的特点及其在债券市场的应用
保险企业的区块链技术应用方向选择研究
区块链技术在金融领域的应用与前景研究
区块链技术的应用价值分析
“区块链”的苟且、诗和远方
基于区块链技术的数字货币与传统货币辨析
区块链技术在会计中的应用展望