首页> 中国专利> 编程题目发布、解答代码发布、解答代码检验方法及系统

编程题目发布、解答代码发布、解答代码检验方法及系统

摘要

公开了一种编程题目发布、解答代码发布、解答代码检验方法及系统。任一IT机构的设备可以接入区块链网络称为节点。在区块链网络中,任一节点可以基于区块链协议,发布自身创设的编程题目,也就是说,任一节点可以基于自身创设的编程题目构建题目发布交易,然后把题目发布交易广播给其他节点。获得题目发布交易每个节点会基于各节点间的共识机制,将题目发布交易写入区块链。

著录项

  • 公开/公告号CN109345392A

    专利类型发明专利

  • 公开/公告日2019-02-15

    原文格式PDF

  • 申请/专利权人 阿里巴巴集团控股有限公司;

    申请/专利号CN201811260961.0

  • 发明设计人 杨达一;

    申请日2018-10-26

  • 分类号G06Q40/04(20120101);G06Q50/20(20120101);

  • 代理机构11415 北京博思佳知识产权代理有限公司;

  • 代理人林祥

  • 地址 英属开曼群岛大开曼资本大厦一座四层847号邮箱

  • 入库时间 2024-02-19 07:11:44

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-06-23

    授权

    授权

  • 2019-03-12

    实质审查的生效 IPC(主分类):G06Q40/04 申请日:20181026

    实质审查的生效

  • 2019-02-15

    公开

    公开

说明书

技术领域

本说明书实施例涉及信息技术领域,尤其涉及一种编程题目发布、解答代码发布、解答代码检验方法及系统。

背景技术

目前,国内外的诸多信息技术(Information Technology,IT)机构(如高等院校计算机学院、IT公司等)一般都会搭建自己的编程题库,用于测试用户(如在校学生、在职员工、面试者等)的编程水平。

在实践中,很多IT机构有共享彼此的编程题库的需求。然而,对于任一IT机构而言,如何防止其他IT机构擅自修改该IT机构创建的编程题目,是丞待解决的技术问题。

发明内容

为了解决任一IT机构共享给其他IT机构的编程题目容易被其他IT机构擅自修改的问题,本说明书实施例提供一种编程题目发布方法及系统。此外,本说明书实施例还提用了一种解答代码发布、解答代码检验方法及系统。

上述技术方案如下:

根据本说明书实施例的第1方面,提供一种基于区块链的编程题目发布方法,包括:

目标节点创设待发布的编程题目;所述目标节点为区块链网络中的任一节点;

所述目标节点基于题目相关数据,构建题目发布交易,并向所述区块链网络广播所述题目发布交易;所述题目相关数据包括所述编程题目;

针对获得所述题目发布交易的每个节点,该节点基于各节点之间的共识机制,将所述题目发布交易写入区块链。

根据本说明书实施例的第2方面,提供一种基于区块链的解答代码发布方法,包括:

目标节点获取编程题目;所述目标节点为区块链网络中的任一节点,所述编程题目是通过上述第1方面的方法发布的;

所述目标节点将所述编程题目提供给被测试用户进行解答,并接收所述被测试用户上传的解答代码;

所述目标节点基于解答相关数据,构建解答发布交易,并向所述区块链网络广播所述解答发布交易;所述解答相关数据包括所述编程题目的题目标识、所述解答代码与所述被测试用户的用户标识;

针对获得所述解答发布交易的每个节点,该节点基于各节点之间的共识机制,将所述解答发布交易写入区块链。

根据本说明书实施例的第3方面,提供一种基于区块链的解答代码检验方法,包括:

获取模块,获取编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识;所述编程题目是通过上述第1方面的方法发布的,所述解答代码是通过上述第2方面的方法发布的,所述检验节点是区块链网络中,存储有所述编程题目对应的解答检验数据的节点;

所述检验节点使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码;

若检验通过,则所述检验节点基于结果相关数据,构建结果发布交易,并向所述区块链网络广播所述结果发布交易;所述结果相关数据包括所述编程题目的题目标识与所述用户标识;

针对获得所述结果发布交易的每个节点,该节点基于各节点之间的共识机制,将所述结果发布交易写入区块链。

根据本说明书实施例的第4方面,提供一种基于区块链的编程题目发布系统,包括由多个节点组成的区块链网络;

任一节点,创设待发布的编程题目;基于题目相关数据,构建题目发布交易,并向所述区块链网络广播所述题目发布交易,所述题目相关数据包括所述编程题目;

获得所述题目发布交易的每个节点,基于各节点之间的共识机制,将所述题目发布交易写入区块链。

根据本说明书实施例的第5方面,提供一种基于区块链的解答代码发布系统,包括由多个节点组成的区块链网络;

任一节点,获取编程题目;所述目标节点为区块链网络中的任一节点,所述编程题目是通过上述第1方面的方法发布的;将所述编程题目提供给被测试用户进行解答,并接收所述被测试用户上传的解答代码;基于解答相关数据,构建解答发布交易,并向所述区块链网络广播所述解答发布交易;其中,所述解答相关数据包括所述编程题目的题目标识、所述解答代码与所述被测试用户的用户标识;

获得所述解答发布交易的每个节点,基于各节点之间的共识机制,将所述解答发布交易写入区块链。

根据本说明书实施例的第6方面,提供一种基于区块链的解答代码检验系统,包括由多个节点组成的区块链网络;

检验节点,获取编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识,所述编程题目是通过上述第1方面的方法发布的,所述解答代码是通过上述第2方面的方法发布的,所述检验节点是区块链网络中,存储有所述编程题目对应的解答检验数据的节点;使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码;若检验通过,则基于结果相关数据,构建结果发布交易,并向所述区块链网络广播所述结果发布交易;其中,所述结果相关数据包括所述编程题目的题目标识与所述用户标识;

获得所述结果发布交易的每个节点,基于各节点之间的共识机制,将所述结果发布交易写入区块链。

本说明书实施例所提供的技术方案,任一IT机构的设备可以接入区块链网络称为节点。在区块链网络中,任一节点可以基于区块链协议,发布自身创设的编程题目,也就是说,任一节点可以基于自身创设的编程题目构建题目发布交易,然后把题目发布交易广播给其他节点。获得题目发布交易每个节点会基于各节点间的共识机制,将题目发布交易写入区块链。如此,一方面,任一IT机构都可以将自身创设的编程题目共享给其他IT机构;另一方面,任一节点发布编程题目的流程受到区块链协议的制约,编程题目从被创设到被写入区块链的整个过程中,难以被篡改,编程题目被写入区块链之后,也是难以被篡改的。

此外,在本说明书实施例中,任一节点可以从各节点间共享的编程题目中抽取编程题目提供给被测试用户解答,以对所述被测试用户的编程水平进行测试。并且,被测试用户上传的解答代码也会被封装进解答发布交易写入到区块链进行公示。

还有,在本说明书实施例中,针对任一节点,如果该节点存储有某个编程题目对应的解答检验数据,那么,该节点还可以对被测试用户针对该编程题目给出的解答代码进行检验,以判断被测试用户是否通过测试。并且,如果被测试用户通过测试,则该节点也会构建结果发布交易并广播,以便将被测试用户通过测试的消息写入区块链进行公示。

可见,本发明实际上提供了一种基于区块链的编程水平测试方案,囊括了编程题目发布、解答代码发布以及解答代码检验等阶段,将IT机构创设的编程题目、被测试用户针对编程题目的解答记录以及被测试用户通过测试的结果都写入区块链进行公示,使得整个编程水平测试过程公开透明。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书实施例。

此外,本说明书实施例中的任一实施例并不需要达到上述的全部效果。

附图说明

为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1是本说明书实施例提供的一种基于区块链的编程题目发布方法的流程示意图;

图2是本说明书实施例提供的一种基于区块链的解答代码发布方法的流程示意图;

图3是本说明书实施例提供的一种基于区块链的解答代码检验方法的流程示意图;

图4是本说明书实施例提供的一种并行化的执行区块链交易的方法的流程示意图;

图5是现有技术中串行化的交易执行方式示意图;

图6是本说明书实施例提供的并行化的交易执行方式示意图;

图7本说明书实施例还对应提供了一种基于区块链的编程题目发布装置的结构示意图;

图8本说明书实施例还对应提供了一种基于区块链的解答代码发布装置的结构示意图;

图9本说明书实施例还对应提供了一种基于区块链的解答代码检验装置的结构示意图;

图10是本说明书实施例提供的一种基于区块链的编程水平测试系统的流程示意图;

图11是用于配置本说明书实施例方法的一种计算机设备的结构示意图。

具体实施方式

此处先对本发明所应用的业务场景(即编程水平测试)进行更为详细的说明。以信息技术公司A为例,倘若公司A想要了解某个用户(如员工、面试者)的编程水平,那么,公司A可以从自己的编程题库中抽取任一编程题目提供给该用户。该用户根据该编程题目进行作答,给出解答该编程题目的解答代码,并将解答代码上传给公司A的在线判题系统。公司A的在线判题系统存储有上述编程题库中每个编程题目对应的解答检验数据(具体是标准输入数据与标准输出数据),用于验证解答代码的正确性。具体地,公司A的在线判题系统会将该编程题目对应的标准输入数据输入到解答代码并运行解答代码,然后,判断解答代码是否能够输出该编程题目对应的标准输出数据,若是,则认定该用户通过测试,否则,认定该用户未通过测试。

实践中,很多IT机构有共享彼此的编程题库的需求。为此,现有技术中,针对任一IT机构,该IT机构一般会采用爬虫程序从其他IT机构的编程题库爬取编程题目,将爬取的编程题目提供给被测试用户进行解答。然后,该IT机构还需要将被测试用户给出的解答代码发送给创设该编程题目的IT机构的在线判题系统进行检验。

然而,这种方式存在如下弊端:

1、IT机构通过爬虫程序爬取其他IT机构的编程题目后,有时会擅自对编程题目进行一些不恰当的修改,这一方面不能很好的保护创设编程题目的IT机构的权益,另一方面,被测试用户针对修改后的编程题目给出的解答代码往往与修改前的编程题目并不匹配,而在线判题系统是使用适配于修改前的编程题目的解答检验数据来测试代码是否正确的,如此,导致测试结果不能准确反映被测试用户的编程水平。

2、一旦其他IT机构的数据库不可访问,该IT机构就无法通过爬虫程序爬取其他结构的编程题目。也就是说,这种共享编程题目的方式并不总是有效的。

为此,在本说明书实施例中,任一IT机构可以借助于区块链协议,将自己创设的编程题目发布到区块链中,相当于既将自己创设的编程题目共享给其他IT机构,又无需担心其他IT机构会对该编程题目进行修改。

为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。

以下结合附图,详细说明本说明书各实施例提供的技术方案。

图1是本说明书实施例提供的一种基于区块链的编程题目发布方法的流程示意图,包括以下步骤:

S100:目标节点创设待发布的编程题目。

在本说明书实施例中,各IT机构的设备可以接入区块链网络,成为区块链网络中的节点。也就是说,区块链网络中的各节点与想要彼此共享编程题目的各IT机构一一对应。

在步骤S100中,所述目标节点可以是区块链网络中的任一节点。也就是说,任一IT机构的设备都可以通过图1所示的方法,创设编程题目并发布。

需要说明的是,目标节点创设编程题目,具体可以是目标节点接收控制所述目标节点的IT机构上传的编程题目,也可以是目标节点根据预设的编程题目创设模型,自动创设编程题目。

S102:所述目标节点基于题目相关数据,构建题目发布交易。

需要说明的是,本文中所述的交易(transaction),是指区块链协议中指定的数据结构。在区块链协议中,交易是指节点通过安装的区块链客户端创建,并需要最终写入区块链的一笔数据。也就是说,根据区块链协议,凡是需要写入区块链进行公示的数据,都需要被封装成交易这种数据结构。

在步骤S102中,所述题目相关数据至少包括目标节点在步骤S100中创设的编程题目。所述目标节点基于所述题目相关数据构建题目发布交易,实际上是将所述题目相关数据封装进交易这一区块链协议指定的数据结构。

S104:所述目标节点向所述区块链网络广播所述题目发布交易。

在步骤S104中,目标节点向区块链网络广播所述题目发布交易,实际上是将所述题目发布交易广播给其他节点,相当于将所述编程题目,分享给其他节点。

S106:针对获得所述题目发布交易的每个节点,该节点基于各节点之间的共识机制,将所述题目发布交易写入区块链。

针对获得所述题目发布交易的每个节点,该节点在将所述题目发布交易写入区块链之前,可以针对所述题目发布交易进行合法性验证。

针对所述题目发布交易进行合法性验证的事项可以根据业务需要指定。例如,假设并不是每个节点都有发布编程题目的权限,那么,可以所述题目发布交易中的节点标识,判断所述节点标识对应的节点(即目标节点)是否具有发布编程题目的权限,如果没有权限,就拒绝将所述题目发布交易写入区块链。

在步骤S106中,各节点之间的共识机制确保了各节点每次向区块链写入的数据的一致性。因此,哪怕某个节点擅自对题目发布交易中封装的编程题目进行修改,从而改变所述题目发布交易的内容,修改后的题目发布交易也不会被大多数节点写入区块链。

如此,目标节点创设的编程题目总是可以不经修改地被写入区块链,从而完成编程题目的分享。并且,区块链的分布式存储特性,写入区块链之后的题目发布交易也是难以被篡改的。

需要说明的是,针对后文中将要出现的解答发布交易、结果发布交易,基于同样的原因,这些交易的内容也难以被篡改。

通过图1所示的方法,任一IT机构的设备可以接入区块链网络称为节点。在区块链网络中,任一节点可以基于区块链协议,发布自身创设的编程题目,也就是说,任一节点可以基于自身创设的编程题目构建题目发布交易,然后把题目发布交易广播给其他节点。获得题目发布交易每个节点会基于各节点间的共识机制,将题目发布交易写入区块链。如此,一方面,任一IT机构都可以将自身创设的编程题目共享给其他IT机构;另一方面,任一节点发布编程题目的流程受到区块链协议的制约,编程题目从被创设到被写入区块链的整个过程中,难以被篡改,编程题目被写入区块链之后,也是难以被篡改的。

此外,在本说明书实施例中,所述题目相关数据还可以包括目标节点的节点标识。这意味着,目标节点也会将自身的节点标识封装进题目发布交易,进而写入区块链中进行公示。如此,可以明确共享给各IT机构的每个编程题目的创设者,保护创设编程题目的IT机构的权益。

另外,在实际应用中,由于区块链这种数据存储方式较为复杂,节点当想要从写入区块链的编程题目中调取某个编程题目时,操作较为复杂。

为此,在本说明书实施例中,针对获得所述题目发布交易的每个节点,该节点可以在创建题目存储地址,并将所述题目相关数据存入所述题目存储地址。这相当于还将编程题目以简单的存储方式进行存储。需要说明的是,针对任一题目发布交易,可以根据写入区块链的该题目发布交易,验证存入题目存储地址的编程题目是否被篡改。通过上述方式,节点当想要调取某个编程题目时,可以较为便捷。

进一步地,节点具体可以将封装有所述题目相关数据的题目智能合约存入所述题目存储地址。这种情况下,所述题目存储地址实际上是所述题目智能合约的合约标识。

智能合约是很多区块链协议(如以太坊)天然支持的数据结构,并且,很多区块链协议也天然支持智能合约的快速调用。因此,可以以智能合约这种数据结构,对编程题目进行存储,方便后续通过调用智能合约的形式,快速调取编程题目进行编程水平测试。

根据图1所示的编程题目发布方法,本说明书实施例进一步提供了一种基于区块链的解答代码发布方法,如图2所示,包括以下步骤:

S200:目标节点获取编程题目。

所述目标节点是区块链网络中的任一节点。在实际应用中,任一IT机构想要对被测试用户的编程水平进行测试时,可以触发自身控制的目标节点获取编程题目。目标节点获取的编程题目是基于图1所示的编程题目发布方法发布的。

具体地,目标节点可以从区块链中的任一题目发布交易中读取编程题目。

或者,如果所述题目发布交易所封装的题目相关数据也被存入了某个题目存储地址,那么,目标节点也可以从该题目存储地址获取所述编程题目。当采用这种方式获取编程题目时,较为快捷。

进一步地,如果所述题目相关数据是以智能合约的形式(即题目智能合约)存入该题目存储地址的,所述目标节点可以调用该题目智能合约,从而获取到所述编程题目。

S202:所述目标节点将所述编程题目提供给被测试用户进行解答,并接收所述被测试用户上传的解答代码。

S204:所述目标节点基于解答相关数据,构建解答发布交易。

在本说明书实施例中,所述解答相关数据至少包括所述编程题目的题目标识、所述解答代码与所述被测试用户的用户标识。

其中,若所述目标节点从区块链中的任一题目发布交易中读取编程题目,则所述编程题目的题目标识为所述题目发布交易的交易哈希;若所述目标节点从任一题目存储地址获取编程题目,则所述编程题目的题目标识为所述存储地址。

进一步地,所述目标节点可以对所述解答代码是否存在编译或运行问题进行检查,如果检查通过,才会构建解答发布交易,如果检查不通过,则拒绝构建解答发布交易。

S206:所述目标节点向所述区块链网络广播所述解答发布交易。

S208:针对获得所述解答发布交易的每个节点,该节点基于各节点之间的共识机制,将所述解答发布交易写入区块链。

针对获得所述解答发布交易的每个节点,该节点在将所述解答发布交易写入区块链之前,可以针对所述解答发布交易进行合法性验证。

针对所述解答发布交易进行合法性验证的事项可以根据业务需要指定。例如,假设预先规定有解答代码的格式,那么,可以对所述解答发布交易中的解答代码的格式进行验证,如果格式不符合要求,就拒绝将所述解答发布交易写入区块链。

在步骤S208中,相当于将被测试用户的身份信息、被测试用户所解答的编程题目的标识信息、被测试用户给出的解答代码公示给每个节点。

此外,为了方便节点可以快速调取被测试用户的解答代码进行检验,在本说明书实施例中,每个节点还可以创建解答存储地址,并将所述解答相关数据存入所述解答存储地址。

进一步地,每个节点可以将封装有所述解答相关数据的解答智能合约存入所述解答存储地址。

根据图1所示的编程题目发布方法与图2所示的解答代码发布方法,本说明书实施例进一步提供了一种基于区块链的解答代码检验方法,如图3所示,包括以下步骤:

S300:检验节点获取编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识。

在本说明书实施例中,所述检验节点存储有所述编程题目对应的解答检验数据的节点。所述解答检验数据是用于对解答所述编程题目所给出的解答代码的正确性进行检验的数据。如前文所述,所述解答检验数据一般包括标准输入数据与标准输出数据。

所述检验节点一般是创设所述编程题目的节点。当然,创设所述编程题目的节点也可以将所述编程题目对应的解答检验数据分发给至少一个其他节点。这样,所述检验节点也可以是除创设所述编程题目的节点之外,存储有所述解答检验数据的其他节点。

在本说明书实施例中,检验节点可以根据存储的任一解答检验数据,确定该解答检验数据对应的题目标识。然后,从区块链中的查询出包含所述题目标识的解答发布交易,并从所述解答发布交易中读取解答代码与用户标识。

进一步地,检验节点也可以查询存储有所述题目标识的解答存储地址,并从所述解答存储地址获取解答代码与用户标识。

更进一步地,检验节点可以查询封装有所述题目标识的题目智能合约,并调用所述题目智能合约,从而获取到相应的解答代码与用户标识。

S302:所述检验节点使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码。

S304:若检验通过,则所述检验节点基于结果相关数据,构建结果发布交易。

在本说明书实施例中,检验节点如果对所述解答代码检验通过,则可以将检验通过的消息公示于区块链。这种情况下,所述结果相关数据实际上包括所述编程题目的题目标识与所述用户标识,所述结果发布交易的含义为,举例来说,“用户张三答对了题目1”。

进一步地,检验节点如果对所述解答代码检验未通过,则也可以将检验未通过的消息公示于区块链。这种情况下,所述结果发布交易的含义既可以是检验通过,也可以是检验未通过。为了进行区分,所述结果相关数据还需要包括检验通过结果或检验未通过结果。

S306:向所述区块链网络广播所述结果发布交易。

S308:针对获得所述结果发布交易的每个节点,该节点基于各节点之间的共识机制,将所述结果发布交易写入区块链。

针对获得所述结果发布交易的每个节点,该节点在将所述题目发布交易写入区块链之前,可以针对所述结果发布交易进行合法性验证。

针对所述结果发布交易进行合法性验证的事项可以根据业务需要指定。例如,假设只有创设所述编程题目的节点才有权限检验所述编程题目对应的解答代码,那么,可以判断广播所述结果发布交易的检验节点是否有检验权限,如果没有权限,就拒绝将所述结果发布交易写入区块链。

在步骤S308中,相当于将被测试用户的身份信息、被测试用户所解答的编程题目的标识信息、被测试用户是否通过测试的结果公示给每个节点。

此外,为了方便节点可以快速调取被测试用户的测试结果进行查阅,在本说明书实施例中,每个节点还可以创建结果存储地址,并将所述结果相关数据存入所述结果存储地址。

进一步地,每个节点可以将封装有所述结果相关数据的结果智能合约存入所述结果存储地址。

另外,在实践中,所述被测试用户可能会解答不止一个编程题目,上传不止一个解答代码。这种情况下,针对每个节点,该节点可以将所述被测试用户解答多个编程题目的结果都存入同一个结果存储地址,方便统计与查阅。

具体地,在本说明书实施例中,针对获得所述结果发布交易的每个节点,该节点若获得与所述结果发布交易相关联的其他结果发布交易,则基于各节点之间的共识机制,将所述其他结果发布交易写入区块链,其中,所述其他结果发布交易是基于所述用户标识与其他题目标识构建的。然后,该节点根据所述其他结果发布交易,将所述其他题目标识存入所述结果存储地址。

也就是说,所述结果发布交易可以视为所述被测试用户解答的第一个编程题目所产生的,而其他结果发布交易可以视为所述被测试用户后续解答的其他编程题目所产生的。对于所述被测试用户后续解答的其他编程题目的结果,无需重新创建结果存储地址进行存储,而是直接将其存入之前创建的结果存储地址即可。

如此,每个被测试用户都有唯一对应于自己的结果存储地址,用于记录自己的答题情况。

另外需要说明的是,在图1所示的方法中,可能存在不止一个检验节点检验所述解题代码的情况。这种情况下,针对每个检验节点,该检验节点获取编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识;然后使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码;若对所述解答代码检验通过,则基于结果相关数据,构建结果发布交易,并向所述区块链网络广播所述结果发布交易。

基于此,针对每个节点,该节点可以当确定获得的结果发布交易的数量为指定数量时,才会基于各节点之间的共识机制,将获得的任一结果发布交易写入区块链。其中,所述指定数量不大于检验节点的数量。

另外,在本说明书实施例中,存在三种类型的交易,即题目发布交易、解答发布交易以及结果发布交易。其中,针对任一种交易,创建存储地址并存入该种交易所封装的相关数据,可以视为对该种交易的执行操作。

显然,不论针对上述哪种交易,执行该种交易产生的执行结果,仅仅会对一个存储地址产生影响。因此,本说明书实施例中的三种类型的交易,都适合采用下文给出的并行化的交易执行方式进行执行。下文将对这种并行化的交易执行方式进行介绍说明。

对于常见的区块链应用场景而言,当需要进行各节点间的共识时,各节点会基于共识算法选举出有权限将若干待执行的交易打包成区块的节点,即记账节点。在共识之后,记账节点从缓存中捞取若干待执行的交易打包成区块,并将所述区块广播给其他节点。随后,针对每个节点,该节点一方面会按照所述区块中各交易被发起的先后顺序,由先到后依次执行每个交易,另一方面会将所述区块写入区块链。

通常,将节点由先到后逐个执行区块中的每个交易的方式称为串行化的交易执行方式。之所以要采用这种串行化的交易执行方式,是因为在常见的区块链应用场景下,一笔交易的执行有时会对不止一个存储地址上存储的信息进行更新,如果不采用串行化的交易执行方式,则容易出现有的交易执行失败的情况。

但是,在有的区块链应用场景下,不存在会对不止一个存储地址上存储的信息进行更新的交易。在这些区块链应用场景下,采用上述的串行化的交易执行方式,会导致交易执行效率较低。

下面,以以太坊这种区块链协议为例,对采用串行化的交易执行方式的原因进行详细说明。值得强调的是,在除以太坊之外的其他区块链协议中,采用串行化的交易执行方式的原因也是类似的。

在以太坊中,存在外部账户与合约账户之分。外部账户用于存储用户拥有的以太币余额,外部账户本质上是存储有余额信息的存储地址。合约账户用于存储用户创设的智能合约,合约账户本质上是存储有智能合约代码的存储地址。

在以太坊中,一般有两种类型的交易,即外部账户向其他账户(可以是外部账户也可以是合约账户)的转账交易,以及外部账户创建合约账户的合约创建交易。

转账交易的执行一般会对不止一个存储地址上存储的信息进行更新。具体而言,一笔转账交易的执行,通常会改变两个账户的余额(即两个账户地址上存储的余额信息),即从转账账户的余额中扣除转账金额,向收账账户的余额中增加转账金额。一笔转账交易可执行的前提是转账账户的余额不小于转账金额。

实际应用中,某一笔转账交易(记为转账交易A)中的转账账户,有可能是之前的另一笔转账交易(记为转账交易B)中的收账用户。如果不按照交易被发起的顺序由先到后执行交易,那么可能出现如下情况,即转账交易B未执行,导致转账交易A中的转账账户没有充足的余额进行转账。正是因为这样,凡是涉及转账交易的区块链应用场景,都不得不采用串行化的交易执行方式,以保证交易可以顺利执行。

而合约创建交易的执行实际上是创建一个合约账户,即创设一个存储地址,并将智能合约代码存入创设的存储地址。显然,合约创建交易的执行只会影响一个存储地址。

此外,区块链应用场景是多种多样的,在有的区块链应用场景下,可以基于以太坊进行扩展,开发出新类型的交易,这种交易的执行也可能只会影响一个存储地址。例如,利用区块链进行内容存证。一笔存证交易的执行,本质上是创设一个存储地址,将要存证的内容存入创设的存储地址。

基于以上,本文提出了一种并行化执行区块链交易的方法,专门针对某一类区块链应用场景,在这类区块链场景下,每笔交易的执行结果只会影响一个存储地址。

图4是本说明书实施例提供的一种并行化执行区块链交易的方法的流程示意图,包括以下步骤:

S400:针对区块链网络中的每个节点,该节点获取待写入区块。

在本说明书实施例中,所述待写入区块实际上各节点共识之后,由记账节点打包成的区块。记账节点会将所述待写入区块广播给其他节点。众所周知,在区块链协议中,每个节点一方面需要执行待写入区块中的每个交易,另一方面需要将待写入区块写入到区块链中进行公示。所述待写入区块一旦写入区块链中,相当于将待写入区块中的每个交易进行了公示。公示于区块链上的交易可以用来核查相应的交易执行结果是否正确,以防止有节点作恶。

在步骤S400中,针对每个节点,如果该节点是记账节点,那么该节点获取所述待写入区块的方式具体可以是从自身的缓存中捞取若干交易打包成所述待写入区块;如果该节点不是记账节点,那么该节点获取所述待写入区块的方式具体可以是接收记账节点广播的所述待写入区块。

值得强调的是,针对所述待写入区块中的每个交易,该交易的执行结果为,创设一个存储地址并存入信息,或更新一个存储地址上存储的信息(向一个存储地址存入信息或修改一个存储地址上存储的信息)。也就是说,所述待写入区块中的每个交易的执行结果,只会对一个存储地址产生影响。

例如,创建合约账户的合约创建交易,就是执行结果为创设一个存储地址并存入信息的交易。前文提及的题目发布交易与解答发布交易,也是执行结果为创设一个存储地址并存入信息的交易。

又如,在有些区块链应用场景下,需要对每个用户的购物记录进行存证。那么,就需要在数据库中创设每个用户对应的记录存储地址。当目标用户进行购物时,就会产生一条购物记录,区块链网络中的任一节点会基于该购物记录构建记录存证交易并广播。然后,针对每个节点,该节点会在合适的时机(即该记录存证交易被打包进待写入模块并广播给各节点时)执行该记录存证交易,即将该购物记录存入目标用户对应的记录存储地址。显然,目标用户进行多次购物所产生的多条购物记录都会被存入目标用户对应的记录存储地址。因此,上述的记录存证交易,就是执行结果为更新一个存储地址上存储的信息交易。

前文提及的结果发布交易,也是执行结果为更新一个存储地址上存储的信息交易。

S402:从所述待写入区块中读取各交易,并将各交易组织成N个交易队列。

在现有技术中,每个节点通常采用串行化的交易执行方式来执行所述待写入区块中的各交易。如图5所示,所谓串行化的交易执行方式,是指每个节点按照一定的先手顺序,逐个执行所述待写入区块中的每个交易。

而在本说明书实施例中,会将所述待写入区块中的各交易拆分为N组,其中,N为大于1的自然数。然后,针对每个组,将这个组中的交易排列成一个交易队列。本说明书对每个交易队列中交易的排列顺序不做具体限定。

S404:同时针对每个交易队列,由先到后依次执行该交易队列中的每个交易。

在步骤S404中,实际上是同时开始并行化的针对每个交易队列进行交易执行。而具体到每个交易队列,实际上是串行化执行该交易队列中的每个交易。如图6所示。

所谓“同时”,是指节点在同一时间开始执行每个交易队列中的交易。相当于节点在同一时间创设了N个交易执行进程,每个交易进程负责执行一个交易队列中的交易。

对比图5和图6的两种交易执行方式,显然,采用图6所示的交易执行方式,可以在单位时间内执行更多的交易。

S406:将所述待写入区块写入区块链。

在本说明书实施例中,针对每个节点,可以在执行步骤S404之后,执行步骤S406;也可以不在执行步骤S404之后才执行步骤S406。

通过图4所示的并行化执行区块链交易的方法,如果待写入区块中的每个交易皆不是对不止一个存储地址上存储的信息进行更新的交易,那么,区块链网络中的每个节点可以将待写入区块中的各交易组织成至少两个交易队列,然后,同时开始执行每个交易队列中的交易。如此,每个节点可以在单位时间内执行更多数量的交易,提升了交易执行效率。

此外,在本说明书实施例中,每个交易队列对应的交易数量(即每个交易队列中的交易的数量)可以比较接近。如此,在并行化的同时针对各交易队列进行交易执行时,每个执行进程所执行的交易的数量比较接近,不会出现有的进程闲置,有的进程负荷过重的情况。这也意味着,节点可以在单位时间内,执行尽可能多的交易。

具体地,可以设置基于每个交易队列对应的交易数量计算得到的方差不大于指定阈值。基于每个交易队列对应的交易数量计算得到的方差越小,各交易队列对应的交易数量就越接近。

另外,在本说明书实施例中,具体可以采用以太坊协议构建区块链网络。在以太坊中,每个节点上安装有虚拟机程序,用于为以太坊协议的实现提供运行环境。

通常,一个虚拟机程序用于执行一个区块链进程。而在本说明书实施例中,由于需要同时针对不止一个交易队列,并行化的执行不止一个区块链进程,因此,需要在每个节点上预先部署不止一个虚拟机程序。

具体地,如果需要将待写入区块中的交易组织成N个交易队列,那么,就需要预先在每个节点上部署N个虚拟机程序。

如此,在步骤S404中,可以建立预先部署的N个虚拟机程序与N个交易队列之间的一一对应关系;同时针对每个交易队列,通过该交易队列对应的虚拟机程序,由先到后依次执行该交易队列中的每个交易。

此外,在本说明书实施例中,通常,待写入区块中的交易既有第一类交易,也有第二类交易。其中,第一类交易是指,执行结果为更新一个存储地址上存储的信息的交易;第二类交易是指,执行结果为创设一个存储地址并存入信息的交易。

显然,待写入区块中可能存在不止一个第一类交易会对同一个存储地址上存储的信息进行更新。而节点在执行每个第一类交易时,往往需要先访问当前所执行的第一类交易所针对的存储地址。这种情况下,节点在执行待写入区块中的交易时,如果能对同一存储地址对应的所有第一类交易进行集中批量执行,那么只需要针对同一个存储地址进行一次访问即可,这会显著提升节点执行交易的速度。

具体地,在步骤S402中,可以从各交易中选择出执行结果为更新一个存储地址上存储的信息的交易,作为第一类交易,以及,将各交易中除第一类交易以外的其他交易作为第二类交易;将各第一类交易中,对应的存储地址相同的第一类交易组织成一个交易子队列;以每个交易子队列为一个处理单位,并且,以每个第二类交易视为一个处理单位;将各处理单位组织成N个交易队列。

如此,所述待写入区块中,对应于任一存储地址的全部第一类交易都会被整合一个交易子队列,该交易子队列会被整体放入到某个交易队列中。节点在针对该交易队列进行交易执行时,一旦访问该存储地址,就会连续执行该存储地址对应的全部第一类交易。

进一步地,将各处理单位组织成N个交易队列,可以如下:

根据每个处理单位对应的交易数量,由大到小对各处理单位进行排序;并且,初始化每个交易队列对应的交易数量为0;根据排序结果,选择第一个处理单位;将当前选择的处理单位添加到最小交易队列的队尾,并更新所述最小交易队列对应的交易数量;最小交易队列是当前对应的交易数量最小的交易队列;继续选择下一个处理单位,直至所有处理单位都被添加到交易队列。

通过这种方式,可以使得各交易队列分别对应的交易数量大体相当。这样,在基于各交易队列进行并行化的交易执行时,各执行进程上的工作负荷也大体相当,不会有某个执行进程闲置的情况出现,这样可以在单位时间内执行最多的交易,显著提升节点的交易执行效率。

基于图1所示的方法,本说明书实施例还对应提供了一种基于区块链的编程题目发布装置,如图7所示,所述装置为区块链网络中的任一节点,所述装置包括:

创设模块701,创设待发布的编程题目;

构建广播模块702,基于题目相关数据,构建题目发布交易,并向所述区块链网络广播所述题目发布交易;所述题目相关数据包括所述编程题目,以使获得所述题目发布交易的每个节点基于各节点之间的共识机制,将所述题目发布交易写入区块链。

基于图2所示的方法,本说明书实施例还对应提供了一种基于区块链的解答代码发布装置,如图8所示,所述装置为区块链网络中的任一节点,所述装置包括:

获取模块801,获取编程题目;所述编程题目是通过权利要求1~4任一项所述的方法发布的;

解答模块802,将所述编程题目提供给被测试用户进行解答,并接收所述被测试用户上传的解答代码;

构建广播模块803,基于解答相关数据,构建解答发布交易,并向所述区块链网络广播所述解答发布交易,以使获得所述解答发布交易的每个节点基于各节点之间的共识机制,将所述解答发布交易写入区块链;

其中,所述解答相关数据包括所述编程题目的题目标识、所述解答代码与所述被测试用户的用户标识。

基于图2所示的方法,本说明书实施例还对应提供了一种基于区块链的解答代码检验装置,如图9所示,所述装置是区块链网络中,存储有编程题目对应的解答检验数据的节点,所述装置包括:

获取模块901,获取所述编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识;所述编程题目是通过图1所示的方法发布的,所述解答代码是通过图2所示的方法发布的;

检验模块902,使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码;

构建广播模块903,若检验通过,则基于结果相关数据,构建结果发布交易,并向所述区块链网络广播所述结果发布交易,以使获得所述结果发布交易的每个节点基于各节点之间的共识机制,将所述结果发布交易写入区块链;

其中,所述结果相关数据包括所述编程题目的题目标识与所述用户标识。

基于图1所示的方法,本说明书实施例还对应提供了一种基于区块链的编程题目发布系统,包括由多个节点组成的区块链网络;

任一节点,创设待发布的编程题目;基于题目相关数据,构建题目发布交易,并向所述区块链网络广播所述题目发布交易,所述题目相关数据包括所述编程题目;

获得所述题目发布交易的每个节点,基于各节点之间的共识机制,将所述题目发布交易写入区块链。

基于图2所示的方法,本说明书实施例还对应提供了一种基于区块链的解答代码发布系统,包括由多个节点组成的区块链网络;

任一节点,获取编程题目;所述目标节点为区块链网络中的任一节点,所述编程题目是根据图1所示的方法发布的;将所述编程题目提供给被测试用户进行解答,并接收所述被测试用户上传的解答代码;基于解答相关数据,构建解答发布交易,并向所述区块链网络广播所述解答发布交易;其中,所述解答相关数据包括所述编程题目的题目标识、所述解答代码与所述被测试用户的用户标识;

获得所述解答发布交易的每个节点,基于各节点之间的共识机制,将所述解答发布交易写入区块链。

基于图3所示的方法,本说明书实施例还对应提供了一种基于区块链的解答代码检验系统,包括由多个节点组成的区块链网络;

检验节点,获取编程题目对应的解答代码与上传所述解答代码的被测试用户的用户标识,所述编程题目是根据图1所示的方法发布的,所述解答代码是根据图2所示的方法发布的,所述检验节点是区块链网络中,存储有所述编程题目对应的解答检验数据的节点;使用存储的对应于所述编程题目的解答检验数据,检验所述解答代码;若检验通过,则基于结果相关数据,构建结果发布交易,并向所述区块链网络广播所述结果发布交易;其中,所述结果相关数据包括所述编程题目的题目标识与所述用户标识;

获得所述结果发布交易的每个节点,基于各节点之间的共识机制,将所述结果发布交易写入区块链。

图10是本说明书实施例提供的一种基于区块链的编程水平测试系统的结构示意图。图10所示的系统,具体可以用于实现基于区块链的编程题目发布系统、解答代码发布系统、解答代码检验系统。

本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现图1或图2或图3所示方法的功能。

图11示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。

处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。

存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。

输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。

通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。

总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。

需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。

本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现图1和/或图4所示方法的功能。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。

上述实施例阐明的系统、方法、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置和设备实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的方法实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号