一种基于区块链的项目代码版本控制方法及系统
技术领域
本公开属于代码版本控制、区块链技术领域,具体涉及一种基于区块链的项目代码版本控制方法及系统。
背景技术
版本控制系统是一种用于维护和追踪软件开发的系统,通过版本控制系统可以有效地记录工程开发中对于各个部分的改动记录,通常被用于软件开发过程中的代码开发协作与同步管理。版本控制系统通常有主从式版本控制系统(如SVN)和去中心化版本控制系统(如Git),主从式版本控制系统依赖于集中式版本控制服务器,而去中心化版本控制系统则基于点对点的去中心化网络。
目前的控制系统主要包括:主从式版本控制系统、去中心化版本控制系统和基于区块链的文件存储;
主从式版本控制系统依赖于中心化的版本控制服务器。开发者在开发时需要从服务器同步代码内容,并在完成更新后将代码更新重新传输会服务器。由于所有开发者都基于服务器的代码版本进行开发,因此不同开发者获取到的代码库有着较高的一致性。同时,基于中心化的服务器还可以实现对于特定代码文件的锁定和并发控制,减少不同开发者对于同一文件修改过程的冲突。
去中心化版本控制系统基于去中心化的网络实现,在去中心化版本控制系统中没有明确的中心代码库,而是在所有参与项目开发者的本地保存了各自的代码库及其完整历史。在该系统中,单个用户对于项目代码库的更新都保存在本地,并以更新历史的形式通过去中心化的点对点网络进行传输,传输过程通常只在点对点的两者之间有需要时发生。因此,在去中心化的版本控制系统,如Git、Monotone等之中,开发者无需联网也可在本地完成代码更新,并将其传输给需要更新的其他开发者,而整个系统的所有副本无需在代码版本历史上达成完全的一致。
基于区块链的文件存储是通过区块链系统保存文件,从而实现对文件的存储和存证。在这些系统中,通常对单一文件进行保存,对其进行哈希存证,将文件哈希值保存到区块上,从而实现了对于文件的哈希证明,保证了存储在区块链系统上的文件不被恶意篡改。这些系统中,还可以通过自身的分段算法,实现对存储的大文件进行分段哈希求值和存储,以加强对大文件的哈希存证性能和分布式存储,进一步保证大文件的安全性
在现有技术中存在着以下缺陷:
在主从式版本控制系统中,对于所有开发者的代码更新都要上传到中心化的版本控制服务器上,并基于该中心化的版本控制服务器实现开发过程的协作。中心化的版本控制服务器有着严重的单点问题,难以保证工程项目代码的安全性和协作开发的可靠性。首先,单一的中心化版本控制服务器容易受到恶意者的攻击和控制,进而导致开发中的代码文件泄露等严重安全问题;其次,中心化的协作方式无法保证项目代码不可篡改,当恶意者掌控中心化的版本控制服务器后,可以通过篡改系统中的代码来实现后门植入等恶意行为;最后,主从式版本控制系统无法保证项目代码的实时更新,在其他人更新代码后,还需要从中心化的版本控制服务器获取代码更新内容,并基于更新内容进行代码开发。
在去中心化版本控制系统中则使用了点对点的版本控制服务,所有参与开发的开发者本地留存有软件工程项目的全部代码,但去中心化版本控制系统通常难以在多个对等仓库间达成唯一共识。首先,去中心化版本的控制系统没有严格的主线控制,在实际的工程应用中,通常会选择特定节点作为项目代码版本控制的主线,或者使用类似Github、Gitlab等第三方托管的服务,这使得去中心化版本控制系统又重新有了中心化的节点;并且,去中心化版本控制难以在多个开发者之间达成共识,这使得在进行代码协作的时候常常要面临复杂的修改合并问题,严重影响了开发效率。
在基于区块链的文件存储中使用了区块链系统来实现文件的保存,但这些实现中,如IPFS、专利公开号为CN110968554A、CN112328565A、CN110062034A等的发明中,均对文件进行拆分并通过区块链作为介质实现对文件的分布式存储。然而,这些专利发明装置无法满足项目代码版本控制的要求。首先,这些专利发明装置针对了单个文件或者批量文件存储,但是无法实现对整个项目文件的版本控制和管理;其次,在项目代码版本控制中,通常使用单个源代码文件的行作为更新的最小单位,这是因为代码开发过程中版本之间对于单个文件的修改内容通常是很小的,如果基于单个文件进行版本更新会导致文件频繁更新,严重占据存储空间;最后,这些发明装置无法实现针对项目代码版本控制管理的迭代式更新过程,无法对于整个项目代码文件实现哈希存证和版本管理。
发明内容
本发明的目的在于提出一种基于区块链的项目代码版本控制方法及系统,以解决现有技术中所存在的一个或多个技术问题,至少提供一种有益的选择或创造条件。
为了实现上述目的,根据本公开的一方面,提供一种基于区块链的项目代码版本控制方法,所述方法包括以下步骤:
S100,当区块链网络中各个节点发生编辑本地代码的操作时节点实时的生成哈希值形式的工作量证明;
S200,以节点对本地代码的每次修改作为一次区块链网络的修改交易,当存在发生修改交易的节点时,该节点将修改交易在整个区块链网络中进行广播;
S300,区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效;
S400,将有效的修改交易的节点中修改后的本地代码的文件同步到区块链网络的各个节点。
进一步地,在S100中,所述区块链网络包括至少一个节点,所述节点包括开发者编辑本地代码所使用的台式电脑、笔记本电脑的本地设备,每个节点都有唯一的节点ID编号,其中存储有本地代码、编辑本地代码的次数,各节点通过有线网络、无线网络任意一种互相连接并进行通信。
进一步地,在S100中,开发者编辑本地代码为开发者根据自身的业务需求、功能开发等要求,对本地的项目源代码进行修改,这个过程发生在开发者本地设备,修改的中间过程不会被记录到区块链网络上。
进一步地,在S100中,所述哈希值形式的工作量证明为各个节点编辑本地代码中的代码编辑次数与代码编辑时长,工作量证明为[代码编辑次数,代码编辑时长]的二元组形式的哈希值。例如,工作量证明为[12,45]转换成的哈希码,[12,45]即开发者通过节点编辑本地代码12次,累计编辑时长为45分钟。
进一步地,在S200中,修改交易为开发者在完成本地代码修改后,节点根据开发者添加的修改后的代码自动计算代码被开发者修改的片段,并依据这些修改片段生成代码的修改记录,最终形成一次对项目源代码修改的交易。
进一步地,在S200中,发生修改交易的节点对修改后的本地代码的文件进行哈希码计算,所述哈希码计算的方法包括以下步骤:
S201,初始化一颗默克尔树T;
S202,以修改后的本地代码的文件作为当前源代码文件,将当前源代码文件F按行进行遍历;计算每一行源代码Li的哈希值Hi;Li表示前源代码文件F中第i行源代码;
S203,将当前代码行的哈希值Hi添加到默克尔树T的尾部作为T的叶子节点;
S204,当遍历结束后,计算默克尔树T的哈希值Hash(T)作为前源代码文件F的哈希值Hf=Hash(T),在各个节点中每个源代码文件对应有一个默克尔树T。
由于在工程开发中项目的源代码,即对本地代码的文件的管理通常以行为单位,为此,对于单个文件采用了一行为单位的哈希计算方式,并使用默克尔树作为单个文件的哈希值计算方式。例如,在本地代码的源文件中添加了新的一行,则需要在对应的默克尔树中插入一个表示新增行的节点,并由此计算新的修改后文件的哈希值。由于在这个过程中,修改后的源文件对应的默克尔树的结构和内容发生了变化,最终导致整个默克尔树的对应路径的哈希值发生变化。
进一步地,在S300中,区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效的方法包括以下步骤:
S301,各个节点根据工作量证明数据获取开发者在各个节点中代码编辑次数与代码编辑时长;
S302,记发生修改交易的节点为节点K,节点K的代码编辑次数为MK,以代码编辑次数大于或等于MK的节点为有效投票节点;
S303,以节点K的代码编辑时长为TK,将代码编辑时长低于或者等于TK的节点设置为锁定状态,将代码编辑时长大于TK的节点设置为非锁定状态;
S304,以非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高为H1,节点K所对应的修改交易的源代码文件的默克尔树的树高为H2,统计H1小于或等于H2的所有非锁定状态的有效投票节点的数量Count;其中,树高为树的高度或深度,即树中节点的最大层次;
S305,当Count大于有效投票节点总数的一半时,则修改交易达成共识,确认修改交易有效。
进一步地,在S400中,将有效的修改交易的节点中修改后的本地代码的文件同步到区块链网络的各个节点的方法为:
如果锁定状态的节点为有效投票节点时,将该节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H3依次与各个非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H1逐个对比,当发现H3大于任意一个非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H1时,将该节点解锁为非锁定状态;
将有效的修改交易的节点中修改后的本地代码的文件同步到非锁定状态的节点中,从而使锁定状态的节点能保留上一个版本的源代码文件。
进一步地,在完成同步后,区块链网络中任意一个节点可以通过其对应本地的节点获取到本次修改后的源代码文件,并在此基础之上进行代码的阅读和修改。
本发明还提供了一种基于区块链的项目代码版本控制系统,所述系统包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序运行在以下系统的单元中:
工作量证明生成单元,用于在当区块链网络中各个节点发生编辑本地代码的操作时节点实时的生成哈希值形式的工作量证明;
修改交易广播单元,用于以节点对本地代码的每次修改作为一次区块链网络的修改交易,当存在发生修改交易的节点时,该节点将修改交易在整个区块链网络中进行广播;
修改交易有效判断单元,用于区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效;
本地代码文件同步单元,用于将有效的修改交易的节点中修改后的本地代码的文件同步到各个节点。
本公开的有益效果为:本发明提供一种基于区块链的项目代码版本控制方法及系统,实现了对软件工程项目代码的迭代式更新的哈希快速求值,对从而实现在不同开发者之间达成对软件工程项目代码修改过程的一致认可和共识,实现对代码版本的控制和不可篡改的保存;项目代码的维护往往需要频繁的更新等操作,减少了哈希的计算,加快对于文件的更新共识流程;同时,对项目代码目录进行了共识,可以降低项目代码目录树的高度,提高树的读写速率;当目录更新或者文件更新时,对于目录树的更新效率更高,速度更快,进而提高对于项目代码目录的更新共识流程,不仅保证了项目成员对于项目代码的更新达成公式,且项目代码不可篡改,同时保证了项目代码的高效率更新与维护。
附图说明
通过对结合附图所示出的实施方式进行详细说明,本公开的上述以及其他特征将更加明显,本公开附图中相同的参考标号表示相同或相似的元素,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,在附图中:
图1所示为一种基于区块链的项目代码版本控制方法的流程图;
图2所示为一种基于区块链的项目代码版本控制系统结构图。
具体实施方式
以下将结合实施例和附图对本公开的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本公开的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
如图1所示为一种基于区块链的项目代码版本控制方法的流程图,下面结合图1来阐述根据本发明的实施方式的一种基于区块链的项目代码版本控制方法,所述方法包括以下步骤:
S100,当区块链网络中各个节点发生编辑本地代码的操作时节点实时的生成哈希值形式的工作量证明;
S200,以节点对本地代码的每次修改作为一次区块链网络的修改交易,当存在发生修改交易的节点时,该节点将修改交易在整个区块链网络中进行广播;
S300,区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效;
S400,将有效的修改交易的节点中修改后的本地代码的文件同步到区块链网络的各个节点。
进一步地,在S100中,所述区块链网络包括至少一个节点,所述节点包括开发者编辑本地代码所使用的台式电脑、笔记本电脑的本地设备,每个节点都有唯一的节点ID编号,其中存储有本地代码、编辑本地代码的次数,各节点通过有线网络、无线网络任意一种互相连接并进行通信。
进一步地,在S100中,开发者编辑本地代码为开发者根据自身的业务需求、功能开发等要求,对本地的项目源代码进行修改,这个过程发生在开发者本地设备,修改的中间过程不会被记录到区块链网络上。
进一步地,在S100中,所述哈希值形式的工作量证明为各个节点编辑本地代码中的代码编辑次数与代码编辑时长,工作量证明为[代码编辑次数,代码编辑时长]的二元组形式的哈希值。例如,工作量证明为[12,45]转换成的哈希码,[12,45]即开发者通过节点编辑本地代码12次,累计编辑时长为45分钟。
进一步地,在S200中,修改交易为开发者在完成本地代码修改后,节点根据开发者添加的修改后的代码自动计算代码被开发者修改的片段,并依据这些修改片段生成代码的修改记录,最终形成一次对项目源代码修改的交易。
进一步地,在S200中,发生修改交易的节点对修改后的本地代码的文件进行哈希码计算,所述哈希码计算的方法包括以下步骤:
S201,初始化一颗默克尔树T;
S202,以修改后的本地代码的文件作为当前源代码文件,将当前源代码文件F按行进行遍历;计算每一行源代码Li的哈希值Hi;Li表示前源代码文件F中第i行源代码;
S203,将当前代码行的哈希值Hi添加到默克尔树T的尾部作为T的叶子节点;
S204,当遍历结束后,计算默克尔树T的哈希值Hash(T)作为前源代码文件F的哈希值Hf=Hash(T) ,在各个节点中每个源代码文件对应有一个默克尔树T。
由于在工程开发中项目的源代码,即对本地代码的文件的管理通常以行为单位,为此,对于单个文件采用了一行为单位的哈希计算方式,并使用默克尔树作为单个文件的哈希值计算方式。例如,在本地代码的源文件中添加了新的一行,则需要在对应的默克尔树中插入一个表示新增行的节点,并由此计算新的修改后文件的哈希值。由于在这个过程中,修改后的源文件对应的默克尔树的结构和内容发生了变化,最终导致整个默克尔树的对应路径的哈希值发生变化。
进一步地,在S300中,区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效的方法包括以下步骤:
S301,各个节点根据工作量证明数据获取开发者在各个节点中代码编辑次数与代码编辑时长;
S302,记发生修改交易的节点为节点K,节点K的代码编辑次数为MK,以代码编辑次数大于或等于MK的节点为有效投票节点;
S303,以节点K的代码编辑时长为TK,将代码编辑时长低于或者等于TK的节点设置为锁定状态,将代码编辑时长大于TK的节点设置为非锁定状态;
S304,以非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高为H1,节点K所对应的修改交易的源代码文件的默克尔树的树高为H2,统计H1小于或等于H2的所有非锁定状态的有效投票节点的数量Count;
S305,当Count大于有效投票节点总数的一半时,则修改交易达成共识,确认修改交易有效。
进一步地,在S400中,将有效的修改交易的节点中修改后的本地代码的文件同步到区块链网络的各个节点的方法为:
如果锁定状态的节点为有效投票节点时,将该节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H3依次与各个非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H1逐个对比,当发现H3大于任意一个非锁定状态的有效投票节点中所对应的修改交易的对应的源代码文件的默克尔树的树高H1时,将该节点解锁为非锁定状态;
将有效的修改交易的节点中修改后的本地代码的文件同步到非锁定状态的节点中,从而使锁定状态的节点能保留上一个版本的源代码文件。
进一步地,在完成同步后,区块链网络中任意一个节点可以通过其对应本地的节点获取到本次修改后的源代码文件,并在此基础之上进行代码的阅读和修改。
本公开的实施例提供的一种基于区块链的项目代码版本控制系统,如图2所示为本公开的一种基于区块链的项目代码版本控制系统结构图,该实施例的一种基于区块链的项目代码版本控制系统包括:处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述一种基于区块链的项目代码版本控制系统实施例中的步骤。
所述系统包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序运行在以下系统的单元中:
工作量证明生成单元,用于在当区块链网络中各个节点发生编辑本地代码的操作时节点实时的生成哈希值形式的工作量证明;
修改交易广播单元,用于以节点对本地代码的每次修改作为一次区块链网络的修改交易,当存在发生修改交易的节点时,该节点将修改交易在整个区块链网络中进行广播;
修改交易有效判断单元,用于区块链网络中各个节点通过共识算法对修改交易达成共识之后确认修改交易是否有效;
本地代码文件同步单元,用于将有效的修改交易的节点中修改后的本地代码的文件同步到各个节点。
所述一种基于区块链的项目代码版本控制系统可以运行于桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备中。所述一种基于区块链的项目代码版本控制系统,可运行的系统可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述例子仅仅是一种基于区块链的项目代码版本控制系统的示例,并不构成对一种基于区块链的项目代码版本控制系统的限定,可以包括比例子更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述一种基于区块链的项目代码版本控制系统还可以包括输入输出设备、网络接入设备、总线等。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器 (Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列 (Field-Programmable Gate Array,FPGA) 或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述一种基于区块链的项目代码版本控制系统运行系统的控制中心,利用各种接口和线路连接整个一种基于区块链的项目代码版本控制系统可运行系统的各个部分。
所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述一种基于区块链的项目代码版本控制系统的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card, SMC),安全数字(Secure Digital, SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
尽管本公开的描述已经相当详尽且特别对几个所述实施例进行了描述,但其并非旨在局限于任何这些细节或实施例或任何特殊实施例,从而有效地涵盖本公开的预定范围。此外,上文以发明人可预见的实施例对本公开进行描述,其目的是为了提供有用的描述,而那些目前尚未预见的对本公开的非实质性改动仍可代表本公开的等效改动。