用于区块链网络中双花中继的方法和装置与流程

文档序号:33391425发布日期:2023-03-08 11:05阅读:70来源:国知局
用于区块链网络中双花中继的方法和装置与流程

1.本公开涉及区块链网络,并且具体地涉及对区块链网络中的双花尝试事件的检测。


背景技术:

2.创建和使用真正的数字资产(例如,加密货币)的主要障碍之一是“双花”问题。也就是说,当资产(币等)是数字资产时,它很容易被复制并声称可以转移给多于一个的接收方。因此,大多数这种系统在历史上都需要第三方受信任的中介来规范转移并防止双花。如通过比特币sv
tm
协议例示的,建立在区块链模型上的加密货币(例如,比特币网络)通过去中心化共识和防止双花作为交易有效性的条件之一的协议来解决双花问题。具体地,接收交易的每个节点都会评估交易是否符合许多有效性标准,包括交易的输入存在、未花费(出现在未花费的交易输出(utxo)数据库中)且未用作任何未确认交易的输入的事实,该未确认交易已经被节点看到且处于内存池中等待确认。如果接收到的第二交易使用的输入要么被花费,要么被用作未确认交易的输入,则节点因第二交易无效而将其丢弃,并且不会在区块链网络上传播它。
3.虽然这可以防止双花,但这也隐藏了发生双花尝试的事实。如果第二交易被看到它的第一组节点扼杀并丢弃,则参与第一交易的原始商户和/或用户可能不知道发生了双花尝试。这可能阻碍对恶意活动或行为者的检测且阻碍预防或惩罚措施的实现。
4.一种选项是改变协议以使检测到双花交易的节点转发该交易,尽管该交易被确定为无效,从而网络中的其他节点也将看到该无效交易,并且原始商户节点将知道双花尝试。这种改变的问题在于,它使区块链网络面临潜在的攻击,如拒绝服务攻击,在该攻击中,网络充斥着无效的双花交易,每个节点都需要经历评估无效的双花交易并将其检测为无效的过程,而对这种交易的创建方来说几乎没有成本或零成本。
附图说明
5.现在将通过示例的方式参考附图,附图示出了本技术的示例实施例,并且其中:
6.图1以流程图的形式示出了在区块链上注册矿工身份的一种简化示例方法;
7.图2以流程图的形式示出了设置用于注册矿工身份的快速撤销选项的示例方法;
8.图3以流程图的形式示出了在区块链上记录矿工身份的一种示例方法;
9.图4以流程图的形式示出了核验矿工身份的示例方法;
10.图5示出了在区块链上记录工作历史的一种示例方法;
11.图6示出了使用区块链核验工作历史的示例方法;
12.图7示出了基于记录的工作历史确定挖矿节点的信誉分数的示例方法;
13.图8以框图的形式示出了计算节点(例如,挖矿节点)的简化示例;
14.图9以流程图的形式示出了生成双花通知的方法的一个示例;
15.图10以流程图的形式示出了中继双花通知的方法的一个示例;以及
16.图11以流程图的形式示出了解决双花通知与否认通知之间的冲突的方法的一个示例。
17.在附图中使用相同的附图标记来表示相同的元素和特征。
具体实施方式
18.在一个方面,可以提供一种用于在区块链网络中中继双花尝试通知的计算机实现的方法。该方法可以包括:从区块链网络中的节点接收双花通知,该双花通知包含两个交易标识符并由矿工标识符签署;获得对应于两个交易标识符的两个交易的交易数据;确定两个交易是否具有至少一个匹配的输入,如果两个交易具有至少一个匹配的输入,则将双花通知标识为有效,并因此在区块链网络上将双花通知传输到至少一个其他节点;以及如果两个交易不具有至少一个匹配的输入,则将双花通知标识为无效,并因此不会在区块链网络上传播双花通知。
19.在一些实现方式中,该方法还可以包括:在确定两个交易是否具有至少一个匹配的输入之前,验证矿工标识符。在一些情况下,双花通知包括矿工标识符,并且矿工标识符可以包括矿工公钥,并且验证矿工标识符可以包括:将矿工标识符追溯到包含矿工公钥的发布的创币交易(coinbase transaction),以及使用矿工公钥核验双花通知上的签名。
20.在一些实现方式中,该方法还可以包括:在获得两个交易的交易数据之前,确定要验证双花通知。在一些情况下,确定要验证双花通知可以包括:生成随机值,并且确定随机值低于验证阈值。
21.在一些实现方式中,在区块链网络上传输双花通知还包括:在传输之前向双花通知添加签名。在一些情况下,添加签名包括:确定已经将少于最大数量的签名添加到双花通知。
22.在一些实现方式中,该方法还可以包括:如果两个交易不具有至少一个匹配的输入,则生成并发送否认通知。在一些情况下,否认通知可以至少包括双花通知的标识符,并且其中,生成包括添加当前的节点签名。在一些情况下,当前的节点签名是基于当前的节点矿工标识符而创建的。
23.在一些实现方式中,该方法还可以包括:从另一个节点接收否认通知,其中,否认通知包括双花通知的标识符并且由第二矿工标识符签署。在一些情况下,该方法还可以包括:获得与矿工标识符相关联的信誉分数和与第二矿工标识符相关联的信誉分数,以及通过执行获得和确定两个交易是否具有至少一个匹配的输入而基于相关的信誉分数来确定要验证双花通知。
24.在一些实现方式中,获得交易数据可以包括:从内存池中检索交易之一的交易日期,并且从另一个节点请求另一个交易的副本。
25.在另一方面,可以提供一种用于在区块链网络中中继双花尝试通知的计算装置。该计算装置可以包括存储器、一个或多个处理器和计算机可执行指令,该计算机可执行指令在被执行时,使处理器执行本文中描述的方法中的一种或多种。
26.在又一方面,可以提供一种计算机可读介质,其存储用于在区块链网络中中继双花尝试通知的处理器可执行指令,该处理器可执行指令包括在由一个或多个处理器执行时,使处理器执行本文描述的至少一种方法的指令。
27.通过结合附图审阅以下详细描述,本公开的其他示例实施例对于本领域普通技术人员而言将是显而易见的。
28.在本技术中,术语“和/或”旨在涵盖列出的元素的所有可能组合和子组合,包括单独列出的元素中的任何一个、任何子组合或所有元素,并且不必排除附加元素。
29.在本技术中,短语
“…


中的至少一个”旨在涵盖列出的元素中的任何一个或多个,包括单独列出的元素中的任何一个、任何子组合或所有元素,而不必排除任何附加元素,也不必需要所有元素。
30.本技术可能涉及哈希处理或哈希函数,其旨在包括多个加密哈希函数中的任何一个,这些加密哈希函数在应用于任意的数据或“消息”集合时,确定性地产生唯一的固定长度的字母数字字符串。哈希函数的结果可以称为哈希值、指纹、哈希结果或等价物。示例包括但不限于sha-2、sha-3和blake2。
31.在本文档中,术语“区块链”被理解为包括所有形式的电子的基于计算机的分布式账本(ledger)。这些包括基于共识的区块链和交易链技术、许可的和未被许可的账本、共享账本及其变型。尽管已经提出并开发了其他区块链实现方式,但是区块链技术最广为人知的应用是比特币账本。尽管为了方便和说明的目的在本文中可能提及比特币,如通过比特币sv协议进行示例说明,但是应当注意,本发明不限于与比特币区块链一起使用,并且替代的区块链实现和协议落入本发明的范围内。
32.区块链是一种点对点的电子账本,其使用基于计算机的去中心化的分布式系统来实现。区块链由区块组成,而区块又由交易组成。每个交易是一种数据结构,该数据结构除了其他可能的信息之外,还对区块链系统中的参与者之间的数字资产的控制权的转移进行编码,并包括至少一个输入和至少一个输出。每个区块头都包含例如以默克尔根的形式的区块内容的摘要,并且每个区块头都包含前一个区块头的哈希,以使得区块被链接在一起来创建所有交易的永久、不可改变的记录,这些交易自其开始就已经被写入区块链。交易包含嵌入到其输入和输出中的被称为脚本的小程序,这些小程序指定如何以及由谁可以访问交易的输出。在比特币平台上,这些脚本是使用基于堆栈的脚本语言编写的。
33.区块链是在节点的网络上实现的。每个节点都是具有网络连接性和执行软件的计算装置,该执行软件执行适用的区块链协议。节点对交易进行验证并将它们传播到网络中的其他节点。专门的网络节点(称为“挖矿节点”或“矿工”)将未确认交易(即,待定交易)的集合收集到区块中并尝试“挖掘”该区块。在这些示例中,挖掘是指在网络中的任何其他矿工成功解答针对其相应区块的工作量证明(pow)之前解答工作量证明。在比特币示例中,pow涉及对包含随机数(nonce)的区块头进行哈希处理,直到结果小于由难度参数设置的阈值为止。使该随机数反复地递增并重复哈希处理,直到结果小于阈值为止或直到矿工接收到另一个矿工已经成功的通知为止。挖掘过程的变化对于本领域普通技术人员来说是熟悉的。
34.在验证交易时检查的各种事物之中,节点确定交易的输入是否有效。特别是,节点评估解锁脚本是否评估为真,并确定输入是否引用来自早期交易的“未花费的交易输出”(utxo)。一些节点可能维护utxo的运行列表或集,以便能够快速确定引用的交易输出是否在utxo集中。交易可以通过其独特的交易标识符txid来标识,在一些实现方式中,该唯一交易标识符txid是交易的哈希。一些交易可能具有多于一个的输出,因此可以通过txid和索
引来标识独特的交易“出点”,其中,索引指向来自交易的有序输出集中的输出之一。如果交易输出(例如,出点)存在于utxo集中,则该交易的输出是“未花费的”并且可用于用作输入。该节点还评估交易输入是否已被用作较早接收到的交易的输入,该较早接收到的交易位于未确认交易的内存池中,等待包括在挖掘出的区块(mined block)中。如果是,则节点认为第二接收到的交易无效,不包括在内存池中,且不在网络上传播。
35.任何电子货币系统的众所周知的挑战之一是“双花”问题。也就是说,当货币或其他资产由数字令牌或其他数字数据表示时,机制必须防止该数字令牌或其他数据的持有方简单地复制它并将其作为付款提供给两个不同的接收方。比特币区块链尝试通过使网络的分布式节点对交易和区块进行各种有效性检查来防止双花攻击。针对接受区块为有效的工作量证明要求和基于共识的协议确保了没有区块可以包含包括先前花费的输入的交易,或声称花费相同输入的交易对。如果节点接收到第二交易,并且该第二交易使用的输入要么已被花费,要么用作未确认交易的输入,则该节点因第二交易无效而将其丢弃,并且不会在区块链网络上传播它。虽然这可以防止双花,但这也可能隐藏了发生双花尝试的事实。如果第二交易被看到它的第一组节点扼杀并丢弃,则参与第一交易的原始商户和/或用户可能不知道发生了双花尝试。这可能妨碍对恶意活动或行为者的检测且阻碍预防或惩罚措施的实现。
36.一种选项是改变协议以使检测到双花交易的节点转发该交易,尽管该交易被确定为无效,从而网络中的其他节点也将看到该无效交易,并且原始商户节点将知道双花尝试。这种改变的问题在于,它使区块链网络面临潜在的攻击,如拒绝服务攻击,在该攻击中,网络充斥着无效的双花交易,每个节点都需要经历评估无效的双花交易并将其检测为无效的过程,而对这种交易的创建方来说几乎没有成本或零成本。
37.因此,一种用于检测双花尝试的选项是,标识与新的未确认交易相关的潜在双花的区块链节点可以就可能的双花攻击通知网络上的其余节点,但不一定转发完整的双花交易本身。这将避免执行针对第二交易的交易验证步骤的计算工作给网络中的其他节点带来负担。然而,网络的节点会接收到尝试双花的通知。
38.虽然这可能会减少泛滥攻击的潜在影响,因为节点不一定需要对第二交易执行全面验证,但它留下了双花恶意通知的可能性,并且仍然留下了通知以很少的成本或零成本使网络泛滥的可能性。
39.因此,根据本技术的至少一个方面,仅针对结合特定输入看到的第一双花来发送双花通知。这可以避免多个通知使网络泛滥,该多个通知是关于对相同输入的双花的多次尝试。此外,通知包括原始交易和所谓的双花交易的交易标识符(txid)。该通知还可以包括标识出交易时的时间戳。这避免了第二次交易被结构化为非常大的可能性。
40.本文描述的通知过程确保了及时散播双花尝试已发生的事实。对于网络来说,知道发生了双花尝试比知道发生了相同输入的多于一次的双花尝试更有用,因此只有第一次发生需要包括在双花通知中。
41.可以理解,上述过程还可能使网络面临攻击,在该攻击下,恶意节点生成并发送虚假双花通知。因此,根据本技术的另一方面,双花通知由节点标识符签署。特别地,双花通知可以由矿工标识符签署。矿工标识符可以是以公钥形式的标识符。矿工标识符可以是可核验的矿工id,该可核验的矿工id与挖矿节点相关联并且通过检查有效性检查交易的输出而
未被撤销。可以使用由挖矿节点挖掘出的创币交易来建立矿工id。在下文中稍后将提供矿工id的一些示例的详细解释以及可能的实现过程和用例。
42.因此,合法的双花通知可以由可核验的矿工id签署。接收到这种通知的节点可以核验矿工id有效,作为确定双花通知合法的条件。节点还可以通过请求交易中的一个或两个的副本来核验发生了双花(节点可能已经在本地内存池中拥有交易中的一个)。如果节点核验发生了双花尝试,则它可以在将通知传递给网络中的其他节点之前,将自己的签名添加到该通知。这将为通知提供附加的独立确认,从而进一步向后续节点提供双花通知是合法的保证。
43.如果中间节点接收到双花通知,并从交易数据中确定所谓的双花通知是虚假的,则它可以生成并广播驳斥双花通知的否认消息。这可以有助于阻止恶意的挖矿节点创建虚假的双花通知,因为在通知与其矿工id绑定的情况下,发现和发布其虚假通知可能会对与其矿工id相关联的信誉产生负面影响,这可能反映在由网络节点维护的信誉分数或其他指标中。从这个意义上说,本文描述的通知和否认过程利用了节点维护高信誉分数的需要来阻止负面活动,否则这些负面活动会浪费网络容量,如带宽和计算资源。
44.现在参考图9,其以流程图的形式示出了用于在区块链网络中生成双花尝试通知的一种示例方法900。在一些示例中,方法900可以由挖矿节点来实现。方法900可以通过存储在存储器中的处理器可执行指令来实现,处理器可执行指令在由处理器执行时,使处理器执行以下描述的操作。
45.当在操作902中节点(其可以为挖矿节点)接收到交易时,方法900被启动。按照惯例,节点执行交易验证检查,以确认交易满足适用的区块链协议的要求。如操作904所示,这些检查之一是确保交易的任何输入尚未作为内存池中另一个交易的输入而出现。内存池可以由节点在本地维护,或者对节点来说是可用且可访问的但由专门的节点来维护。在一些实施例中,内存池可以是以数据库形式或分布式数据库形式。
46.如果交易满足验证要求,包括其每个输入均尚未作为内存池中另一个交易的输入,则节点将接收到的交易添加到内存池,并将其传播到区块链网络上的其他节点,如操作906所示。然而,如果接收到的交易的输入之一被标识为内存池中较早接收到的交易的输入,则方法900进行到操作908,在操作908中,节点评估它是否已经看到与相同输入相关的双花通知。如果是,则丢弃该交易,并且方法900返回到操作902以评估下一个接收到的交易。如上所述,双花通知仅关于特定输入发送一次,以避免与相同输入上的大量双花尝试相关的通知使网络泛滥。
47.如果这是关于被质疑的输入的双花的第一次检测,则在操作910中,节点生成双花通知。在该示例中,双花通知包括内存池中较早接收到的交易的交易标识符、稍后接收到的似乎是双花的交易的交易标识符、以及与两个交易中的每一个相关联的时间戳。双花通知还包括节点标识符。在节点为挖矿节点的该示例中,节点标识符为矿工id。特别地,双花通知包括矿工id签名,从而可证明地证实了该挖矿节点生成了双花通知。如下所述,在区块链上将矿工id记录在创币交易中,并且由任何其他节点通过检查关联的有效性检查交易以确认其输出保留在未花费的交易输出数据库中来将旷工id轻松地核验为仍然有效的。通过利用其矿工id签署双花通知,挖矿节点将其标识符投注到通知,从而将其信誉借给通知的真实性。
48.请注意,挖矿节点还可以将所谓的双花交易存储在本地存储器中。挖矿节点不会将双花通知存储在其内存池中,因为该交易尚未经过验证,并且不能包括在候选区块中;但是,它可以在存储器中保留交易的副本,以使挖矿节点能够向正在核验发生了双花尝试的其他节点提供所谓的双花交易的副本。为此,挖矿节点可以维护分配给所谓的双花交易的其他存储器存储空间的数据结构。
49.在操作912中,挖矿节点在区块链网络上传播双花通知。
50.现在参考图10,其以流程图的形式示出了用于在区块链网络中中继双花尝试通知的一种示例方法1000。在一些示例中,方法1000可以由区块链网络节点实现。节点可以是完整节点、挖矿节点、存储验证节点或其他类型的网络节点。方法1000可以通过存储在存储器中的处理器可执行指令来实现,处理器可执行指令在由处理器执行时,使处理器执行下述操作。
51.方法1000开始于在操作1002中,节点通过区块链网络接收双花通知。如上所述,双花通知可以由矿工id或等效的节点标识符数字签署。在操作1004中,节点可以核验通知被签署并且矿工id有效。这可以包括核验签名和验证矿工id。验证矿工id可以包括核验矿工id是否在区块链上的创币交易中,并且关联的有效性检查交易具有在utxo数据库中的输出,这确认了矿工id尚未被撤销。如果矿工id无法被核验,则节点可以丢弃双花通知。
52.如果核验了矿工id,则在操作1006中,节点可以确定是否要检查双花通知的有效性。在该示例中,为了减少网络上的计算负担和提高通知传播速度,只有网络上的部分节点会检查通知的有效性。在该示例中,比例可以是大约10%的节点,尽管在其他实现方式中可以使用任何其他比例。操作1006中的确定可以基于随机数生成和检查随机数是否小于阈值,其中,阈值被设定在随机数空间的10%处。其他机制可用于概率性地选择节点的随机子集来执行有效性检查。
53.如果确定节点不检查通知的有效性,则方法1000进行到操作1018并在区块链网络上进一步传播双花通知。否则,方法1000进行到操作1008,在操作1008处,节点获得所谓的双花交易。任何一个交易都可能存在于节点的内存池中。缺失的交易可以从生成双花通知的挖矿节点获得。在一些示例实现方式中,节点可以使用“getdata”(“获得数据”)消息从挖矿节点请求交易的副本。
54.一旦节点具有两个交易,节点就可以通过比较它们的输入来核验它们实际上是尝试的双花,如操作1010所示。如果不是,则在操作1012中,节点可以生成否认消息。下面将给出关于示例否认消息的进一步解释。出于该示例的目的,否认消息可以被视为质疑双花通知的真实性的消息。节点可以在区块链网络上广播否认消息,并且可以放弃传播双花通知。
55.如果在操作1010中节点核验了双花通知中描述的所谓的双花尝试是真的,则它可以在区块链网络上进一步传播双花通知。在一些示例中,节点可以将其签名添加到双花通知中,作为给其他节点的它已经核验了该通知的信号。在一些实现方式中,为了防止双花通知的大小膨胀,所附签名的数量可能被限制有最大值。因此,在操作1014中,节点可以评估所附签名的数量是否已经达到最大值。如果不是,则在操作1016中,节点将其签名添加到双花通知。在任一情况下,在操作1018中,节点将双花通知传播到区块链网络上的其他节点。
56.以这种方式,双花通知在区块链网络上传播,同时被至少一些区块链节点验证和核验。如果挖矿节点接收到双花通知,并且它之前直接从商户节点(例如,经由商户api)接
收到任一交易,则它可以总是执行核验操作以验证双花指控,如果经过核验,它可以就所谓的双花通知商户节点。这使商户节点注意到交易可能存在一些潜在问题,并且可能使商户节点在商户装置上输出消息或其他通知。商户节点可以使用商户api执行后续的或更频繁的querytransactionstatus检查。
57.如上所述,如果区块链节点确定双花通知中的双花指控是虚假的,则它可以生成并传输否认通知。否认通知表明,区块链节点已经标识出两个所谓的双花交易不共享共同的输入。没有参考接收交易的顺序或哪些交易是双花攻击,因为这对于不同的节点会有所不同。在一个示例中,否认消息可以包括原始双花通知的内容和来自生成否认消息的节点的公钥与签名。在节点是挖矿节点的情况下,公钥与签名可以是矿工id。
58.区块链网络中接收到双花通知和否认通知的另一个节点则处于确定哪个是正确的位置。当然,它可以通过获得交易的副本并自行核验是否发生了双花尝试来做到这一点。为了减少网络上潜在的计算和带宽负担,节点可以遵循用于确定哪个通知是正确的过程,该过程部分依赖于矿工id和关联的信誉分数来确定是接受表面看来的通知还是进行核验。在该过程中,至少部分节点执行对双花指控的核验。
59.现在参考图11,其以流程图的形式示出了用于解决区块链网络上的双花指控和否认冲突的一种示例方法1100。在一些示例中,方法1100可以由区块链网络节点实现。节点可以是完整节点、挖矿节点、存储验证节点或其他类型的网络节点。方法1100可以通过存储在存储器中的处理器可执行指令来实现,该处理器可执行指令在由处理器执行时,使处理器执行下述操作。
60.在操作1102中,节点接收双花通知和否认通知。在一些情况下,节点仅(或首先)接收否认通知,但是否认通知可能包括双花通知的副本。出于该示例的目的,双花通知已由第一挖矿节点生成,而否认通知已由第二挖矿节点生成。
61.在操作1104中,节点可以首先核验已经签署了双花通知和否认通知的节点标识符是有效的。即,可以确认第一挖矿节点的矿工id和第二挖矿节点的矿工id有效且未被撤销。如果第一挖矿节点的矿工id有效而第二挖矿节点的矿工id无效,则在操作1106中,节点可以“接受”双花通知而拒绝否认通知。这可以包括执行关于双花通知的验证过程,例如上面关于图10所述。如果第一挖矿节点的矿工id无效而第二挖矿节点的矿工id有效,则该节点可以“接受”否认通知而拒绝双花通知。
62.如果两个矿工id都是合法的,则节点可能需要确定哪个挖矿节点是正确的:是声称双花的挖矿节点,还是声称双花虚假的挖矿节点。在一种实现方式中,节点只是独立地获得交易数据并确定是否发生了尝试的双花。然而,在该示例中,为了减少网络节点上的计算负担,节点可以首先确定它是否应该核验双花指控,因为并非网络中的所有节点都必须这样做。为了确定是否进行核验,在该示例中,节点利用与挖矿节点相关联的任何信誉分数来影响它需要独立地进行核验的可能性。例如,在操作1110中,节点可以评估第一挖矿节点的矿工id和第二挖矿节点的矿工id是否具有关联的信誉分数。在一些情况下,区块链网络可以被配置为跟踪挖矿节点的信誉分数。如下文将结合矿工id所描述的,信誉分数可以反映挖矿节点的工作历史,即,挖掘出的区块或在挖矿区块中消耗的计算资源;然而,在一些实现方式中,可以使用其他因素来在共识的基础上影响信誉分数。例如,如果网络在共识的基础上确认检测到虚假通知,则检测到虚假通知可能会对挖矿节点的信誉分数具有负面影
响。相反,积极的行动(如发布由网络在共识的基础上确认的否认通知)可能会对挖矿节点的信誉分数具有积极影响。
63.在操作1112中,节点可以评估任一挖矿节点是否没有信誉分数(或默认的信誉分数,即,没有历史)。如果两个挖矿节点都有信誉分数,或者如果两个挖矿节点都没有信誉分数,则节点可以始终核验双花指控是否正确,因为它无法依靠信誉来确定是否应该解决冲突。操作1118反映了核验操作。此外,由于节点中的一个是不正确的,因此应该对该节点的信誉分数(如果有的话)进行调整,如操作1120中所反映。然而,在操作1112中,发现的是,挖矿节点中的一个具有信誉分数而其他的没有,则在操作1114中,节点可以确定它是否要核验双花指控。这种确定可以类似于图10的操作1010中的确定,例如,仅网络上随机选择的节点子集可以评估双花通知是否正确。其他节点可以接受由具有信誉分数的挖矿节点发出的通知或通知很可能是正确的,因为该挖矿节点的信誉分数有风险。在这个意义上,“接受”还可以包括传播接受的通知而不传播拒绝的通知。
64.将理解,上述示例方法1100是用于解决双花通知和否认通知中的冲突的方法的一种示例实现方式。还将理解,某些操作可以被改变、替换或以不同的顺序执行,而不会实质性地影响方法1100的操作。节点可以使用不同的技术来确定是否核验双花通知,以基于相关的信誉分数、信誉分数的缺乏、通知或通知的附加节点签署方的数量或其任何组合来解决冲突。
65.上述示例过程提出发送通知。在许多区块链系统中,使用用于通知、数据传输、请求等的规定语法在节点之间交换数据。下文概述了本文所设想的通知类型的一个非限制性示例。
66.双花通知可能具有类似于以下的消息结构和语法:
67.dblspendnot
68.//signedmessagebeginshere
69.transaction_id_a:byte[32],
[0070]
timestamp_a:long,
[0071]
transaction_a_size:varint,
[0072]
transaction_id_b:byte[32],
[0073]
timestamp_b:long,
[0074]
transaction_b_size:varint,
[0075]
//signedmessageendshere
[0076]
miner_id_sigantures:miner_id_sig_block[]
[0077]
矿工标识签名区块可以被构造为:
[0078]
miner_id_pubkey_len:varint,
[0079]
miner_id_pubkey:byte[],
[0080]
miner_id_signature_len:varint,
[0081]
miner_id_signature:byte[]
[0082]
作为另一示例,关于双花指控的否认通知可以采用以下形式:
[0083]
dblspendrep
[0084]
//repudiationsignedmessagebeginshere
[0085]
transaction_id_a:byte[32],
[0086]
timestamp_a:long,
[0087]
transaction_a_size:varint,
[0088]
transaction_id_b:byte[32],
[0089]
timestamp_b:long,
[0090]
transaction_b_size:varint,
[0091]
//repudiationsignedmessageendshere
[0092]
miner_id_sigantures:miner_id_sig_block[]
[0093]
miner_id_repudiation_signatures:miner_id_sig_block[]
[0094]
将理解,以上示例是说明性的,其他实现方式可以具有不同的语法。还将理解,在一些实现方式中,双花通知和/或否认通知过程可以选择性地应用于双花交易大于阈值大小的情况。对于紧凑且易于核验的较小的双花交易,挖矿节点可以选择通过区块链网络传播该交易。为此,可以定义一种新的库存类型double_spend来标记双花交易的可用性,并将其与经适当核验的交易区分开。即使在这种情况下,节点也可以选择在随机的基础上不频繁地请求双花交易,以避免网络负担过重。在一些情况下,可以使用10%的阈值。即使在该水平处,节点也会看到多个double_spend库存消息,并且应足以对交易产生怀疑,核验其状态为潜在的双花攻击,并通知商户节点。
[0095]
建立可核验的矿工身份
[0096]
如上所述,矿工可以通过挖掘区块来建立矿工身份,该区块在创币交易中包括矿工身份的声明。新挖掘出的区块的有效性和其中所有交易的有效性由区块链网络确认。挖矿节点将其矿工身份包括在创币交易中是由工作量证明支持的身份声明。以下示例中的矿工身份是公钥。不需要第三方ca来验证挖矿节点与其声明的公钥之间的关联,因为这种关联由区块链网络和工作量证明支持。
[0097]
为了便于对矿工身份的可能撤销,例如,如果对应的私钥泄露,矿工可以首先创建有效性检查交易,在该有效性检查交易中声明矿工身份,并且针对该有效性检查交易,存在由矿工控制的输出。创币交易可以包括对该有效性检查交易的引用。由另一个节点执行的身份核验操作的一部分可能是通过传送由矿工控制的输出来确认有效性检查交易尚未被“撤销”。即,矿工可以通过“花费”有效性检查交易的输出来使其自身的矿工身份无效,从而将该有效性检查交易从未花费的交易(uxto)集中移除。这提供了不依赖于挖掘新区块来撤销矿工身份的快速撤销机制。
[0098]
现在将参考图1,图1以流程图的形式示出了在区块链网络中建立矿工身份的一种示例方法100。方法100包括设置操作102和注册操作104。设置操作102包括创建和传播有效性检查交易(vct)。vct包括任意输入和两个输出。一个输出是将任意令牌分配给矿工控制的地址的矿工控制的输出。vct的第二输出包括包含矿工身份的信息字段,该矿工身份在该示例中是矿工选择的公钥pk
id
。矿工持有对应的私钥sk
id
。在基于比特币的实现方式中,信息字段可以是op_return字段。在该示例中,矿工身份(例如,矿工id)是公钥pk
id

[0099]
vct在区块链网络上传播,在该区块链网络上,该vct最终通过包括在挖掘出的区块中而得到确认,从而vct就会在链上。
[0100]
注册操作104涉及挖矿节点成功地挖掘新区块。挖掘区块涉及组装候选区块,该候
选区块包含从未确认交易的内存池中选择的多个交易。挖矿节点还将创币交易插入其候选区块中。然后,它尝试通过使头(header)中的随机数重复地增量并对区块头进行哈希处理来尝试挖掘区块,以试图找到低于难度设置的哈希值。如果另一个挖矿节点成功,则矿工核验另一个挖矿节点的新区块有效,然后创建新的候选区块并再次尝试。
[0101]
在操作104中,挖矿节点成功挖掘到新区块,并且该新区块包含创币交易,该创币交易本身包含矿工身份(例如,pk
id
),并包含对vct的引用。例如,该引用可以是vct的交易标识符txid
vct

[0102]
一旦挖矿节点成功地挖掘出包含声明矿工身份的创币交易的区块,该挖矿节点就成功地建立了其矿工身份。身份是可验证的,并且可以在必要时由挖矿节点以可证明且可追溯的方式撤销或更新。此外,身份及其与挖矿节点的关联由工作量证明支持并由网络保护,从而允许第三方依赖矿工身份(例如,其公钥pk
id
)而无需对认证机构的信任。然后,矿工身份可用于多个目的,包括跟踪矿工活动、证明矿工真实性或状态、建立或参与和矿工的安全加密通信、以及出于各种目的对矿工进行排名等。
[0103]
现在还将参考图2,图2示出了一种示例设置方法200,该方法可在建立矿工身份的方法100中使用。在该示例中,该方法由挖矿节点执行。
[0104]
在操作202和204中,挖矿节点选择私钥sk
id
并找到对应的公钥pk
id
。公钥pk
id
是矿工标识符。
[0105]
然后在操作206中,挖矿节点创建具有任意输入和两个输出的有效性检查交易。输入可以是挖矿节点持有针对其的对应私钥的任何utxo,即,由矿工控制的任何utxo。在许多实现方式中,输入可以是足以抵消与vct相关联的任何交易成本的币或令牌数量,以确保vct被包括在区块中。在一些实现方式中,可以通过策略建立最小令牌数量。
[0106]
输出之一是由挖矿节点控制的任何地址的输出。也就是说,输出到挖矿节点持有针对其的对应私钥的地址,以使其能够解锁关联的锁定脚本。在一些示例中,输出地址可以是标记的pk
vct
,其为由挖矿节点选择的任何公钥,并且挖矿节点持有针对该公钥的对应私钥。例如,输出可以是p2pkh(支付到公钥哈希)操作,该p2pkh操作指定了向由挖矿节点选择和控制的公钥哈希(例如,比特币地址)的转移。
[0107]
另一个输出包括其中可以插入信息的非操作信息字段。特别地,该字段包含矿工标识符pk
id
。在基于比特币的实现方式中,输出可以使用op_return操作码来提供信息字段。
[0108]
可能存在区块链协议,其中非操作信息字段可以包括在交易中以为了在交易内发布信息的目的,该信息不一定被实现为交易的“输出”,正如该术语可以被理解的那样。然而,将理解,在这些示例中指代信息字段的术语“输出”旨在包括替代区块链协议上的这种可能的实现方式。
[0109]
一旦在操作206中创建了vct,则在操作208中,挖矿节点就在区块链网络上传播vct。本领域的普通技术人员将理解,vct的传播可能涉及的是,网络的每个节点核验交易并然后将其发送到它所连接的所有其他节点,使得交易通过完整的区块链网络快速传播。作为未确认交易,它将被插入到内存池中,各个挖矿节点将从该内存池中选择交易以包括在候选区块中。因此,交易最终将通过包括在挖掘出的区块中的方式而得以“确认”。在操作210中,挖矿节点评估vct是否已经通过被包括在挖掘出的区块中而得以确认。一旦得到确认,则在操作212中,挖矿节点就记录交易标识符txid
vct
。将理解,在一些实现方式中,挖矿
节点可以在vct被挖掘之前记录交易标识符。
[0110]
在vct作为区块链的一部分的情况下,其到pk
vct
的第一输出形成“未花费的”输出的uxto集的一部分,直到挖矿节点选择移动/转移与该输出相关联的令牌。该uxto用作有效性检查机制。只要仍然是uxto集的一部分,vct中的矿工标识符就保持有效且不会被撤销。一旦不再在uxto集中,vct中的矿工标识符就不再有效。
[0111]
现在还将参考图3,其示出了一种示例注册方法300,该方法可以在建立矿工身份的方法100中使用。在该示例中,该方法由挖矿节点执行。方法300假设的是,创建与矿工标识符pk
id
相关联的有效性检查交易的设置操作已经发生。
[0112]
在操作302中,挖矿节点创建候选区块。候选区块包含从未确认交易的内存池中选择的多个交易。然后挖矿节点在候选区块中插入创币交易,如操作304所反映的。除了为挖矿节点铸造规定数量的新令牌或币之外,创币交易还包括包含矿工标识符pk
id
和对vct的引用的信息字段。该引用可以是交易标识符txid
vct
。例如,可以使用op_return代码或等效物来提供信息字段。
[0113]
除了矿工标识符和对vct的引用之外,信息字段还可以包含附加信息。例如,它可以包含指示正在通过创币交易实现什么动作的动作标识符或代码。在该示例中,动作可以是“注册”,以指示挖矿节点正在公开地注册其矿工标识符。它还可以包括或可替代地包括签名。作为示例,签名可以是信息字段的其余部分的签名,例如,签名(signature):sig(sk
id
,action||minerid||vct),其中,vct是txid
vct
,minerid是pk
id

[0114]
一旦生成了具有该创币交易的候选区块,挖矿节点就尝试挖掘该区块,如操作306所示。它还评估竞争矿工是否已经成功地挖掘出另一个区块,如操作308所示。如果竞争矿工赢得挖掘区块的竞赛,则挖矿节点验证该另一个区块,将其添加到区块链,并返回操作302以建立新的候选区块并重试。
[0115]
如果挖矿节点成功挖掘出候选区块,则它记录创币交易的交易标识符txid
reg
。请注意,可替代地,该挖矿节点可以记下区块编号,因为它将仅包含其他节点可能能够基于区块编号标识出的一个创币交易。
[0116]
通过注册创币交易成功地挖掘出区块后,挖矿节点已成功地注册其矿工身份,并已将其发布在区块链上。接收矿工标识符(例如,公钥pk
id
)的另一个节点可以核验该公钥是有效的,并且与挖矿节点相关联,而不依赖于对单独的认证机构的信任。
[0117]
图4以流程图的形式示出了根据本技术的一个方面的节点可以执行以核验矿工标识符的一种示例方法400。节点是区块链网络内部或外部的任何节点,用于验证矿工标识符pk
id
。例如,验证可以作为核验或批准来自矿工的请求、建立与矿工的通信会话或以其他方式证明公钥pk
id
的有效性及其与挖矿节点的关联的一部分而发生。
[0118]
在操作402中,节点接收或检索矿工id(pk
id
)和注册交易标识符(txid
reg
,或者在一些情况下,其中出现注册创币交易的区块编号)。操作402还可包括检索或接收挖矿节点声称已签署的消息。消息m和签名σm可由挖矿节点提供。在一些情况下,消息及其签名可以是挖矿节点提供或发布的数字证书的一部分,作为其身份证明。
[0119]
在操作404中,节点基于注册交易标识符txid
reg
从区块链检索注册创币交易。然后在操作406中,节点验证或确认注册创币交易中的某些数据。例如,节点可以解析op_return字段以从创币交易中提取该字段中的信息。从经解析的信息中,节点获得vct交易标识符
txid
vct
。节点可以确认的是,op_return字段包括由挖矿节点提供的相同公钥pk
id
,并且“动作”为“注册”。
[0120]
在操作408中,根据注册创币交易中公布的vct交易标识符,节点可以检索vct。节点可以确认的是,vct中的op_return字段具有相同的公钥pk
id
,如操作410所示。然后节点可以评估vct的其他输出是否保持“未花费”,即,它是否保持为可用输出点的uxto集的一部分。这可能涉及直接或通过中间节点查询uxto集数据库。该查询可以基于输出点标识符,该输出点标识符可以包括交易标识符txid
vct
和指示哪个输出的索引。如果输出未出现在uxto集中,则矿工标识符无效,因为它已被撤销或替换。因此,核验失败。
[0121]
然而,如果输出点在uxto集中,则节点可以将pk
id
视为挖矿节点的经核验的公钥,然后在操作414中它可以使用pk
id
验证挖矿节点的签名,以确认挖矿节点签名。注意,操作414可以包括节点确认创币交易op_return字段内的签名(如果有的话),或节点确认消息m上的签名σm,或节点确认这两者。显然,如果签名检查失败,则声称的挖矿节点无法被验证为对应私钥的持有方,并且核验失败。如果签名检查成功,则挖矿节点被核验为与挖矿标识符(即,经核验的注册公钥pk
id
)相关联的挖矿节点。
[0122]
如上所述,可以通过从uxto集移除vct的第一输出来撤销注册的矿工id。这是通过将输出用作任何其他交易的输入而“花费”该输出来完成的。这可能包括将分配给该第一输出的任何令牌转移到撤销交易中的新地址。撤销交易的创建和传播足以导致对矿工id的任何核验都失败,因为核验节点将无法在uxto集中定位到该输出。尽管如此,矿工可以通过在其下一个挖掘出的区块的创币交易中包括op_return字段来进一步注册撤销。在一个示例中,op_return可以包括动作“撤销”和矿工id。在一些实现方式中,它还可以包括签名以及注册交易和撤销交易两者的交易标识符。
[0123]
在许多情况下,矿工id可能希望“更新”或替换其矿工id,而不是因为其私钥被泄露而简单地撤销矿工id。这可能是由于私钥被披露或被盗,或者可能作为风险管理的一部分定期进行,以确保周期性更新密钥素材。
[0124]
为了更新旧的矿工id pk
id-old
,挖矿节点首先为新的公钥pk
id-new
创建新的vct。从该过程中,挖矿节点获得新的vct交易标识符txid
vct-new
。然后,挖矿节点用新的创币交易挖掘新区块来注册新的矿工id;但是,为了将新的矿工id链接到旧id和旧id的任何工作历史,矿工可以使用“更新”或“更新id”动作来表示创币交易不仅仅是第一次注册矿工id,而且还替换先前的矿工id。更新的创币交易中的op_return字段的内容可以包括:
[0125]
1.动作:update id
[0126]
2.旧的矿工id:pk
id-old
[0127]
3.新的矿工id:pk
id-new
[0128]
4.旧的矿工id签名:sig(sk
id-old
,pk
id-old | | pk
id-new
)
[0129]
5.旧的vct签名:sig(sk
vct
,pk
id-old | |pk
id-new
)
[0130]
6.新的vct:txid
vct-new
[0131]
7.新的签名:sig(sk
id-new
,action||new minerid||new vct)
[0132]
在该示例中,将理解,更新操作涉及挖矿节点供应多达三个签名:与旧的矿工id有关的一个签名、与旧的vct有关的一个签名、以及与新的矿工id有关的一个签名。在一些情况下,可以不包括旧的vct签名。
[0133]
还将理解,挖矿节点可以通过将来自旧的vct的输出用作某个其他交易的输入而使较早的矿工id无效。在一个示例中,输出可以是新的vct的输入。在另一个示例中,在传播单独的撤销交易以使其旧的矿工id无效之前,挖矿节点可以等待,直到它成功地挖掘出区块以注册更新的矿工id为止。
[0134]
使用上述系统,矿工能够在区块链上建立和注册其可证明的标识符。通过将其包括在挖掘出的区块的创币交易中,矿工证明它是真正的挖矿节点,并且标识符和关联的素材的有效性由工作量证明支持。如果需要,vct提供快速撤销机制。在一些示例实现方式中,vct可以按照策略要求至少将预定的令牌或币值分配给输出,从而用权益证明来补充工作量证明。有利地,上述系统避免了对认证机构的信任的需要,并且不涉及挖矿节点的附加工作和涉及区块中非常少的附加数据。
[0135]
上述注册系统和方法使矿工能够证明身份并向挖矿节点提供数字证书,另一个节点可以在不依赖认证机构的情况下核验该数字证书。此外,如下面所描述的,矿工标识符可用于可证明地将来自该矿工挖掘出的区块的创币交易链接在一起。这为矿工提供了与其矿工id相关联的可核验的工作历史。该工作历史可以有助于确立许多事情,包括矿工状态、访问某些资源的权利、出于某种目的在矿工的层次结构中排名等。在以下描述中,该工作历史可称为“信誉证明”系统。
[0136]
信誉证明
[0137]
在一个方面,本技术提供了用于在区块链上记录矿工工作历史以及用于核验矿工工作历史的方法和系统。如将要描述的,在下面的示例中,工作历史通过由挖矿节点挖掘出的区块中的链接的创币交易链来记录。在一些实现方式中,工作历史可用于确定挖矿节点的信誉分数。信誉分数可以在许多应用(包括作为示例的矿工投票操作)中使用。
[0138]
在以下描述的一些实现方式中,每个创币文档在信息字段中包括矿工标识符。在一些实现方式中,可以使用上述方法和系统来建立和核验矿工标识符。然而,在一些实现方式中,可以使用其他技术或系统来建立矿工标识符并用于核验目的。因此,应当理解,下文描述的工作历史和信誉证明示例不一定需要在所有实现方式中使用上述矿工标识符注册过程。
[0139]
如上所述,一种用于注册矿工标识符的机制是将矿工标识符放入由关联的挖矿节点挖掘出的区块的创币交易中。矿工标识符可以出现在创币交易中的信息字段中,例如,op_return字段。信息字段还可以包括签名或其他数据。如上所述,在一些实现方式中,信息字段可以包括对有效性检查交易的引用,这使得矿工标识符尚未被撤销的其他节点能够快速撤销矿工标识符和进行容易的核验。
[0140]
创币交易还可以与注册的矿工标识符结合利用,以记录挖矿节点的工作历史。图5以流程图的形式示出了用于在区块链上记录矿工工作历史的一种示例方法500。方法500由与矿工标识符相关联的挖矿节点执行。矿工标识符可以是公钥,该挖矿节点持有针对该公钥的对应私钥,即,矿工标识符可以是pk
id

[0141]
方法500包括在操作502中注册矿工标识符。如上所述,注册操作包括在由挖矿节点挖掘出的区块内的注册创币交易中公布矿工标识符。
[0142]
在操作504中,挖矿节点继续试图挖掘新区块。特别地,挖矿节点建立新的候选区块并插入包括信息字段的创币交易,该信息字段包含矿工标识符。创币交易信息字段还包
含对同一矿工挖掘出的区块中先前的创币交易的引用。先前的创币交易是最近挖掘出的区块,在该区块中,创币交易包含矿工标识符。在挖掘出的第二区块的情况下,引用的是注册创币交易。来自该挖矿节点的随后挖掘出的区块将包含通过引用最近挖掘出的区块的创币交易而以区块被挖掘的顺序链接的创币交易。例如,引用可以是创币交易的交易标识符(例如,txid)。在一些情况下,引用的可以是包含该创币交易的区块编号,基于此,节点可以标识该区块内的创币交易。在一些情况下,引用可以是“出点(outpoint)”,该“出点(outpoint)”包括txid和指向创币交易的输出之一的索引,特别是op_return输出的索引。
[0143]
在一些实现方式中,信息字段包含附加信息。例如,除了对来自挖矿节点的最近挖掘出的区块的创币交易的引用之外,信息字段还可以包含对由挖矿节点挖掘出的每个后续区块中的注册创币交易的引用。作为另一示例,信息字段可以包括基于矿工标识符(即,使用与矿工标识符相关联的私钥)产生的数字签名。例如,数字签名可以是包括在信息字段中的一个或多个引用。
[0144]
一旦在操作504中创建了具有创币交易的候选区块,则挖矿节点就在操作506中尝试挖掘该区块。它还在操作508中监测从另一个挖矿节点接收新区块的通知。如果另一个节点成功地找到新区块,则在操作510中,挖矿节点根据适用的区块链协议来核验新区块有效,然后将该新区块添加到区块链。如果挖矿节点在从另一个节点接收到新区块的通知之前成功地挖掘出候选区块,则它在区块链网络上快速传播候选区块的成功挖掘并且在操作512中将该新区块添加到区块链。无论区块链上的新区块是来自挖矿节点还是来自另一个节点,一旦找到了新区块,挖矿节点就返回操作504以建立新的候选区块并重试。
[0145]
将理解,如果挖矿节点偶尔成功挖掘出新区块,则上述循环产生链接的创币交易链,其将挖矿节点挖掘出的区块从最近的区块链接回到原始注册创币交易。由于op_return数据在区块链上可见,因此链接的创币交易集(每个都包含矿工标识符)很容易被标识为挖矿节点工作历史的已发布记录。
[0146]
现在参考图6,其示出了核验来自区块链的矿工工作历史的一种示例方法600。方法600可以由任何计算节点执行,无论计算节点是否为节点的区块链网络的一部分。
[0147]
在操作602中,计算节点标识创币交易。该标识可以以多种可能的方式发生。例如,挖矿节点可以向计算节点提供其声称的身份和创币交易的交易标识符。交易标识符可以指向由挖矿节点产生的最近挖掘出的创币交易。在一些情况下,挖矿节点可以结合请求加入、投票、参与、通信或以其他方式向计算节点提供该信息,作为断言挖矿节点具有特定身份和关联的信誉或工作历史的一部分。这种断言可以由挖矿节点以某种方式发布,并且计算节点可以访问和检索来自这种发布的信息。无论背景或机制如何,计算节点都会获得以下信息:将特定创币交易标识为特定挖矿节点的声称的工作历史的一部分。
[0148]
在操作604中,计算节点评估创币交易是否在信息字段中包含矿工标识符。在许多情况下,计算节点将获得挖矿节点的声称的标识符,并且操作604可以涉及确认相同的标识符出现在创币交易中。如果不是,则方法600失败,因为创币交易没有验证声称的矿工身份的任何工作历史。
[0149]
在操作606中,计算节点还确定创币交易信息字段是否包含对较早的创币交易的引用。例如,引用可以是txid编号。在一些情况下,引用可以是标识要在其中找到创币交易的区块的区块编号或高度,或者可以是较早的创币交易的出点。如果存在引用,并且引用的
是较早(较低区块高度)的挖掘出的创币交易,则在操作608中,计算节点从区块链中检索该创币交易的副本并返回操作604,以确认该创币交易的副本还包含矿工标识符并指向较早的创币交易。以这种方式,计算装置使用创币交易信息字段中的引用来追溯链接的创币交易集,链接的创币交易集以交易被挖掘的顺序链接回到前一个交易。
[0150]
如果在操作606中,创币交易中的一个不包含对较早的创币交易的引用,则计算节点评估该创币交易是否为注册创币交易,即链中的第一交易。这是根据信息字段可核验的,该信息字段可以包含它是注册创币交易的指示,例如,该信息字段可以包含“动作:注册”或等效代码或指示符。在一些情况下,可替代地或附加地,可以基于链中的所有其他创币交易将其标识为注册创币交易来进行核验。如果不是注册创币交易,则链被破坏并且方法600无法核验工作历史。如果是,则工作历史已被标识,并且在操作612中,计算节点可以继续验证矿工标识符。如上所述,在一些实施例中,这可以包括利用有效性检查交易和关联的核验过程。
[0151]
作为一个示例,上述过程允许第三方计算节点验证特定挖矿节点具有某个工作历史。即,计算节点可以很容易地追溯挖矿节点的工作历史,这为挖矿节点提供了可核验的信誉证明。与具有很少的工作历史或没有工作历史的挖矿节点相比,具有产生有效区块的长期历史的挖矿节点可能被认为更可靠、更重要、更值得信赖、更忠诚或更值得投资。在此基础上,“工作量证明”不仅用于确定哪个区块是有效的,哪个矿工因其在算力上的投资而接收到当前的奖励,而且还用于支持建立针对投资于算力和建立特定区块链的承诺的矿工信誉。
[0152]
挖掘过程涉及搜索低于目标难度阈值的区块头哈希。搜索涉及使头中的随机数值发生增量,对区块头进行哈希处理,评估哈希结果的数值是否低于难度阈值,以及如果不是,则使随机数值发生增量并重试。难度阈值由协议设定,并基于区块链协议周期性地调整,以大约每10分钟产生区块。进行调整,使得区块链网络考虑到网络中整体哈希算力(hash power)的改变。随着哈希算力增加,改变难度,以确保不会太快且太容易地产生区块。例如,在比特币核心协议中,每2016个区块(大约14天)调整一次难度。例如,在比特币现金或比特币sv协议中,每144个区块调整一次难度。
[0153]
区块头包括字段(即,nbits字段),该字段指定了用于该区块的当前难度阈值。难度阈值以256为基数的科学计数法表示。因此,如果a=a1a2a3a4是4个字节,那么目标t被定义为:
[0154][0155]
a1的值必须在范围0≤a1≤34内,以确保目标始终保持为低于2
256
,因此可以表示为32字节字符串。鉴于sha256函数表现得像随机预言机(即,sha256输出是随机的256位字符串,其中每个位同样可能为1或0,与其他位无关),区块头哈希低于试验nnonce值的目标的可能性为:
[0156][0157]
在本技术的另一方面中,可以基于挖矿节点的经核验的工作历史来确定挖矿节点的信誉分数。如以上所讨论的,工作历史可以由链接的创币文档链表示,这些链接的创币文档证明了挖矿节点、其矿工标识符和由该挖矿节点挖掘出的区块集之间的关联。
[0158]
在一个示例实现方式中,挖矿节点的信誉分数是基于挖掘出的区块的计数(即,链接的创币文档的计数)来确定的。该示例在区块链历史中的任何时候为任何区块提供相等的权重,前提是该区块经由链接的创币交易形成挖掘出的区块的链的一部分。
[0159]
在另一示例实现方式中,信誉分数可以基于挖掘出的区块的加权计数。也就是说,每个区块可以具有与其相关联的权重。在一个示例实现方式中,权重可以基于区块高度。例如,一种实现方式可以向较旧的区块赋予更大的权重。在另一种情况下,一种实现方式可以向较近的区块赋予更大的权重。
[0160]
在另一实现方式中,分配给区块的权重可以基于区块难度。也就是说,具有较低难度阈值的区块(即,平均而言需要更大的哈希算力来挖掘出的区块)可以在确定信誉分数时被赋予更大的权重。在这种实现方式的一个示例中,信誉分数可以被确定为包含链接的创币文档链中的创币文档之一的每个区块的目标难度的函数。
[0161]
作为示例,如果矿工信誉分数为rep
id
,区块i的目标难度为ti,并且工作历史中的区块数为b,则矿工信誉分数可被计算为:
[0162][0163]
在一些示例中,信誉分数可以基于整个工作历史,或者可以基于高达最大数量的的最近区块的窗口,即“滚动”信誉分数。在一些情况下,窗口可以基于区块链高度,例如,来自工作历史的任何区块落在当前区块链高度的x个区块内。
[0164]
在一些示例实现方式中,当前信誉分数可以由挖矿节点计算并且包括在每个创币交易信息字段中。
[0165]
在一些情况下,可以对信誉分数进行归一化,例如将其除以最大信誉分数,例如由区块链或窗口中的所有区块产生的信誉分数。这将确保所有信誉分数都在0和1之间。
[0166]
现在参考图7,其示出了确定挖矿节点的信誉分数的示例方法700。示例方法700可由挖矿节点、另一区块链节点或区块链网络外部的计算节点执行。
[0167]
在操作702中,追溯特定挖矿节点的链接的创币交易链,例如如上面结合图6所描述的。通过追溯创币交易,标识出挖矿节点的工作历史。在操作704中,确定包含创币交易中的一个的每个区块的难度阈值。然后在操作706中,通过将函数应用于难度阈值集来确定挖矿节点的信誉分数。如上上面所讨论的,这可以包括对难度阈值(或它们的反转值)求和。可以通过该函数应用附加的或替代的加权。结果是挖矿节点的信誉分数,其在操作708中输出。
[0168]
信誉分数是挖矿节点对区块链贡献的可量化度量,可用于多种场景。有利的是,用于确定和验证矿工身份及其关联的信誉分数的所有数据都可从区块链公开获得,并借助于由工作量证明支持的区块链的不可变特性进行验证。为了防止恶意行为,挖矿节点的信誉分数只能通过挖掘区块来增加,即通过对区块链网络的稳定性的积极贡献。
[0169]
信誉分数由挖矿节点开发,该挖矿节点在创币文档中包括其矿工标识符和到前一个区块的链接。创币文档的内容由挖矿节点控制,这意味着挖矿节点无需依赖任何第三方验证或认证来建立信誉。此外,挖矿节点不能伪造或篡改信誉。
[0170]
可核验地确定具有关联的矿工身份的挖矿节点的信誉分数的能力可以用于许多应用中。例如,参与特定协议或活动的权利可以基于具有最小阈值信誉分数的挖矿节点来预测,以便仅允许具有特定血统的矿工参与。另一个潜在的应用是投票。特别是当涉及到对
底层区块链协议所提议的改变时,矿工可能负责提交投票,并且该投票可能以某种方式进行加权。一种选项是基于信誉分数对投票进行加权,从而基于矿工在建立现有区块链方面做出了更多的工作而向具有更高信誉分数的矿工赋予更大的权重。
[0171]
在区块链中使用的一个示例投票方案涉及打开时间窗口,在该时间窗口期间矿工可以投票,然后基于在该时间窗口期间挖掘出的区块来清点选票。这为在时间窗口期间拥有最大哈希算力的矿工提供了最多的选票,并且不考虑贡献历史。这可能导致“哈希战争”,并使系统容易受到“租用的哈希”的影响,在“租用的哈希”中,有兴趣歪曲投票结果的矿工暂时将大量算力提交给区块链,以便在窗口期间主导区块链的哈希算力,但没有资源或兴趣在长期内向区块链提交该数量的算力。在一些情况下,“租用的哈希”是不可持续的,因为它是不经济的资源分配,是由该矿工为强制投票结果而导致的成本。因此,矿工获得的投票影响与该矿工实际参与和投资区块链不成比例。
[0172]
在一个示例中,矿工投票过程可以允许挖矿节点参与,前提是它们具有注册的矿工标识符(例如,pk
id
)和关联的信誉分数rep
id
。投票发生在商定的时间窗口内,从开始时间到结束时间(或从开始区块高度到结束区块高度)。用于就任何投票的窗口和时间达成共识的机制可以是链上的或链下的。
[0173]
要进行投票,挖矿节点必须在投票窗口期间挖掘区块。在区块中,矿工在创币交易内插入其矿工标识符和对其最近的创币交易的引用。在一些实现方式中,挖矿节点还可以包括其计算出的信誉分数。挖矿节点还包括投票信号。根据投票,信号可能是二元的“是”/“否”或“赞成”/“反对”信号,也可能是多值信号,例如在三个或更多个选项之间进行选择、三个或更多个选项的排名等。在一些示例中,创币交易还可以包括基于与矿工标识符对应的私钥的数字签名。数字签名可以覆盖创币交易中信息字段的其他内容。
[0174]
在一些实现方式中,单个矿工可能有权在投票窗口期间多次投票。在一些其他实现方式中,每个矿工(即,每个关联的矿工标识符pk
id
)只允许一票。在后一种情况下,如果矿工挖掘出声称要投票的多于一个区块,则可以应用策略来确定对哪一票进行计数。例如,策略可能是采用最早(最低区块高度)的投票。或者,该政策可能是采用最后(最高区块高度)的投票,以允许矿工在窗口期间改变他们的投票。
[0175]
任何投票监测器都可以通过如上所述那样核验矿工标识符和如上所述那样核验与该矿工标识符相关联的信誉分数来核验投票有效。如果需要签名作为投票创币交易的一部分,则可以防止其他矿工恶意挖掘区块并声称使用他们的pk
id
投票的可能性。投票窗口关闭后,任何观测器都可以通过将每个选项的信誉分数加权投票相加来确定结果,因为所有信息都记录在区块链上并且可以被核验。
[0176]
通过使用历史区块数据而不是当前和未来的区块数据计算投票,可以在相对较短的时间段内进行投票,同时确保使用足够的工作量证明数据计算投票权重以准确地反映链式工作。这可以实现相对较短的投票周期,而不会有投票权重被临时哈希突发扭曲的风险。
[0177]
然而,由于投票需要每个pk
id
挖掘新区块,因此必须给予足够的时间以使矿工能够投票。假设区块时间为10分钟,如果具有pk
id
的矿工具有x%的网络哈希率,则在t小时内挖掘出至少一个区块的可能性是:
[0178]
[0179]
下面的表1给出各种x和t的p
[0180]
xt=24t=48t=72t=960.5%0.5140.7640.8850.9441%0.7650.9450.9870.9975%0.9990.999≈1≈125%0.999≈1≈1≈1
[0181]
从上表将理解的是,即使pk
id
只有1%的网络哈希率,72小时的投票期几乎保证了他们能够挖掘出投票区块。
[0182]
在可能的哈希战争场景的至少一个示例建模中,可以表明的是上述信誉系统会降低租用的哈希的有效性,使得即使攻击方会在14天内主导75%的网络,攻击方也只会设法积累23%的投票权。
[0183]
将理解,各种上述示例方法的上述操作中的一些或全部可以按照与所示顺序不同的顺序执行和/或可以同时执行,而不改变这些方法的总体操作。
[0184]
现在参考图8,其以框图形式示出了根据本技术示例的简化计算装置800。该计算装置800可以执行上述功能中的一个或多个。例如,计算装置800可以是挖矿节点。在一些实现方式中,计算装置800可以是进行操作以验证区块链记录的数据(例如,矿工标识符、矿工工作历史、矿工信誉分数或矿工投票区块)的非挖矿节点。
[0185]
计算装置800包括处理器802,其可以包括一个或多个微处理器、专用集成电路(asic)、微控制器或类似的计算机处理装置。该计算装置800还可以包括存储器804和网络接口806,该存储器804可以包括持久性和非持久性存储器,以存储值、变量以及在一些情况下的处理器可执行程序指令。
[0186]
计算装置800可以包括处理器可执行应用程序808,其包含处理器可执行指令,这些指令在被执行时使处理器802执行本文所述的一个或多个功能或操作。
[0187]
以上呈现的各种实施例仅是示例并且绝不意味着限制本技术的范围。本文描述的创新的变化对于本领域普通技术人员来说将是显而易见的,这样的变化在本技术的预期范围内。特别地,可以选择来自上述示例实施例中的一个或多个的特征来创建替代示例实施例,其包括可能未在上文明确描述的特征的子组合。此外,可以从一个或多个上述示例实施例中选择特征并将其组合以创建替代示例实施例,包括上面可能没有明确描述的特征的组合。本领域技术人员在整体审阅本技术时将容易明白适合于这种组合和子组合的特征。本文和引述的权利要求中描述的主题旨在涵盖和包含所有合适的技术变化。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1