首页 / 专利库 / 银行与财务事项 / 货币 / 数字货币 / 加密货币 / 比特币 / 用于控制区块链交易的所生成脚本的流执行的方法

用于控制链交易的所生成脚本的流执行的方法

阅读:726发布:2020-05-14

专利汇可以提供用于控制链交易的所生成脚本的流执行的方法专利检索,专利查询,专利分析的服务。并且本 发明 提供了一种用于生成 区 块 链 交易(Tx)的计算机实现的方法(以及相应的系统)。这可以是 比特币 区块链或其他区块链协议的交易。该方法包括以下步骤:使用 软件 资源来接收、生成或得出至少一个数据项;然后至少一次将代码的至少一部分插入与交易相关联的脚本中。在执行脚本时,该部分代码提供控制流机制的功能,控制流机制的行为由至少一个数据项控制或影响。在一个实施方式中,将代码多于一次复制/插入到脚本中。控制流机制可以是循环,例如while或for循环,也可以是选择控制机制,例如switch语句。因此,本发明允许生成更复杂的区块链脚本并控制该脚本在区块链上实现时将如何执行。这又可以控制如何或何时解 锁 区块链交易 的输出。,下面是用于控制链交易的所生成脚本的流执行的方法专利的具体信息内容。

1.一种计算机实现的方法,包括以下步骤:
接收、生成或得出至少一个数据项;
将代码的至少一部分至少一次插入与链交易关联的脚本中,以便在执行所述脚本时,其提供控制流机制的功能,所述控制流机制的行为由所述至少一个数据项控制或影响。
2.根据权利要求1所述的方法,其中:
所述脚本与所述区块链交易的输入或输出相关联。
3.根据权利要求1或2所述的方法,其中:
所述交易是根据区块链协议生成的,或生成所述交易以与区块链协议一起使用。
4.根据权利要求3所述的方法,其中,所述协议是比特币协议或比特币协议的变体。
5.根据任一前述权利要求所述的方法,包括以下步骤:
多于一次地和/或在脚本内的多于一个位置处,将所述代码的所述至少一部分插入和/或复制到所述脚本中。
6.根据任一前述权利要求所述的方法,包括以下步骤:
使用至少一个数据项来确定将所述代码的至少一部分插入/复制到所述脚本中的次数。
7.根据任一前述权利要求所述的方法,其中:
所述控制流机制是循环,比如for循环,或者是选择控制机制,比如switch语句。
8.根据任一前述权利要求所述的方法,其中:
所述至少一个数据项从编译器得出,所述编译器被设置为将代码从高级语言(HLL)转换为区块链交易脚本。
9.根据任一前述权利要求所述的方法,其中:
代码的所述部分包括计数器或索引,该计数器或索引在执行脚本时至少增加一次,该计数器或索引用于控制或影响所述脚本的执行。
10.根据权利要求9所述的方法,其中使用存储在两个基于堆栈的数据结构中的值和/或从两个基于堆栈的数据结构中检索的值,来增加或操纵所述计数器或索引。
11.根据前述权利要求中任一项所述的方法,其中,所述脚本以功能受限的语言编写。
12.一种计算机实现的系统,其被设置为实现前述权利要求中任一项所述的方法。
13.一种计算机可读存储介质,包括计算机可执行指令,所述计算机可执行指令在被执行时将处理器配置为执行权利要求1至11中任一项所述的方法。
14.一种电子设备,包括:
接口装置;
处理器,耦接至所述接口装置;
存储器,耦接至所述处理器,所述存储器其上存储有计算机可执行指令,所述计算机可执行指令在被执行时将所述处理器配置为执行权利要求1-11中任一项所述的方法。

说明书全文

用于控制链交易的所生成脚本的流执行的方法

技术领域

[0001] 本发明总体上涉及区块链技术,并且更具体地涉及通过区块链实现复杂功能。有利地,本发明提供了一种机制,该机制使区块链交易能够包括通常由控制流结构提供的功能。因此,本发明扩展了区块链脚本的能和功能,从而扩展了区块链协议本身,而无需修改底层的现有协议。根据本发明产生的交易可以用作用于实现、影响和指导计算机实现的处理的动作的控制机制。本发明适合于但不限于实现和控制自动化过程。

背景技术

[0002] 在本文中,使用术语“区块链”来涵盖所有形式的基于共识的、基于计算机的电子分布式账本,包括但不限于区块链和交易链技术、经许可和未经许可的账本、共享账本及其变体。区块链技术最广为人知的应用是比特币账本,尽管已经提出并开发了其他区块链实现方式。尽管出于方便和说明的目的在本文中可以提及比特币,但是应当注意,本发明不限于与比特币区块链一起使用,并且替代的区块链实现方式和协议落入本发明的范围内。
[0003] 区块链是一种基于共识的电子账本,其被实现为基于计算机的去中心化的分布式系统,该系统由区块组成,而区块又由交易组成。每个交易是一个数据结构,该数据结构对区块链系统中的参与者之间的数字资产的控制转移进行编码,并包括至少一个输入和至少一个输出。每个区块包含前一个区块的散列,以致于这些区块变为链接在一起,以创建自区块链开始以来就已经写入区块链的所有交易的永久、不可更改的记录。交易包含嵌入其输入和输出中称为脚本的小程序,它们指定如何以及通过谁来访问交易的输出。在比特币平台上,这些脚本是使用基于堆栈的脚本语言来编写的。
[0004] 为了将交易写入区块链,必须对其进行“验证”。网络节点(矿工)进行工作以确保每个交易都有效,而无效交易从网络中被拒绝。安装在节点上的软件客户端通过执行其定和解锁脚本,来对未耗用的交易(UTXO)进行该验证工作。如果锁定和解锁脚本的执行评估为TRUE,则交易有效并且被写入区块链。因此,为了将交易写入区块链,该交易必须i)由接收交易的第一节点来验证-如果交易被验证,则节点将其中继到网络中的其他节点;ii)被加入由矿工建造的新区块;iii)被挖掘,即加入过去交易的公共账本。
[0005] 虽然区块链技术最广为人知的地方在于加密货币实现方式的使用,但是数字企业家已经开始探索比特币所基于的加密安全系统以及可以存储在区块链上以实现新系统的数据这两者的使用。如果区块链可用于并不限于加密货币领域的自动化任务和过程,这将是非常有利的。这样的解决方案将能够利用区块链的好处(例如,事件的永久性、防篡改证明记录,分布式处理等),同时在其应用中更通用。

发明内容

[0006] 根据本发明,提供了如所附权利要求中所定义的计算机实现的系统/方法。
[0007] 本发明可以提供一种计算机实现的方法。可以将其描述为被设置成使得能够生成区块链交易(Tx)或适于生成区块链交易(Tx)的方法。另外或作为替代,其可被描述为用于控制交易(Tx)脚本的执行从而控制或影响与区块链交易相关联的输出是否被解锁(耗用)的方法。因此,它是一种控制或影响加密过程的方法。该方法也可以描述为通过区块链网络控制资源的转移或交换。本发明也可以被描述为提供一种安全技术,该安全技术允许或使得能够在区块链脚本之内或由区块链脚本提供图灵完整的功能,而不会损害对利用(exploits)的适应性。因此,本发明提供了一种增强的区块链,因为可以以更复杂和技术上更优越的方式在区块链网络上执行转移和交换,同时保持安全性和防止对协议的利用。
[0008] 该方法可以包括使用软件资源来接收或生成或得出至少一个数据项的步骤。数据项也可以称为“信号”、“值”、“参数”或“输入”。数据项可以作为信号被接收。其可以从链外源接收。因此,数据项可以用于确定代码被复制或插入到脚本中的次数,并且可以在脚本之外被确定和/或生成。其可以由计算资源作为计算结果来生成。其可以通过使用随机或伪随机数生成器来生成。
[0009] 可以包括以下步骤:将代码的至少一部分至少一次插入与区块链交易相关联的脚本中或针对区块链交易的脚本中,从而在执行脚本时,其提供了控制流机制的功能。代码的该部分可以预先指定或预先编写。其可以存储在基于计算机的资源中,并且可以在插入脚本之前从存储中检索。
[0010] 该脚本可以与交易相关联,因为它形成交易的一部分和/或可以用于锁定/解锁要使用该交易转移的一部分加密货币。
[0011] 该方法可以包括生成区块链交易的步骤。该方法可以包括将交易提交给区块链网络的步骤。其可以包括以下步骤:使用交易将资源或对资源的控制从一个节点或一方转移到网络上的另一节点或另一方。
[0012] 控制流机制的行为/执行可由至少一个数据项控制或影响。优选地,在插入代码的至少一部分之后,脚本可以不包括任何图灵完整控制结构(例如,循环、递归跳转、高级控制结构)。优选地,在至少一次插入代码的至少一部分之后,脚本兼容于在使用功能受限(非图灵完整)语言的区块链上执行。这可以是实现比特币协议或其变体的区块链使用的Script语言。
[0013] 该脚本可以与区块链交易的输入或输出相关联。可以根据区块链协议来生成交易。这可以是比特币协议。该脚本可以用Script编程语言或其他基于堆栈的脚本语言编写。脚本可以以功能受限(也可以称为“非图灵完整”)的语言来编写。该语言不固有地支持一种或多种控制流机制比如循环和/或递归跳转,从这一意义上来说,该语言在功能上受限。
[0014] 该方法可以包括以下步骤:多于一次地和/或在脚本内多于一个位置处,将代码的至少一部分插入和/或复制到脚本中。
[0015] 该方法可以包括步骤:使用至少一个数据项来确定代码的至少一部分被插入/复制到脚本中的次数。
[0016] 控制流机制可以是循环、比如for或while循环,也可以是选择控制机制比如switch/Case语句。
[0017] 所述至少一个数据项可以从编译器得出,所述编译器被布置为将代码从高级语言(HLL)转换成区块链交易脚本。
[0018] 代码的该部分可以包括计数器或索引,该计数器或索引在执行脚本时至少增加一次,该计数器或索引用于控制或影响脚本的执行。
[0019] 可以使用存储在两个基于堆栈的数据结构中和/或从中检索的值来增加或操纵计数器或索引。
[0020] 本发明还可以包括被布置为实现本文描述的任何实施方式的方法的计算机实现的系统。关于该方法描述的任何方面或特征也可以适用于相应的系统。该系统可以包括至少一个基于计算机的资源。它还可以包括一个或更多个区块链节点。
[0021] 本发明还提供一种系统,包括:
[0022] 处理器;以及
[0023] 包括可执行指令的存储器,该可执行指令由于处理器的执行而使系统执行本文所述的计算机实现的方法的任何实施方式。
[0024] 本发明还提供一种其上存储有可执行指令的非暂时性计算机可读存储介质,该可执行指令由于计算机系统的处理器执行而使该计算机系统至少执行本文所述的计算机实现的方法的实施方式。附图说明
[0025] 通过在此描述的实施方式,本发明的这些和其他方面将变得明显,且将参考在此所述的实施方式阐述本发明的这些和其他方面。现在参考附图仅作为示例描述本发明的实施方式,在附图中:
[0026] 图1提供了现有技术中已知的去中心化区块链网络的简单图示。
[0027] 图2示出了例示根据本发明实施方式的流程图
[0028] 图3示出了可根据本发明使用的与区块链相关联的示例性网络。

具体实施方式

[0029] 比特币网络是区块链实现的一个示例,如图1所示。比特币利用一种称为Script的脚本语言。脚本是一种类似于Forth的语言,其使用一组原语运算符或命令(称为操作码)来创建相对简单的程序。Script使用称为堆栈的数据结构用于在程序执行期间临时存储数据项(变量和常量)。将数据项推到堆栈上,一个放在另一个之上,然后以相反的顺序弹出。通常,被推入堆栈的项将随后弹出,以便将其用作下一个操作的操作数。在Script程序结束时,堆栈顶部留下的值为返回值。
[0030] 如在其他基于堆栈的语言(例如Forth)中已知的那样,有权访问另一个堆栈通常很方便。在Script中,第二个堆栈被称为alt堆栈,而第一个堆栈被称为主堆栈。alt堆栈通常用于在脚本执行期间存储临时数据。
[0031] 然而,与Forth相比,Script不具有用于执行复杂控制流语句(例如循环)的内置语法。控制流语句是用于影响和指示(即控制)程序执行方式的编程机制。特定值用于确定逻辑在运行时采用的路径。这些值可以硬编码到程序中,也可以在运行时作为动态输入提供。然后可以在决策过程中使用该值(例如,值a是否小于或等于值b?字符串x=“Hello World!”吗?)。控制流语句的示例包括while循环、for循环和switch-case语句。
[0032] Script对该机制的禁止是一种故意的安全功能:复杂控制机制会潜在地使区块链网络易于受到比如拒绝服务(DOS或DDOS)攻击这样的利用(exploit)。然而,权衡方式是程序员在编写Script代码的方式上受限制,例如在源代码中不能包括循环。这导致一些人将Script描述为非图灵完整的(尽管其他人反驳该定义)。一种已知的比特币替代方案以太坊试图通过将图灵完整的语言作为固有特征纳入其协议中,来克服该限制。然而,在撰写本说明书时,以太坊遭受了至少一个严重的利用(exploit)。
[0033] 因此,需要提供一种技术方案,以解决功能受限的区块链脚本语言(例如Script)提供的安全性与通过区块链平台执行更复杂功能的愿望之间的权衡。理想上,这将以经由软件资源比如通过自动化促进编码过程的方式来实现。
[0034] 本发明提供了针对至少该问题的解决方案,并实现一种机制,由此可实现复杂控制流机制的功能,或在区块链上使用功能上受限的脚本语言至少模拟复杂控制流机制的功能。(由于在该领域内关于Script的图灵完整性的争论,可在此将该语言称为“功能受限”,而不是“非图灵完整”,尽管术语可互换使用)。在此使用的仅用于示例目的的例子呈现了允许模拟for循环和switch-case控制序列的解决方案。本领域技术人员将理解,本发明可以提供其他类型的控制流机制。
[0035] 可根据本发明使用的处理在图2的流程图中示出。根据本发明,针对如何在交易(Tx)脚本内控制逻辑做出确定。例如,该确定可以是对每迭代一循环在主体内应执行的语句的预先确定,或对在switch结构中针对每个选项(case)应执行的语句的预先确定。这些可以作为代码的(一个或多个)部分被存储,以供随后在脚本/交易生成期间的检索。
[0036] 一旦生成或接收,然后使用该确定来针对区块链交易的脚本生成代码。其可以是解锁脚本、赎回脚本或解锁脚本。特别地,代码的一部分在脚本内的适当位置处被插入到脚本中期望的次数。
[0037] 代码的部分可以例如是执行循环的实例的代码,或switch命令序列中的选项。代码的部分根据需要在脚本内重复,使得基于数据项的值和/或对条件的评估可能执行一个或更多个语句。例如,如果(i<3),则<执行循环的主体>,或如果(i==2),则<执行语句并跳出switch>。
[0038] 脚本代码的生成可手动执行。然而,在本发明的优选实施方式中,代码(以及整个交易)通过自动化过程生成,即通过在处理器上运行的适当设置的软件资源或代理执行。
[0039] 在该实施方式中,软件代理被设置为接收或生成数据项。该数据项是输入或信号,可用于确定需要在脚本内设置代码的部分的次数。可使用相同或另一数据项来控制评估期间脚本的执行,例如通过在控制循环的条件内使用,或通过作为针对其测试分支语句(switch case)的值来使用。
[0040] 另外,代码的部分可预先确定且存储在存储器中。当软件代理需要生成脚本时,可从存储器访问代码的部分,将其根据需要多次插入脚本中,且相应地调适该代码的部分,从而使用上述数据项测试相关控制条件。
[0041] 因此,一旦软件代理接收了相关数据项,其可使用该数据项来生成交易脚本,该交易脚本包括在运行时根据需要模拟复杂控制流功能的代码。在区块链交易的生成中可使用该脚本,然后可将该区块链交易提交到网络以用于验证和传播。
[0042] 因此,本发明可用来控制与区块链交易的输入/输出相关联的脚本执行的方式。实际上,这控制了是否可耗用与交易(Tx)相关联的输出,且又控制了是否可将区块链上资产(即加密货币的一部分、令牌等)的加密拥有权从一个实体转移到另一个实体。在另一意义上,本发明控制或影响加密过程。
[0043] 现在提供例子来分析并解释以上说明的概念和技术。
[0044] 用例1:模拟for循环
[0045] 在该例子中,提供了基于Script的操作序列,其模拟for循环的行为,就像for循环由该语言固有地支持一样。
[0046] 循环是如下形式:
[0047] for i in[K,N]
[0048] <执行语句>//循环的“主体”
[0049] end
[0050] 令K和N分别为间隔I=[K:N]的下限和上限。操作顺序采用以下形式:
[0051] OP_N OP_K OP_2DUP OP_SWAP OP_TOALTSTACK OP_TOALTSTACK
[0052]
[0053]
[0054]
[0055]
[0056] …
[0057] …
[0058]
[0059] OP_DROP OP_DROP
[0060] 应注意,表示循环的实例的框被多次提供,比如P次,且P>N。此外,循环主体<执行语句>的代码不应修改主堆栈或alt堆栈的状态。
[0061] 循环示例1:从0到2的循环
[0062] 在下面的示例中,假设框中的代码被复制了3次。在该示例中,验证<执行语句>被执行2次。
[0063] 考虑以下代码片段
[0064] OP_2OP_0OP_2DUP OP_SWAP OP_TOALTSTACK OP_TOALTSTACK
[0065] 堆栈应如下所示(左列是主堆栈,右列是alt堆栈):
[0066]
[0067] OP_GREATERTHAN
[0068] OP_IF
[0069] OP_FROMALTSTACK OP_1ADD OP_TOALTSTACK
[0070] <执行语句>
[0071] OP_ENDIF
[0072] OP_FROMALTSTACK OP_FROMALTSTACK OP_2DUP OP_TOALTSTACK
[0073] OP_TOALTSTACK OP_SWAP
[0074]
[0075] OP_GREATERTHAN
[0076] OP_IF
[0077] OP_FROMALTSTACK OP_1ADD OP_TOALTSTACK
[0078] <执行语句>
[0079] OP_ENDIF
[0080] OP_FROMALTSTACK OP_FROMALTSTACK OP_2DUP OP_TOALTSTACK
[0081] OP_TOALTSTACK OP_SWAP
[0082]
[0083] OP_GREATERTHAN
[0084] OP_IF
[0085] OP_FROMALTSTACK OP_1ADD OP_TOALTSTACK
[0086] <执行语句>
[0087] OP_ENDIF
[0088] OP_FROMALTSTACK OP_FROMALTSTACK OP_2DUP OP_TOALTSTACK
[0089] OP_TOALTSTACK OP_SWAP
[0090]
[0091] OP_DROP OP_DROP
[0092]
[0093] 用例2:模拟switch-case命令序列
[0094] 在此示例中,描述switch命令序列的比特币Script模拟。希望模拟以下类型的命令序列:
[0095]
[0096]
[0097] 现在,令X成为要检查的值。在使用比特币Script语言的语法编写时,switch-case代码变为:
[0098] OP_X OP_DUP OP_TOALTSTACK
[0099] OP_1OP_EQUAL
[0100] OP_IF
[0101] <执行语句1>
[0102] OP_ENDIF
[0103] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK
[0104] OP_2OP_EQUAL
[0105] OP_IF
[0106] <执行语句2>
[0107] OP_ENDIF
[0108] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK
[0109] …
[0110] …
[0111] OP_N OP_EQUAL
[0112] OP_IF
[0113] <执行语句N>
[0114] OP_ENDIF
[0115] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK OP_DROP
[0116] 示例1:
[0117] 输入信号为OP_2。检查到代码仅执行了<执行语句2>,并假定代码包含三个语句。
[0118] OP_2OP_DUP OP_TOALTSTACK
[0119]
[0120] OP_1OP_EQUAL
[0121]
[0122] OP_IF
[0123] <执行语句1>
[0124] OP_ENDIF
[0125] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK
[0126]
[0127] OP_2OP_EQUAL
[0128]
[0129] OP_IF
[0130] <执行语句2>
[0131] OP_ENDIF
[0132] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK
[0133]
[0134] OP_3OP_EQUAL
[0135]
[0136] OP_IF
[0137] <执行语句3>
[0138] OP_ENDIF
[0139] OP_FROMALTSTACK OP_DUP OP_TOALTSTACK
[0140]
[0141] OP_DROP
[0142]
[0143]
[0144] 区块链网络
[0145] 现在参考图3,其以框图形式示出了与区块链相关联的示例性网络,该网络在本文中可以被称为区块链网络100,并且可以用于实现本发明。区块链网络100是一个点对点的开放成员网络,任何人可以加入其中,无需邀请或经过其他成员同意。运行区块链协议(区块链网络100在该协议下操作)的实例的分布式电子装置可以参与区块链网络100。这种分布式电子装置可称为节点102。区块链协议例如可以是比特币协议,或其他加密货币。
[0146] 运行区块链协议且形成区块链网络100的节点102的电子装置可以是各种类型的装置,包括例如计算机(比如台式计算机、膝上型计算机、平板计算机)、服务器、诸如智能电话这样的移动装置、诸如智能手表这样的可穿戴计算机、或其他电子装置。
[0147] 区块链网络100的节点102使用合适的通信技术相互耦接,所述通信技术可包括有线和无线通信技术。在许多情况下,区块链网络100至少部分地在因特网上实现,且一些节点102可位于地理上分散的位置处。
[0148] 节点102维护区块链上所有交易的全局账本,其被分为区块,且每个区块包含链中前一个区块的散列。全局账本是分布式账本,且每个节点102可以存储全局账本的完整副本或部分副本。影响全局账本的节点102的交易由其他节点102验证,从而维护全局账本的有效性。实现和操作区块链网络(比如使用比特币协议的区块链网络)的细节为本领域技术人员所了解。
[0149] 每个交易一般具有一个或更多个输入以及一个或更多个输出。嵌入输入和输出中的脚本指定了如何以及通过谁来访问交易的输出。交易的输出可以是作为交易的结果的值要被转移到的地址。该值然后作为未耗用的交易输出(UTXO)与该输出地址相关联。随后的交易然后可以将该地址引为输入,从而消费或分散该值。
[0150] 节点102可完成从网络路由到钱包服务的许多不同功能,以维护稳健且安全的、去中心化的公共账本。“完整节点”包含区块链的完整且最新的副本,且因此可验证公共账本上的任何交易(耗用的或未耗用的)。“轻量级节点”(或SPV)维护区块链的子集,且可使用“简单支付验证”技术验证交易。轻量级节点仅下载区块的头部,而不下载每个区块内的交易。因此这些节点依赖于对等节点,来验证其交易。“挖掘节点”可以是完整节点或轻量级节点,负责验证交易并在区块链上创建新区块。“钱包节点”通常是轻量级节点,处理用户的钱包服务。节点102使用连接导向的协议彼此通信,该协议比如是TCP/IP(传输控制协议)。
[0151] 应当注意,上述实施方式说明而不是限制本发明,并且本领域技术人员将能够设计许多替代实施方式而不会脱离由所附权利要求限定的本发明的范围。在权利要求中,括号内的任何附图标记均不应理解为限制权利要求。词汇“包括”(comprising,comprise)等不排除在任何权利要求或整个说明书中列出的元件或步骤之外还存在元件或步骤。在本说明书中,“包括”(comprises)指的是“包括(includes)或包括(consists of)”,且“包括”(comprising)指的是“包括”(including or consisting of)。元件的单数指称不排除该元件的复数指称,反之亦然。本发明可以通过包括若干不同元件的硬件以及通过适当编程的计算机来实现。在列举若干装置的设备权利要求中,这些装置中的若干个可以由一项且同一项硬件来实现。在互不相同的从属权利要求中记载某些措施这一事实并不意味着不能有利地使用这些措施的组合。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈