CN113874839A - 区块链交易内的脚本内函数 - Google Patents
区块链交易内的脚本内函数 Download PDFInfo
- Publication number
- CN113874839A CN113874839A CN202080038405.8A CN202080038405A CN113874839A CN 113874839 A CN113874839 A CN 113874839A CN 202080038405 A CN202080038405 A CN 202080038405A CN 113874839 A CN113874839 A CN 113874839A
- Authority
- CN
- China
- Prior art keywords
- script
- transaction
- opcode
- instance
- lock
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/311—Functional or applicative languages; Rewrite languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/02—Payment architectures, schemes or protocols involving a neutral party, e.g. certification authority, notary or trusted third party [TTP]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/04—Payment circuits
- G06Q20/06—Private payment circuits, e.g. involving electronic currency used among participants of a common payment scheme
- G06Q20/065—Private payment circuits, e.g. involving electronic currency used among participants of a common payment scheme using e-cash
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/30—Payment architectures, schemes or protocols characterised by the use of specific devices or networks
- G06Q20/36—Payment architectures, schemes or protocols characterised by the use of specific devices or networks using electronic wallets or electronic money safes
- G06Q20/367—Payment architectures, schemes or protocols characterised by the use of specific devices or networks using electronic wallets or electronic money safes involving electronic purses or money safes
- G06Q20/3678—Payment architectures, schemes or protocols characterised by the use of specific devices or networks using electronic wallets or electronic money safes involving electronic purses or money safes e-cash details, e.g. blinded, divisible or detecting double spending
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/50—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q2220/00—Business processing using cryptography
Landscapes
- Engineering & Computer Science (AREA)
- Business, Economics & Management (AREA)
- Accounting & Taxation (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Finance (AREA)
- Strategic Management (AREA)
- General Business, Economics & Management (AREA)
- General Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Computer Security & Cryptography (AREA)
- Signal Processing (AREA)
- Computing Systems (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种执行区块链的交易的方法。所述交易包括至少一个输出,所述至少一个输出包括锁定脚本,并且所述锁定脚本包括第一操作码的实例和第二操作码的一个或更多个实例。所述第二操作码的每个实例分隔所述锁定脚本的各部分。在调用所述第一操作码的所述实例时,从至少一个堆栈中读取第一数据元素,在使用不同交易的解锁脚本执行所述锁定脚本期间生成所述第一数据元素。输出所述锁定脚本的第一部分,所述第一部分跟在对应于所述第一数据元素的所述第二操作码的实例之后。
Description
技术领域
本公开涉及使用区块链的交易来实现脚本内复合函数。例如,复合函数可用于在交易的脚本中创建循环。
背景技术
区块链是指一种分布式数据结构形式,其中在点对点(P2P)网络中的多个节点中的每个节点处维护区块链副本。区块链包括一系列数据区块,其中每个区块包括一笔或多笔交易。每笔交易都可以回指序列中的先前交易。交易可以通过提交到网络包括在新区块中。新区块的创建过程称为“挖掘”,该过程涉及多个挖掘节点中的每个挖掘节点争相执行“工作量证明”,即基于等待包括在区块中的未决交易池解决加密难题。
区块链中的交易通常用于传递数字资产,即用作价值储存手段的数据。但是也可利用区块链实现区块链上的分层附加功能。例如,区块链协议可允许在交易输出中存储附加用户数据。现代区块链在单一交易中可储存的最大数据容量在不断增加,从而能够并入更复杂的数据。例如,这可用于在区块链中存储电子文档,甚至音频或视频数据。
网络中的每个节点可以具有以下三个角色中的任何一个、两个或全部:转发、挖掘和存储。转发节点在整个网络节点中传播交易。挖掘节点将交易挖掘到区块中。存储节点各自对区块链中的已挖掘区块存储自己的副本。为了将交易记录在区块链中,一方将该交易发送到网络中的节点中的一个节点进行传播。接收该交易的挖掘节点可以争相将该交易挖掘到新区块中。每个节点被配置为遵守相同的节点协议,该协议将包括用于确认交易有效的一个或更多个条件。无效交易将不会传播或挖掘到区块中。假定交易已经核实有效,从而在区块链上被接受,则该交易(包括任何用户数据)将因此作为不可改变的公共记录,继续存储在P2P网络中的各个节点处。
成功解决工作量证明难题以创建最新区块的矿工通常被奖励一笔称为“区块创始交易”的新交易,该交易会生成新的数字资产金额。工作量证明激励矿工不要欺骗***,在他们的区块中包括双重花费交易,因为挖掘区块需要大量计算资源,而包括试图双重花费的区块很可能不会被其他节点接受。
在“基于输出的”模型(有时称为基于UTXO的模型)中,给定交易的数据结构包括一个或更多个输入和一个或更多个输出。任何可花费输出包括指定数字资产金额的元素,有时称为UTXO(“未花费的交易输出”)。该输出还可以包括指定用于赎回该输出的条件的锁定脚本。每个输入包括指向先前交易中的此类输出的指针,并且还可以包括解锁脚本以用于解锁指向输出的锁定脚本。因此,考虑一对交易,将其称为第一交易和第二交易(或“目标”交易)。第一交易包括指定数字资产金额的至少一个输出,并且包括定义解锁该输出的一个或更多个条件的锁定脚本。第二目标交易包括至少一个输入和解锁脚本,该至少一个输入包括指向第一交易的输出的指针;该解锁脚本用于解锁第一交易的输出。
在此类模型中,当第二目标交易被发送到P2P网络以在区块链中传播和记录时,在每个节点处应用的有效性条件之一将是:解锁脚本满足在第一交易的锁定脚本中定义的一个或更多个条件中的所有条件。另一条件将是:第一交易的输出尚未被另一早期有效交易赎回。根据这些条件中的任何一个条件发现目标交易无效的任何节点都不会传播该交易,也不会包括该交易以便挖掘到要记录在区块链中的区块中。
另一种交易模型是基于账户的模型。在这种情况下,每笔交易均不通过参考过去交易序列中先前交易的UTXO来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。
区块链协议可以对交易使用脚本语言。脚本本质上是元素列表,这些元素可以是数据或指令。这些指令在文献中称为脚本字、操作码、命令或函数。操作码(操作代码的简称)对脚本中的数据执行预定义操作。
一种区块链脚本语言是基于Forth的双堆栈实现,但不包括任何循环功能。Forth使用双堆栈,其中数据堆栈为主堆栈,返回堆栈为额外堆栈
发明内容
一个此类操作码是OP_RETURN。在原始区块链协议中,OP_RETURN的目的是终止执行脚本。它不会核实包含该脚本的交易无效。但是,当OP_RETURN包括在交易的输入脚本中时,这会导致欺诈性攻击。具体地说,包含OP_RETURN的交易的任何输入脚本都可以用于解锁先前交易的输出脚本。因此,对协议进行了更改,以便在现有区块链协议中,操作码OP_RETURN表示可证明不可花费的交易输出,允许在区块链上存储数据。在现有协议中,OP_RETURN操作码用于终止执行脚本,同时核实交易无效。然而,这会导致区块链内的功能丢失,因为当与任何解锁脚本一起运行时,其输入脚本中具有OP_RETURN的任何交易都不会导致“TRUE”(或有效)执行。
另一操作码是OP_CODESEPARATOR(OCS)。OCS是对操作码OP_CHECKSIG“可见”的操作码,这意味着OP_CHECKSIG可以定位下一个OCS在脚本中的位置。通常,OP_CHECKSIG将在最后一个OCS执行之后,根据所有数据检查脚本中的签名是否完整。
根据在本文中所公开的一个方面,提供了一种执行区块链的交易的方法,其中所述交易包括至少一个输出,所述至少一个输出包括锁定脚本,其中所述锁定脚本包括第一操作码的实例和第二操作码的一个或更多个实例,所述第二操作码的每个实例分隔所述锁定脚本的各部分,并且其中所述方法包括:在调用所述第一操作码的所述实例时,从至少一个堆栈中读取第一数据元素,其中,在使用不同交易的解锁脚本执行所述锁定脚本期间生成所述第一数据元素;以及输出所述锁定脚本的第一部分,所述第一部分跟在对应于所述第一数据元素的所述第二操作码的实例之后。
在这里,所述第一操作码具有所述第二操作码的可见性,从而允许“选择”所述锁定脚本的各部分。换句话说,可以标识和输出位于所述第二操作码的特定实例之后的脚本的各部分,例如要执行的部分。这可用于启用脚本内循环,方法是从所述锁定脚本的一个部分跳转到另一个部分,依此类推。
所述第一操作码可以是OP_RETURN操作码。在这里,重新定义了OP_RETURN函数,因此该函数的目的不再是终止执行脚本并核实交易无效。相反,OP_RETURN接收所述第二操作码的标识符或实例,并输出跟在所述第二操作码的该实例之后的所述脚本。在某些情况下,OP_RETURN可用于向前或向后跳转到所述脚本的另一部分,而不是从一端到另一端执行所述脚本。例如,所述脚本的一些部分可能会执行多次,还有一些部分可能根本不会执行或者可能会以不同的顺序执行。
所述第二操作码可以是所述OP_CODESEPARATOR(OCS)操作码。OCS放置在脚本的各部分之间,从而有效地分隔这些部分。OP_RETURN能够定位脚本中OCS的实例,以便输出跟在特定实例之后的所述脚本。
为简洁起见,所述第一操作码在下文中将称为“OP_RETURN”或“终止操作码”,所述第二操作码将称为“OP_CODESEPARATOR”或“分隔符操作码”。然而,本公开不限于具有这些特定标签的操作码。更概括地说,虽然实施例将根据区块链脚本语言的OP_RETURN进行描述,但是相同的教导可以由任何操作码来实现,该操作码当由脚本引擎(例如,脚本解释器)调用时从堆栈中读取第一数据元素,并输出跟在对应于该数据元素的第二操作码的实例之后的脚本的一部分。类似地,虽然实施例将根据OP_CODESEPARATOR进行描述,但是相同的教导可以由分离脚本的各部分并且对所述第一操作码可见的任何操作码来实现。
对所述第一操作码的第一和第二实例的引用应解释为相同类型的操作码的实例。类似地,对所述第二操作码的第一和第二实例的引用应解释为相同类型的操作码的实例,所述第一操作码和所述第二操作码是不同类型的操作码。
附图说明
为了帮助理解本公开的实施例并示出如何实施此类实施例,现将仅通过举例的方式参考附图进行说明,其中:
图1是一种用于实现区块链的***的示意性框图;
图2示意性地示出了可记录在区块链中的交易的一些示例;
图3是一种用于执行交易的节点软件的示意性框图;
图4是欧几里德算法中输入a=105且b=28的脚本内复合函数的循环解包的示例;
图5是输入7,G的脚本内椭圆曲线点乘法的示例。
具体实施方式
图1示出了一种用于实现区块链150的示例性***100。***100包括分组交换网络101,通常是诸如互联网的广域互联网。分组交换网络101包括多个节点104,该多个节点被设置成在分组交换网络101内形成点对点(P2P)覆盖网络106。每个节点104包括对等体的计算机设备,不同的节点104属于不同的对等体。每个节点104包括含一个或更多个处理器的处理装置,例如一个或更多个中央处理单元(CPU)、加速器处理器、特定应用程序处理器和/或现场可编程门阵列(FPGA)。每个节点还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等的磁介质、诸如固态硬盘(SSD)、闪存或电可擦可编程只读存储器(EEPROM)等的电子媒介和/或诸如光盘驱动器等的光学介质。
区块链150包括一系列数据区块151,其中在P2P网络160中的多个节点中的每个节点处维护相应的区块链150副本。区块链中的每个区块151均包括一笔或多笔交易152,其中该上下文中的交易是指一种数据结构。数据结构的性质将取决于用作交易模型或计划的一部分的交易协议类型。给定的区块链通常全程使用一个特定的交易协议。在一种常见的交易协议中,每笔交易152的数据结构至少包括一个输入和至少一个输出。每个输出指定一个金额,该金额表示属于输出被加密锁定的用户103的数字资产值(需要该用户的签名进行解锁,从而进行赎回或花费)。每个输入指向先前交易152的输出,从而链接这些交易。
节点104中的至少一些节点扮演转发节点104F的角色,这些节点转发并因此传播交易152。节点104中的至少一些节点扮演挖掘区块151的矿工104M的角色。节点104中的至少一些节点扮演存储节点104S(有时也称为“完整副本”节点)的角色,每个存储节点均在相应的存储器中存储相同区块链150的相应副本。每个矿工节点104M还维护等待挖掘到区块151中的交易152的池154。给定节点104可以是转发节点104、矿工104M、存储节点104S或其中两个节点或所有节点的任意组合。
在给定的当前交易152j中,输入(或每个输入)包括指针,该指针引用交易序列中先前交易152i的输出,指定该输出将在当前交易152j中被赎回或“花费”。通常,当前交易可以是池154或任何区块151中的任何交易。尽管为了确保当前交易有效,将需要存在先前交易152i并核实其有效,但是在创建当前交易152j甚至向网络106发送当前交易152j时,不必存在先前交易152i。因此,在本文中,“先前”是指由指针链接的逻辑序列中的前任,而不一定是时间序列中的创建时间或发送时间,因此,不一定排除无序创建或发送交易152i、152j的情况(参见下面关于孤立交易的讨论)。先前交易152i同样可以称为先行交易或前任交易。
当前交易152j的输入还包括先前交易152i的输出被锁定到的用户103a的签名。反过来,当前交易152j的输出可以加密锁定到新用户103b。因此,当前交易152j可将先前交易152i的输入中定义的金额转移到当前交易152j的输出中定义的新用户103b。在某些情况下,交易152可具有多个输出,以在多个用户间分割输入金额(其中一个可以是原始用户103a,以便进行变更)。在某些情况下,交易还可以具有多个输入,以将一个或更多个先前交易的多个输出中的金额汇总在一起,并重新分配到当前交易的一个或更多个输出。
上述可称为“基于输出的”交易协议,有时也称为未花费的交易输出(UTXO)的协议(其中输出称为UTXO)。用户的总余额不是用区块链中存储的任何一个数字定义的;相反,用户需要特殊“钱包”应用程序105,以整理该用户的所有UTXO值,这些UTXO值分散在区块链151的许多不同交易152中。
作为基于账户的交易模型的一部分,另一种类型的交易协议可称为“基于账户的”协议。在基于账户的情况下,每笔交易均不通过参考过去交易序列中先前交易的UTXO来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。在此类***中,交易使用账户的运行交易记录(也称为“头寸”)进行排序。该值由发送者签名作为其加密签名的一部分,并作为交易引用计算的一部分进行哈希处理。此外,可选的数据字段也可以在交易中签名。例如,如果数据字段中包含先前交易的ID,则该数据字段可指向先前交易。
无论采用何种类型的交易协议,当用户103希望执行新交易152j时,其希望将新交易从其计算机终端102发送至P2P网络106的节点104中的一个(现在通常是服务器或数据中心,但原则上可以是其他用户终端)。此节点104根据在节点104中的每个节点处应用的节点协议检查交易是否有效。节点协议的详细信息将与相关区块链150中使用的交易协议类型相对应,一起形成整个交易模型。节点协议通常要求节点104检查新交易152j中的加密签名是否与预期签名相匹配,这取决于交易152的有序序列中的先前交易152i。在基于输出的情况下,这可包括检查新交易152j的输入中包含的用户加密签名是否与新交易花费的先前交易152i的输出中定义的条件相匹配,其中该条件通常包括至少检查新交易152j的输入中的加密签名是否解锁新交易的输入所指向的先前交易152i的输出。在一些交易协议中,条件可至少部分地由输入和/或输出中包含的自定义脚本定义。或者,这可仅由节点协议单独确定,或可通过其组合确定。无论采用哪种方式,如果新交易152j有效,当前节点会将其转发到P2P网络106中的一个或多个其他节点104。这些节点104中的至少一些节点还作为转发节点104F,根据相同的节点协议应用相同的测试,从而将新交易152j转发到一个或更多个进一步的节点104,依此类推。通过这种方式,新交易在节点104的整个网络中进行传播。
在基于输出的模型中,给定输出(例如,UTXO)是否花费的定义是,根据节点协议,其是否通过另一个随后交易152j的输入有效赎回。交易有效的另一个条件是其试图花费或赎回的先前交易152i的输出尚未被另一笔有效交易花费/赎回。同样,如果无效,交易152j将不会在区块链中传播或记录。这可防止重复花费,即花费者对同一笔交易的输出花费超过一次。另一方面,基于账户的模型通过保持账户余额防止重复花费。因为同样存在定义的交易顺序,账户余额在任何时候均具有单一定义的状态。
除核实之外,节点104M中的至少一些节点在称为挖矿的过程中争先创建交易区块,该过程以“工作量证明”为基础。在挖矿节点104M处,将新交易添加到区块中尚未出现的有效交易的池中。然后,矿工争相通过尝试解决加密难题来组装交易池154中交易152的新的有效区块151。通常情况下,这包括搜索“随机数”值,从而当随机数与交易池154并置且进行哈希处理时,哈希值的输出满足预定条件。例如,预定条件可以是哈希值的输出具有某个预定义的前导零数。哈希函数的特性是,相对于其输入,其具有不可预测的输出。因此,该搜索只能通过强力执行,从而在试图解决难题的每个节点104M处消耗大量的处理资源。
解决难题的第一矿工节点104M在网络106上宣布难题解决,提供解决方案作为证明,然后网络中的其他节点104则可以轻松检查该解决方案(一旦给出哈希值的解决方案,就可以直接检查该解决方案是否使哈希值的输出满足条件)。基于已在每个此类节点处检查获胜者的已宣布解决方案,获胜者已为其解决该难题的交易池154之后由充当存储节点104S的节点104中的至少一些节点记录在区块链150中作为新区块151。区块指针155还分配给指向区块链中先前创建的区块151n-1的新区块151n。工作量证明有助于降低重复花费的风险,因为创建新区块151需要大量工作,并且由于包含重复花费的任何区块都可能被其他节点104拒绝,因此挖矿节点104M受到激励,不允许在其区块中包含双重花费。一旦创建,则不可修改区块151,因为其根据相同的协议在P2P网络106中的存储节点104S中的每个存储节点进行识别和维护。区块指针155还向区块151施加顺序。由于交易152记录在P2P网络106中每个存储节点104S处的有序区块中,因此提供了交易的不可变公共分类账。
应当注意的是,在任何给定时间争相解决难题的不同矿工104M可能会根据任何给定时间的未挖掘交易池154的不同快照执行该操作,具体取决于他们何时开始搜索解决方案。解决相应难题的人员首先定义新区块151n中包含的交易152,并更新当前未挖掘交易池154。然后,矿工104M继续争相从新定义的未完成池154中创建区块,依此类推。此外,还存在解决可能出现的任何“分叉”的协议,其中两名矿工104M彼此在很短的时间内解决难题,从而传播区块链的冲突视图。简言之,分叉方向最长的成为最终区块链150。
在大部分区块链中,获胜矿工104M会自动获得特殊类型的新交易作为奖励,该新交易创建新的数字资产值(与将数字资产金额从一个用户转移至另一个用户的正常交易截然相反)。因此,获胜节点被视为已“挖掘”一定数量的数字资产。这种特殊类型的交易有时称为“生成”交易,其自动形成新区块151n的一部分。该奖励可激励矿工104M争相参与工作量证明。通常情况下,常规(非生成)交易152还将在其输出中的一个输出中指定附加交易费用,以进一步奖励创建其中包含交易的区块151n的获胜矿工104M。
由于挖掘中涉及的计算资源,通常至少矿工节点104M中的每个矿工节点采用服务器的形式,该服务器包括一个或更多个物理服务器单元,甚至整个数据中心。每个转发节点104M和/或存储节点104S还可采取服务器或数据中心的形式。但是,原则上来说,任何给定节点104均可采用一个用户终端或联网在一起的一组用户终端的形式。
每个节点104的存储器均存储被配置为在节点104的处理装置上运行的软件,以根据节点协议执行其相应的角色并处理交易152。应当理解的是,在本文中归因于节点104的任何动作均可通过在相应计算机设备的处理装置上运行的软件执行。节点软件可以在应用层或诸如操作***层或协议层的较低层或这些层任意组合的一个或更多个应用中实现。此外,在本文中使用的“区块链”一词是指一般技术类型的通用术语,不限于任何特定专有区块链、协议或服务。
扮演消费用户角色的多方103中的每一方的计算机设备102也连接到网络101。他们充当交易中的付款人和收款人,但不一定代表其他方参与挖掘或传播交易。他们不一定运行挖矿协议。出于说明目的,示出了双方103及其相应的设备102:第一方103a及其相应的计算机设备102a,以及第二方103b及其相应的计算机设备102b。应当理解的是,更多此类当事方103及其相应的计算机设备102可能存在并参与***,但为了方便起见,未进行说明。每一方103均可以是个人或组织。仅出于说明目的,在本文中,第一方103a称为爱丽丝,第二方103b称为鲍勃,但应当理解的是,这并不仅限于爱丽丝或鲍勃,且本文对爱丽丝或鲍勃的任何引用均可分别用“第一方”和“第二方”替换。
每一方103的计算机设备102包括相应的处理装置,其包括一个或多个处理器,例如一个或多个CPU、图形处理单元(GPU)、其他加速器处理器、特定应用程序处理器和/或FPGA。每一方103的计算机设备102还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。该存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等磁介质、诸如SSD、闪存或EEPROM等电子媒介和/或诸如光盘驱动器等的光学介质。每一方103的计算机设备102上的存储器存储软件,其包括被设置为在处理装置上运行的至少一个客户端应用程序105的相应实例。应当理解的是,在本文中归因于给定方103的任何行动均可通过在相应计算机设备102的处理装置上运行的软件执行。每一方103的计算机设备102包括至少一个用户终端,例如台式或笔记本电脑、平板电脑、智能手机或诸如智能手表等的可穿戴设备。给定方103的计算机设备102还可包括一个或更多个其他网络资源,诸如通过用户终端访问的云计算资源。
客户端应用程序105最初可通过例如从服务器下载的适当计算机可读存储介质,或通过诸如可移动SSD、闪存密钥、可移动EEPROM、可移动磁盘驱动器、软盘或磁带等的可移动存储设备、诸如CD或DVD ROM等的光盘或可移动光驱等提供至任何给定方103的计算机设备102。
客户端应用程序105至少包括“钱包”功能。这有两个主要功能。其中一个功能是使相应的用户方103创建、签名和发送拟在节点104的整个网络中传播的交易152,并因此包含在区块链150中。另一个功能是向相应方汇报其目前拥有的数字资产金额。在基于输出的***中,该第二功能包括整理分散在区块链150中属于相关方的各种交易152的输出中定义的金额。
注意:虽然各种客户端功能可以描述为集成到给定客户端应用105中,但这不一定是限制性的,相反,在本文中所描述的任何客户端功能可以在由两个或更多个不同应用组成的套件中实现,例如经由API进行接口连接或一个应用作为另一个应用的插件。更通俗地说,客户端功能可以在应用层或诸如操作***的较低层或这些层的任意组合实现。下面将根据客户端应用105进行描述,但应当理解的是,这不是限制性的。
每个计算机设备102上的客户端应用程序或软件105的实例可操作地耦合到P2P网络106的转发节点104F中的至少一个转发节点。这可以启用客户端105的钱包功能,以将交易152发送至网络106。客户端105还可联系一个、一些或所有存储节点104,以在区块链150中查询相应方103作为接收者的任何交易(或实际上在区块链150中检查其他方的交易,因为在实施例中,区块链150是在某种程度上通过其公开可见性提供交易信任的公共设施)。每个计算机设备102上的钱包功能被配置为根据交易协议制定和发送交易152。每个节点104运行软件,其被配置为根据节点协议核实交易152有效的软件,并且在转发节点104F的情况下转发交易152,以在整个网络106中传播此类交易。交易协议和节点协议相互对应,给定交易协议和给定节点协议一起实现给定的交易模型。区块链150中的所有交易152均采用相同的交易协议(尽管交易协议可允许其内存在不同的交易子类型)。网络106中的所有节点104采用相同的节点协议(尽管其可根据针对该子类型定义的规则区分处理不同的交易子类型,并且不同的节点还可扮演不同的角色,从而实现协议的不同对应方面)。
如上所述,区块链150包括一系列区块151,其中每个区块151包括通过如前所述的工作量证明过程创建的一个或更多个交易152的集合。每个区块151还包括区块指针155,其指向区块链中先前创建的区块151,以定义区块151的顺序。区块链150还包括有效交易池154,其等待通过工作量证明过程包含在新的区块中。每笔交易152包括指向先前交易的指针,以定义交易序列的顺序(注:交易152的序列可进行分支)。区块151的区块链一直追溯到创始区块(Gb)153,该创始区块是区块链中的第一区块。区块链150中早期的一笔或多笔原始交易152指向创始区块153,而非先前交易。
当给定方103(比方说爱丽丝)希望发送拟包含在区块链150中的新交易152j时,她将根据相关交易协议(使用其客户端应用程序105中的钱包功能)制定新交易。然后,她将交易152从客户端应用程序105发送至其连接的一个或更多个转发节点104F中的一个。例如,这可以是与爱丽丝的计算机102最近或最佳连接的转发节点104F。当任何给定节点104接收新交易152j时,其将根据节点协议及其相应的角色进行处理。这包括首先检查新接收的交易152j是否满足变为“有效”的特定条件,具体示例稍后将详细讨论。在一些交易协议中,有效条件可通过交易152中包含的脚本在每个交易的基础上进行配置。或者,条件可仅仅是节点协议的内置功能,或通过组合脚本和节点协议进行定义。
如果新接收的交易152j通过有效性测试(即:“有效”的条件下),接收交易152j的任何存储节点104S将向在该节点104S处维护的区块链150的副本中的池154中添加新有效交易152。进一步地,接收交易152j的任何转发节点104F随后将有效交易152传播至P2P网络106中的一个或更多个其他节点104。由于每个转发节点104F应用相同的协议,因此假定交易152j有效,这意味着交易很快将在整个P2P网络106中传播。
一旦进入在一个或更多个存储节点104处维护的区块链150的副本中的池154中,矿工节点104M将开始竞相解决包括新交易152的池154的最新版本方面的工作量证明难题(其他矿工104M可继续尝试基于池154的旧视角解决难题,但首先解决难题的矿工将定义下一个新区块151的结束位置和新池154的开始位置,最终将有人解决包括爱丽丝的交易152j的池154的一部分的难题)。一旦包括新交易152j的池154完成工作量证明,其将不可变地成为区块链150中区块151中的一个区块的一部分。每笔交易152包括指向早前交易的指针,因此交易的顺序也被不可变地记录下来。
不同的节点104可以首先接收给定交易的不同实例,并且因此在一个实例被挖掘到区块150中之前具有关于哪个实例“有效”的冲突视图,此时所有节点104同意所挖掘的实例是唯一的有效实例。如果节点104接受一个实例为有效实例,然后发现第二实例已记录在区块链150中,则该节点104必须接受这一点,并将丢弃(即视为无效)其最初接受的未挖掘实例。
图2示出了示例***易协议。这是基于UTXO的协议的示例。交易152(简称“Tx”)是区块链150的基本数据结构(每个区块151包括一笔或更多笔交易152)。下面将通过参考基于输出或基于“UTXO”的协议进行描述。但这并不限于所有可能的实施例。
在基于UTXO的模型中,每笔交易(“Tx”)152包括数据结构,其包括一个或更多个输入202和一个或更多个输出203。每个输出203可包括未花费的交易输出(UTXO),其可用作另一新交易的输入202的来源(如果UTXO尚未赎回)。UTXO指定数字资产金额(价值储存手段)。它还可包含其来源交易的交易ID以及其他信息。交易数据结构还可包括标头201,其可包括输入字段202和输出字段203的大小指示符。标头201还可包括交易的ID。在实施例中,交易ID是交易数据(不含交易ID本身)的哈希值,且存储在提交至矿工104M的原始交易152的标头201中。
比方说爱丽丝103a希望创建转移相关数字资产金额至鲍勃103b的交易152j。在图2中,爱丽丝的新交易152j标记为“Tx1”。该新交易获取在序列中先前交易152i的输出203中锁定至爱丽丝的数字资产金额,并至少将此类金额中的一部分转移至鲍勃。在图2中,先前交易152i标记为“Tx0”。Tx0和Tx1只是任意的标记,其不一定意味着Tx0指区块链151中的第一交易且Tx1指池154中的下一笔交易。Tx1可指向仍具有锁定至爱丽丝的未花费输出203的任何先前(即先行)交易。
当爱丽丝创建其新交易Tx1时,或至少在她将该新交易发送至网络106时,先前交易Tx0可能已经有效并包括在区块链150中。该交易此时可能已包括在区块151中的一个区块中,或者可能仍在池154中等待,在这种情况下,该交易将很快包括在新区块151中。或者,Tx0和Tx1可以创建并一起发送至网络102;或者,如果节点协议允许缓冲“孤立”交易,Tx0甚至可以在Tx1之后发送。本文交易序列上下文中使用的“先前”和“后续”一词是指由交易中指定的交易指针定义的序列中的交易顺序(哪个交易指向哪个其他交易等等)。它们同样可以替换为“前任”和“继任”、“先行”和“后代”或“父项”和“子项”等。这不一定指其创建、发送至网络106或到达任何给定节点104的顺序。然而,指向先前交易(先行交易或“父交易”)的后续交易(后代交易或“子交易”)不会有效除非父交易有效。在父交易之前到达节点104的子交易被视为孤立交易。根据节点协议和/或矿工行为,其可被丢弃或缓冲一段时间,以等待父交易。
先前交易Tx0的一个或更多个输出203中的一个包括特定的UTXO,标记为UTXO0。每个UTXO包括指定UTXO表示的数字资产金额的值以及锁定脚本,该锁定脚本定义后续交易的输入202中的解锁脚本必须满足的条件,以使后续交易有效,从而成功赎回UTXO。通常情况下,锁定脚本将金额锁定至特定方(该金额的交易的受益人)。即,锁定脚本定义解锁条件,该解锁条件通常包括以下条件:后续交易的输入中的解锁脚本包括先前交易被锁定到的一方的加密签名。
锁定脚本(亦称scriptPubKey)是节点协议识别的域特定语言中写入的一段代码。此类语言的特定示例称为“脚本(Script)”(S大写)。锁定脚本指定花费交易输出203所需的信息,例如爱丽丝签名的要求。解锁脚本出现在交易的输出中。解锁脚本(亦称scriptSig)是提供满足锁定脚本标准所需信息的域特定语言中写入的一段代码。例如,其可包含鲍勃的签名。解锁脚本出现在交易的输入202中。
因此在示出的示例中,Tx0的输出203中的UTXO0包括锁定脚本[Checksig PA],该锁定脚本需要爱丽丝的签名Sig PA,以赎回UTXO0(严格来说,是为了使试图赎回UTXO0的后续交易有效)。[Checksig PA]包含爱丽丝的公私密钥对中的公钥PA。Tx1的输入202包括指向Tx1的指针(例如,通过其交易ID(TxID0),其在实施例中是整个交易Tx0的哈希值)。Tx1的输入202包括在Tx0中标识UTXO0的索引,以在Tx0的任何其他可能输出中对其进行标识。Tx1的输入202进一步包括解锁脚本<Sig PA>,该解锁脚本包括爱丽丝的加密签名,该签名由爱丽丝通过将其密钥对中的私钥应用于预定的部分数据(有时在密码学中称为“消息”)创建。爱丽丝需要签名以提供有效签名的数据(或“消息”)可通过锁定脚本、节点协议或其组合进行定义。
当新交易Tx1到达节点104时,该节点应用节点协议。这包括一起运行锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本中定义的条件(其中该条件可包括一个或更多个标准)。在实施例中,这涉及并置两个脚本:
<Sig PA><PA>||[Checksig PA]
其中“||”表示并置,“<…>”表示将数据放在堆栈上,“[…]”表示由解锁脚本组成的函数(在该示例中指基于堆栈的语言)。同样,脚本可以使用公共堆栈一个接一个地运行,而不是并置脚本。无论采用哪种方式,当一起运行时,脚本使用爱丽丝的公钥PA(包括在Tx0的输出的锁定脚本中),以认证Tx1的输入中的锁定脚本是否包含爱丽丝签名预期部分的数据时的签名。预期的部分数据本身(“消息”)也需要包括在Tx0中,以便执行此认证。在实施例中,签名的数据包括整个Tx0(因此不需要包括一个单独的元素来明文指定签名的部分数据,因为其本身便已存在)。
本领域技术人员将熟悉通过公私密码进行认证的细节。基本上而言,如果爱丽丝已通过使用其私钥加密签署消息,则给定爱丽丝的公钥和明文中的消息(未加密消息),诸如节点104等其他实体可认证加密版本的消息必须已经由爱丽丝签名。签署通常包括对消息进行散列,签署哈希值和将此标记到消息的明文版本作为签名,从而使公钥的任何持有者能够认证签名。因此,应当注意的是,在实施例中,在本文中对签名特定数据片段或交易部分等的任何引用可以意味着对该数据片段或交易部分的哈希值进行签名。
如果Tx1中的解锁脚本满足Tx0的锁定脚本中指定的一个或更多个条件(因此,在所示示例中,如果在Tx1中提供了爱丽丝的签名并进行认证),则节点104认为Tx1有效。如果是存储节点104S,这意味着其将添加至等待工作量证明的交易154池。如果是转发节点104F,则其将交易Tx1转发到网络106中的一个或更多个其他节点104,从而将在整个网络中传播。一旦Tx1有效并包括在区块链150中,这将把Tx0中的UTXO0定义为已花费。请注意,Tx1仅在花费未花费的交易输出203时才有效。如果试图花费另一交易152已经花费的输出,则即使满足所有其他条件,Tx1也将无效。因此,节点104还需要检查先前交易Tx0中引用的UTXO是否已经花费(已经形成另一有效交易的有效输入)。这是为何区块链150对交易152施加定义的顺序很重要的原因之一。在实践中,给定节点104可维护单独的数据库,标记已花费交易152的UTXO 203,但最终定义UTXO是否已花费取决于是否在区块链150中形成了另一有效交易的有效输入。
如果给定交易152的所有输出203中指定的总金额大于其所有输入202所指向的总金额,则这是大多数交易模型中的另一失效依据。因此,此类交易将不会传播或挖掘到区块151中。
请注意,在基于UTXO的交易模型中,给定UTXO需要作为一个整体使用。不能“留下”UTXO中定义为已花费的一部分金额,而同时又花费另一部分。但UTXO的金额可以在下一个交易的多个输出之间分割。例如,Tx0的UTXO0中定义的金额可以在Tx1中的多个UTXO之间分割。因此,如果爱丽丝不想将UTXO0中定义的所有金额都给鲍勃,她可以使用剩余部分在Tx1的第二输出中自己找零钱,或者支付给另一方。
在实践中,爱丽丝通常还将需要包括获胜矿工的费用,因为现在仅靠区块创始交易的奖励币通常不足以激励挖掘。如果爱丽丝未包括矿工的费用,Tx0可能会被矿工节点104M拒绝,因此,尽管技术上有效,但仍然不会传播并包括在区块链150中(如果矿工104M不愿意,矿工协议不会强制他们接受交易152)。在一些协议中,挖掘费不需要其自身的单独输出203(即不需要单独的UTXO)。相反,给定交易152中输入202所指向的总金额与输出203所指定的总金额之间的任何差额都将自动提供给获胜矿工104。例如,假设指向UTXO0的指针是Tx1的唯一输入,而Tx1只有一个输出UTXO1。如果UTXO0中指定的数字资产的金额大于UTXO1中指定的金额,则该差额将自动提供给获胜矿工104M。替代地或附加地,这不一定排除可以在其自身交易152的其中一个UTXO 203中明确指定矿工费用。
爱丽丝和鲍勃的数字资产由区块链150中任何位置的任何交易152中的锁定至他们的未花费UTXO组成。因此,通常情况下,给定方103的资产分散在整个区块链150的各种交易152的UTXO中。区块链150中的任何位置均未存储定义给定方103的总余额的一个数字。客户端应用程序105的钱包功能的作用是将锁定至相应方且在其他随后交易中尚未花费的各种UTXO值整理在一起。通过查询在任何存储节点104S(例如,与相应方的计算机设备102最近或最佳连接的存储节点104S)处存储的区块链150副本,可以实现这一点。
请注意,脚本代码通常用示意图表示(即非精确语言)。例如,可写入[ChecksigPA]表示[Checksig PA]=OP_DUP OP_HASH160<H(PA)>OP_EQUALVERIFY OP_CHECKSIG。“OP_...”是指脚本语言的特定操作码。OP_CHECKSIG(又称“Checksig”)是脚本操作码,其取两个输入(签名和公钥),并使用椭圆曲线数字签名算法(ECDSA)验证签名的有效性。在运行时,移除脚本中任何出现的签名(‘sig’),但在由‘sig’输入验证的交易中仍保留附加要求,诸如哈希难题。再如,OP_RETURN是脚本语言操作码,用于创建交易的不可花费输出,其可以将元数据储存在交易中,从而将元数据不可变地记录在区块链150中。例如,元数据可包括需存储在区块链中的文件。
签名PA是数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ECDSA。数字签名对特定的数据段进行签名。在实施例中,对于给定交易,签名将对部分交易输入以及全部或部分交易输出进行签名。对输出的特定部分进行签名取决于SIGHASH标志。SIGHASH标志是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
锁定脚本有时称为“scriptPubKey”,指其包括相应交易被锁定到的当事方的公钥。解锁脚本有时称为“scriptSig”,指其提供相应的签名。但是更通俗地说,在区块链150的所有应用中,UTXO赎回的条件并不一定包括对签名进行认证。更通俗地说,脚本语言可用于定义任何一个或更多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
一些区块链协议使用脚本语言,该脚本语言包括两种类型的元素:数据和操作码。脚本内的数据可以是例如数字、公钥、签名、哈希值等。操作码是对脚本内的数据执行操作的函数。在脚本语言中,脚本从一端运行到另一端(通常是从左到右),并使用称为“堆栈”的数据结构。数据始终被推送到堆栈上(即放置到堆栈上)。操作码可以从堆栈中弹出数据(即从堆栈中获取数据),对数据执行操作,然后可选地将新数据“推送”到堆栈上。在许多区块链中通常使用的脚本语言称为脚本。下面将根据脚本语言的操作码进行描述。
本领域技术人员将熟悉基于堆栈的脚本语言。以下示例示出了示例性脚本实现方式。具体地说,以下示出了示例性核实和解锁过程。
示例性脚本可以包括<鲍勃的签名><鲍勃的公钥>OP_DUP OP_HASH<鲍勃的公共地址>OP_EQUALVERIFY OP_CHECKSIG。该脚本从左到右操作。
步骤1:将<鲍勃的签名>推送到堆栈上
<鲍勃的签名> |
步骤2:将<鲍勃的公钥>推送到堆栈上(这现在是堆栈上的顶部元素)
<鲍勃的公钥> |
<鲍勃的签名> |
步骤3:OP_DUP操作码对堆栈上的顶部元素执行操作,以复制<鲍勃的公钥>。
<鲍勃的公钥> |
<鲍勃的公钥> |
<鲍勃的签名> |
步骤4:OP_HASH操作码弹出并通过哈希算法(后跟一项或更多项可选操作)运行<鲍勃的公钥>,以获取<鲍勃的公共地址>并将其放置到堆栈上。
<鲍勃的公共地址> |
<鲍勃的公钥> |
<鲍勃的签名> |
步骤5:将<鲍勃的公共地址>推送到堆栈上(这现在是堆栈上的顶部元素)
<鲍勃的公共地址> |
<鲍勃的公共地址> |
<鲍勃的公钥> |
<鲍勃的签名> |
步骤6:OP_EQUALVERIFY操作码从堆栈中弹出最后两个元素(<鲍勃的公共地址>和<鲍勃的公共地址>),并检查这两个地址是否相同。如果它们不相同,则认为执行失败。如果条件为TRUE,则执行下一个命令。
<鲍勃的公钥> |
<鲍勃的签名> |
步骤7:OP_CHECKSIG操作码弹出<鲍勃的公钥>>和<鲍勃的签名>>,并检查它们的有效性。此过程完成之后,鲍勃可以解锁交易并访问指定金额的数字资产。
TRUE |
脚本内函数
本发明的实施例提供了在区块链交易内实现脚本内复合函数。这是通过重新定义OP_RETURN函数(或者,配置操作码以执行下面归因于OP_RETURN的函数)来实现的。
图3示出了在基于UTXO或基于输出的模型的示例中,可以在区块链网络106的每个节点104上运行的节点软件300的示例。节点软件300包括脚本引擎301、堆栈302、应用级决策引擎303等组件。脚本引擎301可以包括脚本解释器,该脚本解释器被配置为通过将脚本的部分解释为用于对这些数据元素进行操作和/或从堆栈302中推送或读取数据元素的数据元素或函数来执行脚本。或者,脚本引擎301可以采用另一执行形式,例如即时(JIT)编译。通常,在本文中使用的术语“执行”是以任何方式运行脚本的最广义意义(而不是执行编译的机器代码指令的狭义意义)。因此,“执行”可以包括在当前上下文中解释。此外,还应当注意的是,当前上下文中的“操作码”并不是指单个机器代码指令的操作码,而是指由每个节点104处的脚本引擎301映射到相应预定义函数的更高级别命令。
虽然未示出,但所述节点软件还可以包括协议引擎和一个或更多个区块链相关功能模块的集合。在任何给定节点104处,这些模块可以包括以下三个模块中的任何一个、两个或全部:挖掘模块、转发模块和存储模块(取决于该节点的一个或多个角色)。协议引擎被配置为识别交易152的不同字段,并根据节点协议处理此类字段。当接收到的交易152m(Txm)具有指向另一先前交易152m-1(Txm-1)的输出(例如,UTXO)的输入时,协议引擎标识Txm中的解锁脚本并将其传递给脚本引擎401。协议引擎还基于Txm的输入中的指针来标识和检索Txm-1。如果Txm-1尚未在区块链150上,则可以从相应节点自身的未决交易池154中检索Txm-1;或者,如果Txm-1已在区块链150上,则可以从存储在相应节点或另一节点104处的区块链150中的区块151的副本中检索。无论采用哪种方式,协议引擎都会标识Txm-1的指向输出中的锁定脚本,并将其传递给脚本引擎301。
因此,脚本引擎301具有Txm-1的锁定脚本和来自Txm的相应输入的解锁脚本。例如,图4中示出的Tx1和Tx2,但同样可以应用于任何交易对,诸如Tx0和Tx1等。如前所述,脚本引擎301同时运行两个脚本,这将包括根据正在使用的基于堆栈的脚本语言(例如,Script)将数据放置到堆栈302上并从该堆栈中检索数据。
如图3所示,Tx1的锁定脚本包括一个或更多个OCS操作码(在该示例中为两个)和至少一个OP_RETURN。脚本引擎301被配置为在调用OP_RETURN时使用堆栈402顶部的数据元素,并将该数据元素解释为对包括在Tx1的锁定脚本中的OCS操作码中的一个OCS操作码的引用。脚本引擎301还被配置为执行跟在引用的OCS操作码之后的所述锁定脚本的一部分,例如通过使用跟在引用的OCS操作码之后的所述锁定脚本的一部分替换所述锁定脚本的未执行部分。
如上所述,当执行(例如,核实)交易时,该交易的锁定脚本与先前交易的解锁脚本一起执行。该交易可以包括多于一个的锁定脚本。这些锁定脚本中的至少一个包括OP_RETURN和OP_CODESEPARATOR(OCS)的一个或更多个实例。OCS的每个实例分隔所述锁定脚本的各部分。例如,可以有两个OCS操作码来分隔所述锁定脚本的三个部分。除非上下文另有要求,否则第一、第二、第三等仅仅是用于区分同一项中的不同项(例如,OCS、OP_RETURN、部分等)的标签。
作为交易核实的一部分,如果执行所述锁定脚本并且所述锁定脚本包括OP_RETURN,则在调用OP_RETURN时,从其中一个堆栈(例如,Main堆栈或ALT堆栈)中读取数据元素。可以从两个堆栈中读取并组合(例如,求和)数据元素以形成单个数据元素。例如,在执行所述锁定脚本期间生成所述数据元素,直至调用OP_RETURN。所述数据元素可以是数字或其他类型的变量,用于输出所述锁定脚本的第一部分,所述第一部分跟在对应于该数据元素的OCS之后。换句话说,将所述数据元素解释为特定OCS的索引(或地址)。在本文中,“所述锁定脚本的第一部分”并不一定意味着所述锁定脚本的最前面部分。在本文中,“第一”用作标签来指所述锁定脚本的一部分—可以是也可以不是最前面部分,具体取决于从堆栈中读取的数据元素。例如,如果所述锁定脚本中有三个OCS操作码,则可以使用数字1、2和3对它们进行索引。如果所述数据元素对应于所述脚本中的第二OCS,则输出跟在所述第二OCS之后的所述锁定脚本的所述部分。例如,可以将所述锁定脚本的所述部分添加到脚本模板、添加到要执行的指令集和/或执行所述锁定脚本的所述部分。
然后,当执行所述锁定脚本的所述第一部分时,如果所述锁定脚本的所述第一部分包括OP_RETURN的实例,则在调用OP_RETURN的该实例时,可以从堆栈中读取数据元素并将其用作OCS的地址。根据从堆栈中读取的所述数据元素,可以引用相同的OCS或不同的OCS。输出跟在引用的OCS之后的所述锁定脚本的一部分(称为“第二部分”)。在上述示例之后,如果所述数据元素对应于所述脚本中的第一OCS,则输出跟在所述第一OCS之后的所述锁定脚本的所述部分。或者,所述数据元素可以对应于所述第二或第三OCS,在这种情况下,所述输出的所述锁定脚本输出的所述部分将分别跟在所述第二或第三OCS之后。如果相应地选择所述锁定脚本的内容,则可以例如通过重复引用同一OCS操作码集来创建无限循环。
在一些实施例中,在锁定脚本中,每个OP_RETURN之前都有操作码,当被调用时,该操作码将数据元素推送到堆栈顶部。例如,OP_RETURN之前的每个操作码可以将对应于OCS操作码中的一个OCS操作码的数据元素推送到堆栈。
交易的脚本可以由脚本引擎(例如,脚本解释器)读取、执行、解释等。在执行所述锁定脚本之前,所述脚本引擎可以扫描所述锁定脚本以查找OP_RETURN的任何实例。如果所述锁定脚本确实包含OP_RETURN的至少一个实例,则所述脚本引擎可以创建以所述锁定脚本中的最前面OCS开始并以所述锁定脚本的结尾结束的子脚本。该子脚本可以存储在存储器中。在调用OP_RETURN时,将使用堆栈中的数据元素,例如Main堆栈中的顶部元素。如果所述数据元素不是正整数和/或大于所述子脚本中的OCS操作码的总数,则可以结束执行。如果所述数据元素是正整数并且小于或等于所述子脚本中的COS操作码的总数,则输出跟在对应于所述数据元素的OCS之后的所述锁定脚本的一部分。例如,使用跟在第n个OCS之后的所述子脚本的所述部分替换未执行的脚本(即跟在OP_RETURN之后的所述锁定脚本的所述部分),其中n是OP_RETURN使用的数据元素。
当执行所述脚本时,可以将主脚本和子脚本保存在存储器中。所述主脚本是要在堆栈上执行的脚本。所述子脚本是静态的,用作参考脚本—将读取和复制所述子脚本的部分内容。所述子脚本包括跟在所述锁定脚本中的初始OCS之后的所述锁定脚本的全部内容。所述主脚本是动态的,不仅会在执行过程中予以使用,而且在执行过程中还可能会由所述子脚本的某一部分通过OP_RETURN覆盖。例如,每次调用OP_RETURN时,将使用跟在对应于所使用的数据元素的OCS之后的所述子脚本的一部分(即形成所述子脚本的一部分的原始锁定脚本)替换所述主脚本。
用例
图4示出了示例性脚本内函数的执行。该示例性函数执行欧几里德算法。欧几里德算法采用两个输入(a,b),并输出a和b的最大公约数(GCD)。为简单起见,假设a>b。
在该示例中,输入a和b分别是105和28。在堆栈上,数字105将在数字28下方。输出将为GCD(105,28)。要执行的脚本为:OCS OP_TUCK OP_MOD OP_DUP OP_IF OP_1OP_RETURNOP_ENDIF OP_DROP。可以看出,所述脚本包括单个OCS和单个OP_RETURN。OP_RETURN跟在OP_1之后,将值1推送到堆栈。在调用OP_RETURN时,将读取值1并将其用于执行跟在对应的OCS之后的所述脚本的所述部分。现在,由于OCS是所述脚本中的最前面操作码,这等同于重复脚本。
如图4所示,输出为7,即GCD 105和28。在执行时,所述脚本可以循环一次或更多次(在该示例中为一次)。换句话说,调用18个操作码来计算最大公约数105和28。然而,构建所述脚本仅需9个操作码。这样做的一个优点是,可以从交易中包括的较小脚本实现较大的复合脚本。
图5示出了另一示例性脚本内函数的执行。该示例性函数执行椭圆曲线点乘法。函数的输入为(a,G),其中a是标量,G是生成点。在该示例中,a为7。该函数的输出为a·G。
要执行的脚本如下:
在该脚本中,有三个OCS操作码实例(OCS_1、OCS_2、OCS_3”),每个实例分隔所述脚本的不同部分。有四个OP_RETURN实例,每个实例前面都有操作码,该操作码将对应于OCS操作码中的一个OCS操作码的数据元素推送到堆栈。在该示例中,每个OP_RETURN都跟在表示数字的操作码之后。每当遇到OP_RETURN时,使用堆栈上的第一元素,并将新的操作码集复制到脚本板以供执行。图5示出了堆栈(包括数据元素)和脚本板(包括操作码)在OP_RETURN实例之前的演变。
例如,如果执行“OP_DUP[POINT_ADD]OP_2OP_RETURN”,则OP_RETURN将使用堆栈中的数据元素“2”,并继续执行跟在OCS_2之后的脚本。
脚本的工作原理如下:
1)将0推送到ALT堆栈上。该0有助于标识何时到达ALT堆栈的底部。
2)有两个输入(a,G)。检查是否a>1。
a.如果是,则继续执行点加倍。
b.如果否,则开始执行点加法。
3)在执行点加倍的情况下,首先将1推送到堆栈。该1就像一个计数器,记录点加倍的次数。将计数器与a进行比较。复制一份G,其副本供将来使用。
a.如果计数器的值大于a,则计数器的值将减半,然后从a中减去该值。这会创建一个新值a,该值小于原始值。
b.同时,将加倍所得结果推送到ALT堆栈。之后,将1推送到ALT堆栈,以指示存在要从ALT堆栈获取的值。
c.然后,使用OP_RETURN使用新值a执行步骤2。
4)在无法继续加倍的情况下,检查是a=1还是a=0。
a.如果是a=1,则逐个获取ALT堆栈上的每个元素,并执行点加法,直至到达堆栈底部。
b.如果是a=0,首先丢弃G,然后从ALT堆栈获取一个结果,然后返回到上述步骤“a.”。
应当注意的是,点加法由[POINT_ADD]定义,点加倍由OP_DUP[POINT_ADD]([POINT_DOUBLE])定义,作为大量操作码的缩写。[POINT_ADD]使用堆栈上的前两个元素P1和P2,并推动将P1和P2点添加到堆栈。[POINT_DOUBLE]使用堆栈上的第一元素P,并将点2P推送到堆栈上。
应当理解的是,上述实施例仅通过示例的方式进行描述。为清晰起见,实施例不限于具有特定“名称”的操作码。相反,实施例仅限于具有特定函数的操作码。为简洁起见,使用了术语“OP_RETURN”和“OP_CODESEPARATOR”。
根据在本文中所公开的教导的第一实施例,提供了一种执行区块链的交易的计算机实现的方法,其中所述交易包括至少一个输出,所述至少一个输出包括锁定脚本,其中所述锁定脚本包括第一操作码的实例和第二操作码的一个或更多个实例,所述第二操作码的每个实例分隔所述锁定脚本的各部分,并且其中所述方法包括:在调用所述第一操作码的所述实例时,从至少一个堆栈中读取第一数据元素,其中在使用不同交易的解锁脚本执行所述锁定脚本期间生成所述第一数据元素;输出所述锁定脚本的第一部分,所述第一部分跟在对应于所述第一数据元素的所述第二操作码的实例之后。
所述第一操作码可以是终止操作码。所述第二操作码可以是分隔符操作码。
根据第二可选实施例,可以提供一种根据所述第一实施例所述的方法,其中所述输出可以包括至少执行所述锁定脚本的所述第一部分的某些内容。
根据第三可选实施例,可以提供一种根据所述第一或第二实施例所述的方法,其中所述方法可以包括:创建子脚本,所述子脚本从所述第二操作码的第一实例开始并且随后是将在所述第二操作码的所述第一实例之后执行的所述锁定脚本的其余部分,其中所述锁定脚本的所述第一部分是所述子脚本的第一部分。
根据第四可选实施例,可以提供一种根据所述第一至第三实施例中任一个所述的方法,其中所述锁定脚本和所述子脚本可以存储在节点的存储器中,并且其中所述输出可以包括使用所述存储器中所述子脚本的所述第一部分替换所述锁定脚本的未执行部分。
根据第五可选实施例,可以提供一种根据所述第三或第四实施例所述的方法,所述方法可以包括:在执行所述锁定脚本之前,扫描所述锁定脚本以查找所述第一操作码的任何实例;并且如果所述锁定脚本包括所述操作码的任何实例,则创建所述子脚本。
根据第六可选实施例,可以提供一种根据所述第一至第五实施例中任一个所述的方法,其中所述方法可以包括:将所述第一数据元素解释为所述第二操作码的所述实例的地址。
根据第七可选实施例,可以提供一种根据所述第一至第六实施例中任一个所述的方法,其中所述方法可以包括在以下至少一种情况下终止执行所述锁定脚本:所述第一数据元素不是正整数;以及所述第一数据元素大于所述第二操作码的实例的总数。
根据第八可选实施例,可以提供一种根据所述第一至第七实施例中任一个所述的方法,其中所述锁定脚本的所述第一部分可以包括所述第一操作码的第二实例,并且其中所述方法可以包括:在调用所述第一操作码的所述第二实例时,从至少一个堆栈中读取第二数据元素,其中在执行所述锁定脚本的所述第一部分期间生成所述第二数据元素;以及输出所述锁定脚本的第二部分,所述第二部分跟在对应于所述第二数据元素的所述第二操作码的实例之后。
根据第九可选实施例,可以提供一种根据所述第八实施例所述的方法,其中所述输出所述锁定脚本的所述第二部分可以包括至少执行所述锁定脚本的所述第二部分的某些内容。
根据第十可选实施例,可以提供一种根据从属于所述第四实施例的所述第一至第九实施例中任一个所述的方法,其中所述锁定脚本的所述第二部分可以是所述子脚本的第二部分,并且其中所述方法可以包括使用所述存储器中的所述子脚本的所述第二部分替换所述锁定脚本的所述第一部分的未执行部分。
根据在本文中所公开的教导的第十一实施例,提供了一种计算机程序,所述计算机程序包含在计算机可读存储器上,并且被配置为当在区块链网络的节点上运行时,执行根据所述第一至第十实施例中任一个所述的方法。
根据在本文中所公开的教导的第十二实施例,提供了一种计算设备,所述计算设备包括:存储器,所述存储器包括一个或更多个存储器单元;处理装置,所述处理装置包括一个或更多个处理单元,其中所述存储器存储被设置成在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时,执行根据所述第一至第十实施例中任一个所述的方法。
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
Claims (12)
1.一种计算机实现的方法,所述计算机实现的方法执行区块链的交易,其中,所述交易包括至少一个输出,所述至少一个输出包括锁定脚本,其中,所述锁定脚本包括第一操作码的实例和第二操作码的一个或更多个实例,所述第二操作码的每个实例分隔所述锁定脚本的各部分,并且其中,所述方法包括:
在调用所述第一操作码的所述实例时,从至少一个堆栈中读取第一数据元素,其中,在使用不同交易的解锁脚本执行所述锁定脚本期间生成所述第一数据元素;以及
输出所述锁定脚本的第一部分,所述第一部分跟在对应于所述第一数据元素的所述第二操作码的实例之后。
2.根据权利要求1所述的方法,其中,所述输出包括至少执行所述锁定脚本的所述第一部分的某些内容。
3.根据权利要求1或2所述的方法,所述方法包括:
创建子脚本,所述子脚本从所述第二操作码的第一实例开始并且随后是将在所述第二操作码的所述第一实例之后执行的所述锁定脚本的其余部分,其中,所述锁定脚本的所述第一部分是所述子脚本的第一部分。
4.根据权利要求3所述的方法,其中,所述锁定脚本和所述子脚本存储在节点的存储器中,并且其中,所述输出包括使用所述存储器中的所述子脚本的所述第一部分替换所述锁定脚本的未执行部分。
5.根据权利要求3或4所述的方法,所述方法包括:
在执行所述锁定脚本之前,扫描所述锁定脚本以查找所述第一操作码的任何实例;并且
如果所述锁定脚本包括所述操作码的任何实例,则创建所述子脚本。
6.根据前述任一项权利要求所述的方法,所述方法包括将所述第一数据元素解释为所述第二操作码的所述实例的地址。
7.根据前述任一项权利要求所述的方法,所述方法包括在以下至少一种情况下终止执行所述锁定脚本:
所述第一数据元素不是正整数;以及
所述第一数据元素大于所述第二操作码的实例的总数。
8.根据从属于权利要求2的前述任一项权利要求所述的方法,其中,所述锁定脚本的所述第一部分包括所述第一操作码的第二实例,并且其中,所述方法包括:
在调用所述第一操作码的所述第二实例时,从至少一个堆栈中读取第二数据元素,其中,在执行所述锁定脚本的所述第一部分期间生成所述第二数据元素;以及
输出所述锁定脚本的第二部分,所述第二部分跟在对应于所述第二数据元素的所述第二操作码的实例之后。
9.根据权利要求8所述的方法,其中,所述输出所述锁定脚本的所述第二部分包括至少执行所述锁定脚本的所述第二部分的某些内容。
10.根据从属于权利要求4的前述任一项权利要求所述的方法,其中,所述锁定脚本的所述第二部分是所述子脚本的第二部分,并且其中,所述方法包括使用所述存储器中的所述子脚本的所述第二部分替换所述锁定脚本的所述第一部分的未执行部分。
11.一种计算机程序,所述计算机程序包含在计算机可读存储器上,并且被配置为当在区块链网络的节点上运行时,执行根据前述任一项权利要求所述的方法。
12.一种计算设备,所述计算设备包括:
存储器,所述存储器包括一个或更多个存储器单元;以及
处理装置,所述处理装置包括一个或更多个处理单元,其中,所述存储器存储被设置成在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时,执行根据权利要求1至10中任一项所述的方法。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GBGB1907347.7A GB201907347D0 (en) | 2019-05-24 | 2019-05-24 | In-script functions within a blockchain transaction |
GB1907347.7 | 2019-05-24 | ||
PCT/IB2020/053817 WO2020240299A1 (en) | 2019-05-24 | 2020-04-22 | In-script functions within a blockchain transaction |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113874839A true CN113874839A (zh) | 2021-12-31 |
Family
ID=67385402
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080038405.8A Pending CN113874839A (zh) | 2019-05-24 | 2020-04-22 | 区块链交易内的脚本内函数 |
Country Status (8)
Country | Link |
---|---|
US (1) | US20220300257A1 (zh) |
EP (1) | EP3963452A1 (zh) |
JP (1) | JP2022534047A (zh) |
KR (1) | KR20220024130A (zh) |
CN (1) | CN113874839A (zh) |
GB (1) | GB201907347D0 (zh) |
SG (1) | SG11202111438VA (zh) |
WO (1) | WO2020240299A1 (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2594684A (en) | 2020-02-19 | 2021-11-10 | Nchain Holdings Ltd | Layered network |
GB2592211A (en) * | 2020-02-19 | 2021-08-25 | Nchain Holdings Ltd | Adapting connections of a layered network |
GB2608179A (en) * | 2021-06-25 | 2022-12-28 | Nchain Licensing Ag | Multi-level blockchain |
GB2609193A (en) * | 2021-07-19 | 2023-02-01 | Nchain Licensing Ag | Enforcing conditions on blockchain transactions |
GB202112930D0 (en) * | 2021-09-10 | 2021-10-27 | Nchain Licensing Ag | Signature verification |
GB2618052A (en) * | 2021-12-07 | 2023-11-01 | Nchain Licensing Ag | Blockchain script engine |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP7247107B2 (ja) * | 2017-05-26 | 2023-03-28 | エヌチェーン ライセンシング アーゲー | ブロック認識 |
GB201713046D0 (en) * | 2017-08-15 | 2017-09-27 | Nchain Holdings Ltd | Computer-implemented system and method |
US12026710B2 (en) * | 2017-08-29 | 2024-07-02 | Nchain Licensing Ag | Constraints on outputs of an unlocking transaction in a blockchain |
US11568505B2 (en) * | 2017-10-18 | 2023-01-31 | Docusign, Inc. | System and method for a computing environment for verifiable execution of data-driven contracts |
EP3707623A1 (en) * | 2017-11-09 | 2020-09-16 | Nchain Holdings Limited | System for simplifying executable instructions for optimised verifiable computation |
SG11202004150XA (en) * | 2017-11-09 | 2020-06-29 | Nchain Holdings Ltd | Systems and methods for ensuring correct execution of computer program using a mediator computer system |
US11244309B2 (en) * | 2017-11-22 | 2022-02-08 | Cornell University | Real-time cryptocurrency exchange using trusted hardware |
US10693637B2 (en) * | 2018-03-23 | 2020-06-23 | Belavadi Nagarajaswamy Ramesh | System and method for composite-key based blockchain device control |
EP3785206A1 (en) * | 2018-04-27 | 2021-03-03 | Nchain Holdings Limited | Partitioning a blockchain network |
US10715594B2 (en) * | 2018-05-14 | 2020-07-14 | Vmware, Inc. | Systems and methods for update propagation between nodes in a distributed system |
-
2019
- 2019-05-24 GB GBGB1907347.7A patent/GB201907347D0/en not_active Ceased
-
2020
- 2020-04-22 US US17/611,552 patent/US20220300257A1/en active Pending
- 2020-04-22 WO PCT/IB2020/053817 patent/WO2020240299A1/en unknown
- 2020-04-22 CN CN202080038405.8A patent/CN113874839A/zh active Pending
- 2020-04-22 SG SG11202111438VA patent/SG11202111438VA/en unknown
- 2020-04-22 JP JP2021569440A patent/JP2022534047A/ja active Pending
- 2020-04-22 KR KR1020217041787A patent/KR20220024130A/ko unknown
- 2020-04-22 EP EP20724201.7A patent/EP3963452A1/en active Pending
Also Published As
Publication number | Publication date |
---|---|
US20220300257A1 (en) | 2022-09-22 |
GB201907347D0 (en) | 2019-07-10 |
WO2020240299A1 (en) | 2020-12-03 |
SG11202111438VA (en) | 2021-12-30 |
KR20220024130A (ko) | 2022-03-03 |
JP2022534047A (ja) | 2022-07-27 |
EP3963452A1 (en) | 2022-03-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113874839A (zh) | 区块链交易内的脚本内函数 | |
CN113924747A (zh) | 区块链交易数据字段验证 | |
US20220269810A1 (en) | Using Blockchain Transactions to Provide Off-Chain Functionality | |
JP7486528B2 (ja) | ブロックチェーン・トランザクションを検証するプロトコル | |
EP3977673B1 (en) | Blockchain transaction comprising runnable code for hash-based verification | |
CN115211073A (zh) | 公钥生成方法 | |
EP4189913A1 (en) | Blockchain tokens | |
JP2024522634A (ja) | ブロックチェーン上のトークンを検証するためのコンピュータ実装方法およびシステム | |
US20220337437A1 (en) | Blockchain transactions including portions of code in different languages for complex validation | |
CN114531941A (zh) | 多标准区块链协议 | |
KR20240100377A (ko) | 분산된 블록체인 기능들을 위한 방법들 및 시스템들 | |
JP2024518079A (ja) | マルチパーティブロックチェーンアドレス方式 | |
CN117136527A (zh) | 用于区块链实现的数据应用程序中的签名验证的改进方法和*** | |
JP2023550401A (ja) | ノードのバージョン管理 | |
CN114391146A (zh) | 在区块链上存储程序 | |
CN115699676A (zh) | 自定义事务脚本 | |
George et al. | Ethereum | |
WO2024165258A1 (en) | Blockchain transaction verification | |
CN118355627A (zh) | 区块链脚本引擎 | |
JP2024516895A (ja) | マルチパーティブロックチェーンアドレス方式 | |
KR20220143864A (ko) | 정렬된 데이터 로깅을 위한 방법, 데이터 구조, 및 시스템 | |
CN117693926A (zh) | 区块链区块和存在证明 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |