CN114175036A - 使用区块链交易提供链下功能 - Google Patents

使用区块链交易提供链下功能 Download PDF

Info

Publication number
CN114175036A
CN114175036A CN202080037814.6A CN202080037814A CN114175036A CN 114175036 A CN114175036 A CN 114175036A CN 202080037814 A CN202080037814 A CN 202080037814A CN 114175036 A CN114175036 A CN 114175036A
Authority
CN
China
Prior art keywords
script
transaction
output
stack
opcode
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
Application number
CN202080037814.6A
Other languages
English (en)
Inventor
克洛伊·塔尔坦
巴席姆·阿玛尔
杰克·戴维斯
贾德·瓦哈布
张伟
欧文·沃恩
克雷格·赖特
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nchain Holdings Ltd
Original Assignee
Nchain Holdings Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nchain Holdings Ltd filed Critical Nchain Holdings Ltd
Publication of CN114175036A publication Critical patent/CN114175036A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/64Protecting data integrity, e.g. using checksums, certificates or signatures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/62Protecting access to data via a platform, e.g. using keys or access control rules
    • G06F21/6218Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
    • G06F21/6227Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database where protection concerns the structure of data, e.g. records, types, queries
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/466Transaction processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/485Task life-cycle, e.g. stopping, restarting, resuming execution
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3236Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions
    • H04L9/3239Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions involving non-keyed hash functions, e.g. modification detection codes [MDCs], MD5, SHA or RIPEMD
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3247Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/50Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • General Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • Health & Medical Sciences (AREA)
  • Databases & Information Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Financial Or Insurance-Related Operations Such As Payment And Settlement (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_RETURN”。然而,本公开不限于具有该特定标签的操作码。更通俗地说,虽然实施例将根据区块链脚本语言的“OP_RETURN”进行描述,但是相同的教导可以使用任何操作码来实现,该操作码当由脚本引擎(例如,脚本解释器)调用时执行特定函数,该函数用于终止执行脚本,同时不核实交易无效。对操作码的第一和第二实例的引用应解释为相同类型的操作码的实例。
在这里,OP_RETURN不会核实交易无效。因此,在调用(或执行)OP_RETURN之前,锁定脚本中的脚本元素(即在OP_RETURN之前执行的脚本元素)可以用作链下函数的输入。换句话说,当执行锁定脚本时,将有数据保留在至少一个堆栈(例如,Main堆栈或ALT堆栈)上。根据本公开,调整节点协议,使得OP_RETURN使该数据从堆栈中读取并提供给用于链外目的的函数。
例如,该函数可以基于从堆栈中读取的数据来生成新交易。可以从堆栈中读取数据并将其记录在“Return”堆栈(即独立于Main堆栈和ALT堆栈的堆栈)上。
作为另一示例,保留在堆栈上的数据可以用作对交易的另一部分的引用。例如,数据可以由该函数解释为交易中输出的索引(或地址)。然后,该函数可以执行引用输出中包含的锁定脚本。从这个意义上讲,该函数用作“链下脚本解释器”,用于标识和执行锁定脚本。该函数可用于创建链下循环。
附图说明
为了帮助理解本公开的实施例并示出如何实施此类实施例,现将仅通过举例的方式参考附图进行说明,其中:
图1是一种用于实现区块链的系统的示意性框图;
图2示意性地示出了可记录在区块链中的交易的一些示例;
图3是另一种用于实现区块链的系统的示意性框图;
图4是一种用于执行交易的节点软件的示意性框图;
图5a示出了示例性发起交易TxIn,其中每个输入具有来自玩家的承诺r;
图5b示出了示例性预言机交易TxOracle,其中输出0将数字资产转移给参与者,输出1生成随机数;
图6a示出了区块外(off-block)脚本解释器跳转到复合函数交易的输出0内的输出点地址1时的示例;
图6b示出了复合函数交易的示例,该复合函数交易在其输出点之间包含许多可能的跳转;
图7是欧几里得算法中输入a=105且b=28的复合脚本函数的解包循环的示例;
图8是具有输入5、G的椭圆曲线点乘法的示例,其中并排显示ALT堆栈(以阴影示出)与Main堆栈。
具体实施方式
图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包括指向Tx0的指针(例如,通过其交易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赎回的条件并不一定包括对签名进行认证。更通俗地说,脚本语言可用于定义任何一个或更多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
图3示出了用于实现区块链150的另一系统100。除了附加的通信功能外,该系统100’与图1所示的内容基本相同。爱丽丝和鲍勃的计算机设备102a、120b中的每个计算机设备上的客户端应用都包括附加通信功能。换句话说,附加通信功能可使爱丽丝103a建立与鲍勃103b的单独侧信道301(在任何一方或第三方的鼓动下)。侧信道301使得能够脱离P2P网络交换数据。此类通信有时称为“链下”。例如,这可用于在爱丽丝与鲍勃之间交换交易152,而不将该交易(尚未)发布到网络P2P 106上或将其发布到链150上,直到其中一方选择将其广播到网络106上。附加地或替代地,侧信道301可用于交换任何其他交易相关数据,例如密钥、议付金额或条款、数据内容等。
通过与P2P覆盖网络106相同的分组交换网络101可建立侧信道301。替代地或附加地,侧信道301可以经由诸如移动蜂窝网络的不同网络或者诸如无线局域网络的局域网建立,甚至经由爱丽丝和鲍勃的设备1021、102b之间的直接有线或无线链路建立。通常,在本文中任何地方所指的侧信道301可以包括经由一项或更多项联网技术或通信介质的任何一条或更多条链路,这些链路用于“链下”交换数据,即脱离P2P覆盖网络106交换数据。在使用多条链路的情况下,链下链路束或集合整体上可以称为侧信道301。因此,应当注意的是,如果说爱丽丝和鲍勃通过侧信道301交换某些信息或数据等,则这不一定意味着所有这些数据都必须通过完全相同的链路或甚至相同类型的网络发送。
链下函数
本发明的实施例提供了从区块链交易中提取附加功能。为实现此操作,可以将OP_RETURN配置为终止执行脚本而不核实交易无效。
图4示出了在基于UTXO或基于输出的模型的示例中,可以在P2P网络106的每个节点104上运行的节点软件400的示例。节点软件400包括协议引擎401、脚本引擎402、堆栈403、应用级决策引擎404以及一个或更多个区块链相关功能模块的集合(未示出)。在任何给定节点104处,这些模块可以包括以下三个模块中的任何一个、两个或全部:挖掘模块、转发模块和存储模块(取决于该节点的一个或多个角色)。脚本引擎402可以包括脚本解释器,该脚本解释器被配置为通过将脚本的部分解释为用于对这些数据元素进行操作和/或从堆栈403中推送或读取数据元素的数据元素或函数来执行脚本。或者,脚本引擎402可以采用另一执行形式,例如即时(JIT)编译。通常,在本文中使用的术语“执行”是以任何方式运行脚本的最广义意义(而不是执行编译的机器代码指令的狭义意义)。因此,“执行”可以包括在当前上下文中的解释。此外,还应当注意的是,当前上下文中的“操作码”并不是指单个机器代码指令的操作码,而是指由每个节点104处的脚本引擎402映射到相应预定义函数的更高级别命令。
协议引擎401被配置为识别交易152的不同字段,并根据节点协议处理此类字段。当接收到具有指向另一先前交易152m-1(Txm-1)的输出(例如,UTXO)的输入的交易152m(Txm)时,协议引擎401标识Txm中的解锁脚本并将其传递给脚本引擎402。协议引擎401还基于Txm的输入中的指针来标识和检索Txm-1。如果Txm-1尚未在区块链150上,则可以从相应节点自身的未决交易池154中检索Txm-1;或者,如果Txm-1已在区块链150上,则可以从存储在相应节点或另一节点104处的区块链150中的区块151的副本中检索。无论采用哪种方式,协议引擎401都会标识Txm-1的指向输出中的锁定脚本,并将其传递给脚本引擎402。
因此,脚本引擎402具有Txm-1的锁定脚本和来自Txm的相应输入的解锁脚本。例如,图4中示出的Tx1和Tx2,但同样可以应用于任何交易对,诸如Tx0和Tx1等。如前所述,脚本引擎402同时运行两个脚本,这将包括根据正在使用的基于堆栈的脚本语言(例如,脚本)将数据放置到堆栈403上并从该堆栈中检索数据。
通过同时运行脚本,脚本引擎402确定解锁脚本是否满足锁定脚本中定义的一个或更多个标准,即解锁脚本是否对包括锁定脚本的输出进行解锁?脚本引擎402将该确定的结果返回给协议引擎401。如果脚本引擎402确定解锁脚本确实满足在相应的锁定脚本中指定的一个或更多个标准,则返回结果“TRUE”。否则,返回结果“FALSE”。
在基于输出的模型中,来自脚本引擎402的结果“TRUE”是交易有效性的条件之一。通常,还必须满足由协议引擎评估的一个或更多个进一步协议级条件;例如,Txm的输入所指向的数字资产的总金额不超过输出中指定的总金额,并且Txm-1的指向输出尚未被另一有效交易花费。协议引擎评估来自脚本引擎402的结果以及一个或更多个协议级条件,并且只有当它们都为TRUE时,协议引擎才核实交易Txm有效。协议引擎将交易是否有效的指示输出到应用级决策引擎404。只有在Txm确实核实有效的条件下,决策引擎404才可以选择控制挖掘模块和转发模块中的一个或两个来执行它们涉及Txm.的相应区块链相关函数。这可以包括:挖掘模块,该挖掘模块将Txm添加到节点的相应池154以挖掘到区块151中;和/或转发模块,该转发模块将Txm转发到P2P网络106中的另一节点104。然而,应当注意的是,在实施例中,虽然决策引擎404不会选择转发或挖掘无效交易,相反,这并不一定意味着,仅因为交易有效,该决策引擎就必须触发该交易的挖掘或转发。可选地,在实施例中,决策引擎404可以在触发这些函数中的一个或两个函数之前应用一个或更多个附加条件。例如,如果节点是挖掘节点104M,则决策引擎可以仅在交易有效且预留足够挖掘费用的条件下选择挖掘该交易。
此外,还应当注意的是,在本文中,术语“TRUE”和“FALSE”不一定限于返回仅以单个二进制数(位)形式表示的结果,尽管这确实是一种可能的实现方式。更通俗地说,“TRUE”可以指指示成功或肯定结果的任何状态,而“FALSE”可以指指示不成功或不肯定结果的任何状态。例如,在基于账户的模型(图4中未示出)中,可以通过节点104对签名的隐式协议级核实和智能合约的附加肯定输出的组合来指示结果为“TRUE”(如果两个单独的结果均为TRUE,则认为总体结果为TRUE)。
根据一些实施例,有效交易的一个条件是该交易的解锁脚本不能包含OP_RETURN操作码的任何实例,或不会将该交易标记为无效的任何其他此类终止操作码。协议引擎401和/或脚本引擎402被配置为检测交易的解锁脚本内是否存在此类操作码。在检测到交易(例如,Tx2)的解锁脚本中的终止操作码时,协议引擎401被配置为将该交易标记为无效。如果在解锁脚本中检测到终止操作码,交易将立即标记为无效-该脚本永远不会执行。
在附加或替代实施例中,节点软件包括链下函数405。在本文中,协议引擎401、脚本引擎402、应用级决策引擎404可以称为“链上”函数。链上并不意味着该函数实际上包括在区块151中。相反,这意味着该函数集成为协议的一部分,该协议用于核实要在网络106上传播并挖掘到区块151中的交易有效。相反,链下意味着该函数的目的不同于核实区块有效。在一些示例中,该函数的目的是生成新交易、生成包括复合函数的模板脚本或对从交易Tx获取(或由该交易产生)的数据执行计算。
在这些实施例中,脚本引擎402被配置为向链下函数405提供来自堆栈403(例如,来自堆栈顶部)的数据元素。脚本引擎402被配置为在调用交易(图4中的Tx1)的锁定脚本中存在的OP_RETURN时从堆栈403中读取数据元素。链下函数405被配置为基于数据元素生成结果(或者换句话说,对数据元素执行操作)。在一些示例中,从堆栈403中读取数据元素并将其记录在“链下堆栈”上。在本文中,“链下堆栈”是不用于核实交易有效的堆栈。脚本引擎402每次调用OP_RETURN时,可以从堆栈403中读取数据元素并将其提供给链下函数。链下函数405可以被配置为使用记录在链下堆栈上的数据元素来生成新交易。在其他示例中,链下函数405被配置为使用数据元素作为对Tx1内的锁定脚本的引用。如图4所示,Tx1包括多个锁定脚本1到n。链下函数405将数据元素解释为锁定脚本的地址或索引(例如,作为第三锁定脚本的索引),然后执行该锁定脚本。附加地或替代地,可以将寻址的锁定脚本添加到保存在存储器中的脚本模板。
一些区块链协议使用脚本语言,该脚本语言包括两种类型的元素:数据和操作码。脚本内的数据可以是例如数字、公钥、签名、哈希值等。操作码是对脚本内的数据执行操作的函数。在脚本语言中,脚本从一端运行到另一端(通常是从左到右),并使用称为“堆栈”的数据结构。数据始终被推送到堆栈上(即放置到堆栈上)。操作码可以从堆栈中弹出数据(即从堆栈中获取数据),对数据执行操作,然后可选地将新数据“推送”到堆栈上。在许多区块链中通常使用的脚本语言称为脚本。下面将根据脚本语言的操作码进行描述。
本领域技术人员将熟悉基于堆栈的脚本语言。以下示例示出了示例性脚本实现方式。具体地说,以下示出了示例性核实和解锁过程。
示例性脚本可以包括<鲍勃的签名><鲍勃的公钥>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
当执行交易时,该交易的解锁脚本与先前交易的锁定脚本一起执行。该交易可以包括多个锁定脚本。为方便起见,这些锁定脚本中的一个锁定脚本在下文中将称为第一锁定脚本。第一锁定脚本可以是在交易中(即,在输出1中)首先出现的锁定脚本,或者第一锁定脚本可以在交易的不同输出中(例如,在输出6中)。类似地,引用“第一输出”并不一定意味着它是交易输出列表中的第一输出。除非上下文另有要求,否则第一、第二、第三等仅仅是用于区分同一事物的不同项(例如,锁定脚本、输出、交易等)的标签。
如果执行第一锁定脚本且该第一锁定脚本包括OP_RETURN,则当调用OP_RETURN时,终止执行该第一锁定脚本,从而在一个或两个堆栈上留下数据元素。本发明的实施例提供了几种可以利用该数据元素提供附加功能的方法。从堆栈中读取数据元素并将其提供给链下函数,该链下函数被配置为基于数据元素生成结果(或等效地对数据元素执行操作)。执行锁定脚本的相同装置(或节点)也可以实现链下函数。或者,可以将数据元素提供给外部方以实现链下函数。
生成新交易
在一些实施例中,该函数被配置为基于数据元素生成新交易。新交易可以在第一交易执行之后的任何时刻生成并传输。该函数可以直接基于数据元素或通过首先对该数据元素执行操作来生成交易。新交易可以传输到区块链网络106的一个或更多个节点104,以便在整个网络中传播和/或记录在区块链中。
例如,该函数可以生成新交易的输入中的一个输入的至少一部分(例如,公钥、签名、随机变量)。附加地或替代地,该函数可以生成新交易的输出中的一个输出的至少一部分(例如,要转移的数字资产金额)。
新交易可以包括具有锁定脚本的输出。该锁定脚本可以包括在调用OP_RETURN之前要执行的脚本的一部分。锁定脚本的至少一部分可以基于提供给链下函数的数据元素。同样,当调用OP_RETURN时,锁定脚本将终止,并且新数据元素将保留在堆栈上。该数据元素可以从堆栈中读取并提供给链下函数,例如以生成进一步交易。这使得能够构建交易循环,其中进一步交易中的每笔交易都基于执行先前交易的锁定脚本所产生的数据元素。
在示例性区块链脚本中,有两个堆栈:Main堆栈和ALT堆栈。验证交易时,在堆栈上执行脚本。在执行期间,除预先确定的脚本之外,不可能向堆栈写入任何内容。然而,本文认识到,在执行结束之后,可以立即使用外部函数(或代理)从堆栈中读取数据。下面将描述第三堆栈—称为“Return堆栈”的链下堆栈的使用。Return堆栈的功能是在脚本执行之后从Main堆栈和ALT堆栈中读取和记录数据,例如以连接区块链与外部世界。然后,可以将存储在Return堆栈上的数据馈送到链下函数以提供附加功能,例如以馈送到下一脚本执行、生成新交易或执行某些其他链下计算。在使用术语“堆栈”的同时,可以使用被配置为存储从Main堆栈或ALT堆栈中读取的数据的任何数据存储器。
用例—掷骰子
下面提供了一个模拟称为“掷骰子”的游戏的示例,以说明Return堆栈与区块链交易之间的交互。该示例涉及两个实体:发牌员,查理;玩家,爱丽丝。这两个实体中的每个实体可以是相应当事方103。在该简化示例中,掷骰子游戏的玩法如下:一个玩家(即“射手”)拿出两个骰子,并将它们掷到掷骰子桌子上—或者如果在线掷骰子,按下“掷出”按钮。
掷出第一数字之后,有三种可能的结果:
1.自然—“自然”表示掷出结果为7或11。当这种情况发生时,玩家将获胜并再次掷骰子。
2.掷骰子—表示掷出结果为2(也称为两点)、3或12。当这种情况发生时,玩家将输掉游戏。
然而,该局游戏尚未结束,玩家将再次掷骰子。
3.局点—玩家掷出4、5、6、8、9或10。在现场游戏,发牌员会在桌子上标记“局点”(掷出的数字)。在在线掷骰子游戏中,一旦局点建立,就会出现一个小按钮。该小按钮通常为白色并显示“开”。玩家现在需要再次掷骰子,并希望他们再次命中相同的数字。它不必与之前掷出的骰子组合相同。只要点数总和相同,玩家便会获胜。如果玩家掷出7,玩家将面临“掷七出局”—玩家将输掉游戏,并结束该局游戏的风险投资。
为了进一步简化游戏,在该示例中,“自然”和“掷骰子”结果将结束游戏。
考虑下面由爱丽丝和查理创建的初始交易TX0
Figure GDA0003499858870000211
TX0备注:
1)TX0中有两个输入:爱丽丝的风险投资和查理的风险投资。
2)TX0中有两个输出:每个输出代表一个骰子。可以将这两个输出合并为一个输出。然而,具有两个输出强调有两个骰子,同时强调不止一个人会“掷出”骰子。
3)假设爱丽丝是唯一掷骰子的玩家。换句话说,爱丽丝知道PK1和PK2的私钥。要允许其他玩家掷骰子,可以将PK2替换为其他玩家选择的公钥。
4)为了防止爱丽丝作弊,可以将爱丽丝的公钥替换为2取2多重签名,在这种情况下,需要爱丽丝和查理的签名。
5)每个输出中有两个OP_IF。如果顶部堆栈值不是FALSE,则执行语句。顶部堆栈值将被删除。
a.第一个用于检查签名的有效性。如果为TRUE,则继续“掷骰子”。如果不为TRUE,则查理可以声明输出。应当注意的是,假设查理受到玩家的信任。如果情况并非如此,则可以实现锁定时间,以确保爱丽丝具有声明输出的优先级。
b.第二个用于检查解锁脚本中提供的随机字符串的有效性。这可以通过哈希难题检查字符串的前缀。例如:
i.[CHECK_RANDOM_STRING]:=“get_first_4_bytes OP_HASH<pre-determinedhash value>OP_EQUAL”.
c.如果随机字符串无效,则查理可以声明输出。
6)假设随机字符串有效且确实是随机的,则脚本“OP_HASH<6>OP_MOD”将产生一个数字,该数字的范围为{0,1,2,3,4,5},具有几乎相等的概率。这些结果代表骰子{1,2,3,4,5,6}的六个结果。
为了模拟掷骰子,爱丽丝需要构建两个解锁脚本。然后,爱丽丝将这笔未完成交易TX1传递给查理。查理通过添加两个随机字符串来完成交易TX1
Figure GDA0003499858870000221
Figure GDA0003499858870000222
假设PKbetpool由发牌员控制,并且查理受信任提供两个新的随机字符串。
核实TX1有效之后,其中一个脚本执行将如下所示:
<random_string_1><Sig1><PK1
OP_DUP OP_HASH<Hash of PK1>OP_EQUAL OP_CHECKSIG
OP_IF
[CHECK_RANDOM_STRING]
OP_IF
OP_HASH<6>OP_MOD OP_RETURN
OP_ELSE
OP_DUP OP_HASH<Hash of PKCharlie>OP_EQUALVERIFY
OP_CHECKSIGVERIFY
OP_END_IF
OP_ELSE
OP_DUP OP_HASH<Hash of PKCharlie>OP_EQUALVERIFY
OP_CHECKSIGVERIFY
OP_ENDIF
当调用OP_RETURN时,先前版本OP_RETURN将终止脚本并核实交易无效。然而,在由本文中所描述的实施例的节点实现的OP_RETURN中,OP_RETURN将交易标记为有效,并在执行之后且清除堆栈之前在堆栈上留下一个数字。在堆栈上留下的数字将被读取并存储在Return堆栈上。
假设爱丽丝已掷出a和b,其中a,b∈{1,2,3,4,5,6}。所有掷骰子规则都可以在用于链下评估的脚本中实现(例如,链下函数)。伪代码如下所示:
1)如果(a+b)=7或11,则为“自然”。
2)如果(a+b)=2、3或12,则为“掷骰子”。
3)否则,将(a+b)保存在Retum堆栈上,并且保存“局点”。
每个结果都对应于一笔新交易。通过解释Retum堆栈的结果,可以构建结果交易:
自然-交易只需从TX1中的输出中向爱丽丝支付获胜奖励。
掷骰子-交易将赎回TX1中的输出:即支付给查理。
局点-交易将创建类似于TX1的另一交易,这将允许爱丽丝再次掷骰子。
应当注意的是,在该示例性用例中,在自然交易或掷骰子交易的情况下,游戏结束;在局点交易的情况下,游戏继续。最重要的是,第一次掷骰子的输出(a和b的总和)存储在Return堆栈中。换句话说,结果是从堆栈中读取并存储在Return堆栈上的数据元素。然后,将第二次掷骰子的输出与a+b进行比较。如果两者相等,将为爱丽丝创建一笔交易以领取奖励。如果不相等,将为爱丽丝创建TX0等另一笔交易,以再次掷骰子。
总之,通过使用Return堆栈,可以模拟复杂的当型循环。应当注意的是,该循环存在于链下,玩掷骰子是关于如何实现该循环的示例。Return堆栈的使用可以推广到许多其他应用程序,如以下示例所示。
用例-陪审团遴选
该示例涉及一种在区块链脚本中使用一组N个参与者来实现随机数生成(RNG)的方法。该方法至少涉及两笔交易:
a)发起(第一)交易TxIn-每个参与者向发起交易添加输入并对其进行签名,其中包括对秘密值s的公开承诺r。这笔交易将其数字资产支付给预言机。
b)预言机(第二)交易TxOracle-预言机(链下函数)从每个玩家获取秘密值s并生成交易,该交易的锁定脚本组合所有N玩家的秘密值以生成随机数RN(第一数据元素),并根据该数字将数字资产锁定到公钥。
在预言机交易的锁定脚本中生成的随机数RN可用于确定后续赎回交易花费这些数字资产的条件。然而,由于RN是可证明伪随机的,因此可以用于为其他链下过程播种,例如需要种子来完成确定性过程的实验室实验。特别地,可证明公平的刑事审判程序陪审团遴选可以利用该解决方案。
通过引入Return堆栈来执行此类锁定脚本并将最终随机数RN返回到链下解释器,进一步有助于在由链上锁定脚本生成的链下陪审团遴选中使用可证明公平的随机数。
在审理刑事案件的法律程序中,可以由法院负责遴选陪审团,从而随机遴选陪审团,以确保陪审团不会以任何方式“被笼络”或存在不公平的偏见。法院操作可以操作硬件和软件,这些硬件和软件具备运行链下Return堆栈的能力。此外,法院可以从区块链中读取数据,执行交易脚本,并将这些执行的结果存储在其本地Return堆栈中。法院定义的从由N名可能的陪审员组成的库中遴选陪审团的过程是从使用上述链上方法生成的随机数中推导出来的。然而,法院不需要参与生成过程本身,而是充当区块链的第三方观察者,在这种情况下,RNG过程由另一第三方T(例如,彩票公司)运行。
每次遴选陪审团进行刑事审判时,会发生以下过程:
1)法院要求服务提供商T提供链上RNG过程:
a.涉及N个参与者的发起交易TxIn由T组织和广播;
b.预言机交易TxOracle由T生成和广播。
2)法院从区块链中检索TxIn和TxOracle
3)法院使用解锁脚本执行TxOracle的锁定脚本:
a.解锁脚本通过从TxIn中提取所有r值生成;
b.解锁脚本从TxOracle中提取。
4)将顶部(Main)堆栈项RN(第一数据元素)复制到法院的Return堆栈并进行存储。
5)法院的Return堆栈(链下堆栈)用于遴选陪审团,例如堆栈中的项被馈送到链下函数,该函数获取随机数RN的连续哈希值,并将结果映射到合格公民的ID。
为了实现步骤4,OP_RETURN必须包括在TxOracle锁定脚本中,使得可用于在步骤3中终止执行脚本。此外,还要求OP_RETURN具有终止执行且核实交易无效的功能,以确保当脚本执行终止时顶部堆栈项是RN。如果OP_RETURN改为核实交易无效,则法院解释器将在终止时遇到错误,而不是所需的随机数。
该场景中涉及的交易如图5a和图5b所示。
法院能够从发起交易Txin的输入中提取承诺列表r1,...,rN,并在陪审团遴选过程的步骤3期间将它们用作解锁脚本:
[解锁脚本]=<r1><r2>...<rN
类似地,法院提取预言机交易TxOracle的锁定脚本输出1,其写为:
[锁定脚本]=<H(r1)><H(r2)>...<H(rN)>OP_EQUALVERIFY...OP_EQUALVERIFY
<s1><s2>...<sN>OP_ADD...OP_ADD OP_HASH256<N>OP_MOD
OP RETURN
该锁定脚本的第一行用于检查承诺的r值是否与发起交易一致。然后,第二行使用由r值承诺的秘密s值在脚本执行过程中生成随机数RN。最后,第三行只是OP_RETURN调用,这会导致脚本执行终止,并因此将RN保留在Main堆栈顶部。
在陪审团遴选过程的步骤3中,法院将同时执行上述锁定脚本和解锁脚本,这将返回随机数RN或执行失败。在执行成功完成的情况下,法院可以从Main堆栈顶部读取随机值,并将其存储在本地计算机的Return堆栈中。
然后,该值RN用于以可证明公平的方式遴选陪审团。每次需要遴选陪审团时,以及TxIn和TxOracle的生成每次可由法院监督或外包给第三方时,可以重复整个过程。
这种方法的主要优点是透明度。公众将能够读取区块链上的交易,以证明该过程确实是随机和无偏见的。
复合函数
在一些实施例中,第一交易(以下称为先前交易)可以具有多个输出,每个输出包含锁定脚本(其中一些可以相同或不同)。每个输出由输出地址(OA)引用,以下也称为输出点地址。该地址可以是一个数字,用于对交易中输出的位置进行索引。输出中的至少一个输出具有锁定脚本,该锁定脚本包括引用输出中另一输出的输出地址。例如,锁定脚本可以包含一个数字(例如,2)或操作码(例如,OP_2),当与OP_RETURN耦合时,这些数字或操作码可以解释为第二输出(例如,输出列表中的第二输出)的地址。
在第一交易之后的某个时刻生成的第二交易(以下称为新交易或进一步交易)包括一个或更多个输入,每个输入具有解锁脚本。这些解锁脚本中的至少一个解锁脚本引用先前交易的输出(以下称为第一输出或主输出)。第一输出不必是先前输出的输出列表中的第一输出,标签“第一”仅用于表示该输出是待调用的第一输出。
当执行解锁脚本时,引用并执行第一输出的锁定脚本。第一输出的锁定脚本至少包括同一交易的输出的输出地址(OA)(即可以解释为输出地址的数据元素)。输出可以是相同的输出(即第一输出),也可以是不同的输出(例如,第二输出)。在本文中,第二输出不一定意味着第二输出是先前的输出列表中的第二输出,尽管可能是这样。标签“第二”仅用于表示该输出是待调用的第二输出。第一输出的锁定脚本至少还包括OP_RETURN操作码。锁定脚本还可以包括附加数据元素或操作码。
由于OP_RETURN被配置为终止执行脚本,同时不核实交易无效,因此当调用OP_RETURN时,第二输出的输出地址将保留在堆栈上。在一些示例中,锁定脚本中的输出地址紧跟在OP_RETURN之后,即在输出地址与OP_RETURN之间没有数据元素或操作码。链下函数被配置为读取在堆栈上保留的数据元素,并将其解释为输出中的一个输出(在这种情况下为第二输出)的输出地址。
然后,该函数可以执行第二输出的锁定脚本。在本文中应当注意的是,与通常执行锁定脚本不同,第二输出的锁定脚本不会与解锁脚本一起执行。这是因为该函数是“链下”函数,因此执行锁定脚本的目的不是为了将交易传输到挖掘到区块链中的区块链网络的节点的目的来核实交易有效。相反,一个优点是构建脚本,例如在锁定脚本或智能合约中实现。
第二输出的锁定脚本还可以包括输出地址,例如第三输出的输出地址,后跟OP_RETURN。同样,在本文中所使用的“第三”用作区分第一与第二的标签,并不意味着先前交易中的输出顺序。然而,不排除第一输出、第二输出和第三输出是先前交易的输出的有序序列的一部分。在这种情况下,当执行第二输出的锁定脚本时,第三输出的输出地址被推送到堆栈上。输出地址可以是数字或其他数据元素,该函数被配置为解释为输出中的一个输出的输出地址,在这种情况下为第三输出。然后,链下函数可以使用第三输出地址来引用第三输出的锁定脚本。
执行锁定脚本的过程可以重复一次或多次。无论何时调用OP_RETURN,堆栈顶部的数据元素都被解释为输出中的一个输出的输出地址。先前交易的输出中的一个或更多个输出可以执行多次。在执行输出的相应锁定脚本中的每个锁定脚本之后,该过程可能结束。在一些示例中,并不是先前交易的每个输出都由第二交易的解锁脚本或第一交易的输出引用。
每次引用锁定脚本时,该锁定都可以复制到脚本模板,即“待执行脚本”。在链下函数完成执行所有引用的锁定脚本之后,脚本模板将包括引用的锁定脚本的内容,而不是那些锁定脚本中的OP_RETURN操作码。换句话说,脚本模板具有已解包所有循环的脚本,其可用于为新交易构建不含OP_RETURN的锁定脚本。
换句话说,假设存在包含多个输出的第一交易,并且存在引用第一交易的输出中的一个输出的第二交易。可以执行以下步骤。
步骤1:检查引用输出的锁定脚本中是否存在OP_RETURN。如果存在,则从第一交易中提取所有锁定脚本,并相应地对它们进行索引。
步骤2:假设OP_RETURN确实存在,将解锁脚本和解锁脚本引用的锁定脚本复制到待执行脚本中。
步骤3:执行待执行脚本。
步骤4:当调用OP_RETURN时,使用堆栈上的第一元素。
步骤5:假设使用的第一元素是有效索引,则由步骤4中OP_RETURN使用的元素引用的锁定脚本现在复制到待执行脚本的开头。
步骤6:继续执行。
例如,第一交易可以具有以下锁定脚本:
锁定脚本1:[函数1]OP_2OP_RETURN
锁定脚本2:[函数2]
锁定脚本3:OP_1OP_RETURN
第二交易可以具有用于锁定脚本3的解锁脚本:x
因此,第一交易中有3个锁定脚本,第二交易中有1个解锁脚本,该解锁脚本引用第一交易中的第三输出。函数1和函数2是相应锁定脚本中的函数,例如,这些函数可以推送和/或操作堆栈上的数据。执行函数1和函数2是因为首先执行锁定脚本3,使得能够执行锁定脚本1(包含函数1),然后使得能够执行锁定脚本2(包含函数2)。
为了执行交易:
1.将x推送到堆栈上
2.执行锁定脚本3
3.调用锁定脚本1
4.执行函数1
5.调用锁定脚本2
6.执行函数2
7.执行结束
当调用OP_RETURN时,不会重新执行解锁脚本,也不会执行任何其他解锁脚本。锁定脚本的执行是链下的。
链下函数充当区块外(或链下)脚本解释器。此类解释器可以帮助用户构建复杂的脚本,以便在锁定脚本和智能合约中实现。在链上,OP_RETURN在任何交易有效期间调用时被配置为终止执行脚本,同时不核实交易有效。在链下,区块外脚本解释器为OP_RETURN添加了新功能。新功能使用OP_RETURN来构建包含循环的复合脚本函数。一些区块链脚本语言不允许循环。因此,构建函数中的任何循环在放入锁定脚本之前解包。
链下函数利用具有多个输出点的单一交易(输出点和输出可互换使用)。OP_RETURN的区块外定义将允许从交易中的一个输出点跳转到另一输出点,其中由堆栈顶部项给出的输出点索引用于指示要跳转到的输出点。
这如图6a和图6b所示,并且可描述如下:
交易的每个输出点都包含锁定脚本。对于每个输出点,可以将该锁定脚本视为单一函数。每个输出点由唯一的OA引用,该OA是交易中输出点的索引。
有一个输出点可以视为“主”函数,并且首先执行。例如,这可能是交易的最后一个输出点。
应当注意的是,交易输出点从0开始进行索引,0是一个特殊值,后跟OP_RETURN时该特殊值通常为失败的脚本保留。为简洁起见,下面将假设从1开始对输出点进行索引。
在执行OP_RETURN时,区块外脚本解释器跳转到由堆栈顶部项给出的OA,将锁定脚本中的操作码添加到指令集,然后继续执行。除弹出顶部项外,Main堆栈和ALT堆栈保持不变。
如图6a和图6b所示,脚本解释器执行以下任务:
·输入:<OA>
·运算符:OP_RETURN
·输出:[来自<OA>的锁定脚本],使用<OA>。
需要强调的是,除执行OP_RETURN之外,脚本解释器与核实交易有效的脚本解释器相同。上述构建允许将交易解释为脚本中复合函数的模板。在可以编译函数的情况下,可以将该函数写出在单一输出点中,其中所有循环都必须解包,从而生成一段复杂的长代码。然而,在本发明的实施例中,所有逻辑都包含在交易的单独输出点中,这些输出点的大小可能小得多。该逻辑更容易理解,与Forth的关系也更密切。更具体地说,这可提高代码可读性,减小代码库,并允许进行单元测试。
如果未花费,这种形式的交易将存储在UTXO集合中,在记录数据以供未来引用方面,该集合可以视为比特币的通用“存储器”。交易包含构建复合函数所需的所有内容-无需其他高级语言。这将实现一组普遍认可的复合函数。这对于在许多应用中可能重复的函数尤其有用,例如下面将描述的椭圆曲线点乘法。
这还允许将UTXO集合用作图灵完备代码片段的分散式存储库。除存储一组有用的复合函数之外,该存储库还可用于外包计算上难以执行但易于验证的计算处理。然后,此类计算的解决方案可以转移到区块链上,在区块链上,数字资产可以通过提供可在脚本中验证的精确解决方案来赎回。另一可能的用例是将UTXO集合用作智能合约的分散式存储库。
为了避免花费UTXO集合中的此类交易,交易创建者爱丽丝可以在锁定脚本的开头添加OP_CHECKSIGVERIFY(需要她的签名)。在解释脚本时,可以安全地忽略这一部分。或者,可以构建包含如上所述的输出点但没有输入的部分交易,这足以定义函数。在爱丽丝满意地使用复合函数之后,交易便可完成并提交或丢弃。
用例-欧几里德算法
例如,可以生成具有组成欧几里德算法的两个输出点的交易TX_[Euclidean_algorithm]。交易的输入已留空,以强调输出点。
Figure GDA0003499858870000291
欧几里德算法采用两个输入(a.b),并输出a和b的最大公约数(GCD)。为简单起见,假设a>b。
应当注意的是,根据设计,每当调用“<i>OP_RETURN”时,区块外解释器将这两项替换为存储在ith输出点中的整个脚本。循环功能通过在ith输出点中设置“<i>OP_RETURN”来实现。在该用例中,交易的最后一个输出点是主函数,并将首先调用。对“<1>OP_RETURN”的任何调用都将替换为“OP_TUCK OP_MOD OP_DUP OP_IF<1>OP_RETURN OP_ENDIF”。图7中示出了该示例。分步执行如下:
1)首先将输入推送到堆栈上。
2)调用主函数“<1>OP_RETURN OP_DROP”。
3)将“<1>OP_RETURN”替换为“OP_TUCK OP_MOD OP_DUP OP_IF<1>OP_RETURNOP_ENDIF”。
4)执行“OP_TUCK OP_MOD OP_DUP OP_IF”。
5)当输入非零时,继续执行“if”语句中的“<1>OP_RETURN”。
6)将“<1>OP_RETURN”替换为“OP_TUCK OP_MOD OP_DUP OP_IF<1>OP_RETURNOP_ENDIF”。
7)执行“OP_TUCK OP_MOD OP_DUP OP_IF”。
8)当输入非零时,继续执行“if”语句中的“<1>OP_RETURN”。
9)将“<1>OP_RETURN”替换为“OP_TUCK OP_MOD OP_DUP OP_IF<1>OP_RETURNOP_ENDIF”。
10)执行“OP_TUCK OP_MOD OP_DUP OP_IF”。
11)当输入为零时,直接转到“OP_ENDIF”,以关闭步骤9中的“if”语句。
12)转到“OP_ENDIF”,以关闭步骤6中的“if”语句。
13)转到“OP_ENDIF”,以关闭步骤3中的“if”语句。
14)返回到主函数并转到“OP_DROP”。
15)结果将保留在堆栈顶部。
用例-椭圆曲线点乘法
为简单起见,该用例涉及三个函数,其缩写为[DECIMAL_TO_BINARY]、[POINT_ADD]和[POINT_DOUBLE]。
[DECIMAL_TO_BINARY]使用堆栈上的第一元素d,并将以下输出推送到堆栈<2><dn>…<d0>上,其中<2>是序列中要推送的第一元素指示符(用于表示二进制序列结束),并且
Figure GDA0003499858870000301
应当注意的是,堆栈上的第一元素将是d0
[POINT_ADD]使用堆栈上的前两个元素P1和P2,并推动将P1和P2点添加到堆栈。
[POINT_DOUBLE]可与OP_DUP[POINT_ADD]互换,使用堆栈上的第一元素P,并将点2P推送到堆栈上。
TX_[POINT_MUL]是包含用于椭圆曲线点乘法的复合脚本函数的交易。
Figure GDA0003499858870000311
由上述交易中的最后一个输出点表示的主函数采用两个输入(a,G)和输出a·G。图8中示出了该示例。应当注意的是,每当遇到OP_RETURN时,“<i>OP_RETURN”都将替换为ith输出点中的整个脚本。对脚本所做的分步解释如下,假设将输入(a,G)推送到堆栈上,其中G是堆栈上的第一元素:
调用主函数(输出点6)。
1)将G推送到ALT堆栈上。
2)调用[DECIMAL_TO_BINARY]以获取a的二进制表示。
3)将G从ALT堆栈中移回。
4)将0推送到ALT堆栈上。该0有助于标识何时到达ALT堆栈的底部。
5)最初,处理第一(最低有效)位a。如果为1,则将G推送到ALT堆栈上。
6)然后,将1推送到ALT堆栈上。该1表示在ALT堆栈上与其相邻存在一个非零元素。
7)在Main栈上遇到2(指示二进制序列结束)之前,连续调用输出点4。
8)输出点4对该点重复执行此操作,如果二进制位为1,则会将结果推送到后跟1的ALT堆栈(如步骤6中所述)。
9)当输出点4完成时,ALT堆栈上将有要添加到一起的点列表。
10)将第一点从ALT堆栈移至Main堆栈,然后调用输出点5开始添加点。
11)到达ALT堆栈的末端时,预期结果将在Main堆栈上。
协议
上述描述显示了如何允许交易的输出脚本(例如,锁定脚本)中存在OP_RETURN以终止执行脚本而不核实交易无效,从而提供附加功能。但是,允许OP_RETURN在交易的解锁脚本中以这种方式操作可能会导致发生欺诈性攻击。为了防止这种情况,如果任何输入脚本(例如,解锁脚本)包括OP_RETURN,则处理交易的节点可以核实交易无效。
对于包括目标交易的多笔交易中的每笔交易,网络中的至少一些节点被配置为在交易有效的条件下传播每笔交易,并且至少一些节点被配置为在交易有效的条件下将每笔交易记录在该节点处的区块链的副本中。交易的有效性取决于上述协议,根据该协议,当调用OP_RETURN时,仅脚本终止,并且至关重要的是,交易不会核实为无效。例如,交易的有效性可能取决于堆栈的顶部元素。
该协议通过允许输入脚本在与输出脚本一起运行时有效地执行来恢复交易的功能,同时通过确保任何具有OP_RETURN的输入脚本不能用于解锁任何输出脚本来防止欺诈性攻击。
该节点被配置为基于上述协议来核实其处理的交易有效或无效。换句话说,当节点处理交易时,在交易的输出脚本(或多个输出脚本)中包括OP_RETURN将导致在调用OP_RETURN时终止输出脚本。在输出脚本中包括OP_RETURN不会核实交易无效。该交易可能会出于某种其他原因而无效。另一方面,如果OP_RETURN包括在交易的输入脚本中,则节点被配置为始终核实交易无效。在本文中,在任何输入脚本中包括OP_RETURN将核实交易无效。
区块链网络的每种类型的节点可以实现相同的协议。区块链网络的节点可以是例如挖掘节点、转发节点或存储节点,每个节点具有一个或更多个相同的函数,如下所述。例如,如果节点是转发节点,则转发节点可以仅在交易实现的条件下,例如在交易的任何输入脚本中不存在OP_RETURN操作码的条件下才将交易转发到区块链网络的一个或更多个节点。
根据本发明实施例,由节点实现的新协议对OP_RETURN的使用施加至少两个条件:
1)允许将OP_RETURN包括在有效交易的输出脚本中。
2)不允许将OP_RETURN包括在有效交易的输入脚本中。
OP_RETURN的函数用于终止执行脚本而不核实交易无效。换句话说,调用OP_RETURN时,脚本暂停,堆栈保持不变。
核实交易有效之后,节点将不会仅基于交易中的输出脚本中存在OP_RETURN来验证交易无效。相反,节点将仅基于交易的输入脚本中存在OP_RETURN来验证交易无效。如果交易具有多个输入,则这些输入中只有一个输入具有包含节点的OP_RETURN的输入脚本即可核实交易无效。如果锁定脚本包括OP_RETURN,则永远不会执行交易—在不执行的情况下无效。
参照图1,第一方爱丽丝103a可以生成包括一个或更多个输入和/或一个或更多个输出的交易。如图2所示,每个输入可以具有解锁脚本,用于解锁先前交易的锁定脚本。每个输出可以具有锁定脚本,用于将数字资产金额锁定到相应第二方,例如鲍勃103b,该数字资产金额将通过后续交易的解锁脚本解锁。爱丽丝103a将交易传输到P2P网络的节点。转发节点104F在将交易传播到一个或更多个其他转发节点或挖掘节点104M之前检查该交易的有效性。或者,挖掘节点104M可以直接从爱丽丝103a接收交易。每个节点至少基于上述协议确定交易是否有效。如果交易满足协议在使用OP_RETURN方面的要求(以及该协议的一项或更多项其他要求),则交易将在整个网络中传播和/或挖掘到区块链中。
在一些实施例中,可以仅允许将OP_RETURN包括在交易的锁定脚本中。类似地,在一些实施例中,可以仅不允许将OP_RETURN包括在交易的解锁脚本中。在一些示例中,在执行输入脚本之前,节点扫描输入脚本中的OP_RETURN的任何实例,并且如果存在任何此类实例,则节点被配置为核实交易无效,即在执行输入脚本之前。如上所述,每笔交易包括:一个或更多个输入,每个输入可以具有解锁脚本;一个或更多个输出,每个输出可以具有锁定脚本。给定交易的解锁脚本解锁某笔先前交易的锁定脚本。
实现协议时,如果节点核实交易有效,则意味着在满足其他条件的同时,交易在任何输入脚本中不会包含任何OP_RETURN。在执行该交易的解锁脚本和不同交易的锁定脚本的组合之后,验证该交易有效时会在堆栈上产生非空和非零结果。附加地或替代地,验证该交易有效会导致节点将该交易转发到网络的一个或更多个节点,例如转发到矿工以便挖掘到区块链中。如果节点是矿工,则核实该交易有效的另一结果是该矿工将该交易挖掘(即记录)到区块链的区块中。
在本文中所定义的协议有利地防止欺诈性攻击,并保持与区块链的现有功能(即数据存储应用)的兼容性。通过确保OP_RETURN不会存在于交易的解锁脚本中,可以防止欺诈性攻击。现有功能可以通过在交易的输出(例如,锁定脚本)中的OP_RETURN之前包括<0>来实现。在这里,<0>是导致零值被推送到堆栈上的任何元素。例如,零操作码OP_0可以放置在OP_RETURN之前。这将通过以下方式创建可证明不可花费的交易输出,即在交易的锁定脚本中插入[OP_0OP_RETURN<任意数据>]。例如,任意数据可以是图像数据、文本数据、视频数据和音频数据中的一个或更多个。例如,可以在交易的输出中包括视频文件或法律文件。
应当理解的是,上述实施例仅通过示例的方式进行描述。为清晰起见,实施例不限于具有特定名称的操作码。相反,实施例仅限于具有特定函数的操作码。为简洁起见,使用了术语“OP_RETURN”。
根据在本文中所公开的教导的第一实施例,提供了一种用于执行区块链网络的交易的方法,其中第一交易至少包括第一输出,所述第一输出包括基于堆栈的脚本语言的第一锁定脚本,其中所述第一锁定脚本包括在执行操作码的第一实例之前要执行的所述第一锁定脚本的一部分;其中第二交易包括第一解锁脚本,所述第一解锁脚本引用所述第一交易中的所述第一输出,并且其中所述方法包括在执行所述操作码的所述第一实例时:终止执行所述第一锁定脚本,同时不核实所述第一交易无效;从至少一个堆栈中读取第一数据元素,其中,所述第一数据元素在所述第一解锁脚本和所述第一锁定脚本的所述一部分的执行期间生成;以及向链下函数提供从所述至少一个堆栈中读取的所述第一数据元素,其中所述函数被配置为至少基于所述第一数据元素生成结果。
所述操作码可以称为终止操作码。换句话说,所述终止操作码可终止执行脚本。
根据第二可选实施例,可以提供一种根据所述第一实施例所述的方法,其中所述读取所述第一数据元素可以包括将所述第一数据元素记录在至少一个链下堆栈上,并且其中所述提供可以包括向所述链下函数提供从所述至少一个链下堆栈中读取的所述第一数据元素。
根据第三可选实施例,可以提供一种根据所述第一或第二实施例所述的方法,其中所述结果可以包括所述区块链网络的进一步交易。
根据第四可选实施例,可以提供一种根据所述第一至第三实施例中任一个所述的方法,其中所述生成所述进一步交易可以包括生成所述进一步交易的输入,其中所述输入至少基于所述第一数据元素。
根据第五可选实施例,可以提供一种根据所述第一至第四实施例中任一个所述的方法,其中所述方法可以包括:将所述进一步交易传输到所述区块链网络的一个或更多个节点。
根据第六可选实施例,可以提供一种根据所述第三至第五实施例中任一个所述的方法,其中所述方法可以包括:执行所述区块链网络的第三交易,其中所述第三交易至少包括第二输出,所述第二输出包括所述基于堆栈的脚本语言的第二锁定脚本,其中所述第二锁定脚本包括在执行所述终止操作码的第二实例之前要执行的所述第二锁定脚本的一部分;其中所述进一步交易包括第二解锁脚本,所述第二解锁脚本引用所述第三交易中的所述第二输出,并且其中所述方法可以包括在执行所述进一步交易的所述终止操作码的所述第二实例时:终止执行所述第二锁定脚本,同时不核实所述进一步交易无效;从所述至少一个堆栈中读取第二数据元素,其中所述第二数据元素在所述第二解锁脚本和所述第二锁定脚本的所述一部分的执行期间生成;向所述链下函数提供从所述至少一个堆栈中读取的所述第二数据元素,其中所述函数被配置为至少基于所述第二数据元素生成进一步结果。
根据第七可选实施例,可以提供一种根据所述第一实施例所述的方法,其中所述第一交易可以包括多个输出,所述多个输出中的每个输出包括相应的锁定脚本,其中所述多个输出中的每个输出由相应的输出地址引用,其中所述第一数据元素是引用所述输出中的第二输出的输出地址,并且其中在所述第二交易的所述解锁脚本中引用所述第一输出;并且其中,所述链下函数可以被配置为在调用所述操作码的所述第一实例时,使用从所述堆栈中读取的所述输出地址来引用所述第二输出的锁定脚本。
根据第八可选实施例,可以提供一种根据所述第七实施例所述的方法,其中所述方法可以包括:执行所述解锁脚本和所述第一锁定脚本,所述执行包括将所述第二输出的所述输出地址推送到所述堆栈上。
根据第九可选实施例,可以提供一种根据所述第八实施例所述的方法,其中所述方法可以包括:在所述执行所述解锁脚本和所述第一锁定脚本之前,将所述解锁脚本和所述第一锁定脚本复制到脚本模板,其中所述脚本模板包括待执行脚本。
根据第十可选实施例,可以提供一种根据所述第九实施例所述的方法,其中所述方法可以包括:在调用所述操作码的所述第一实例时,将所述第二输出的所述锁定脚本复制到所述脚本模板的开头。
根据第十一可选实施例,可以提供一种根据所述第七至第十实施例中任一个所述的方法,其中所述方法可以包括执行所述第二输出的所述锁定脚本。
根据第十二可选实施例,可以提供一种根据所述第十一实施例所述的方法,其中所述第二输出的所述锁定脚本可以包括在所述操作码的第二实例之前要执行的脚本的一部分,所述一部分包括引用所述输出中的第三输出的输出地址;并且其中所述执行所述第二输出的所述锁定脚本可以包括:将所述第三输出的所述输出地址推送到所述堆栈上;其中,所述函数被配置为在调用所述操作码的所述第二实例时,使用从所述堆栈中读取的所述输出地址来引用所述第三输出的锁定脚本。
根据第十三可选实施例,可以提供一种根据所述第十二实施例所述的方法,其中所述方法可以包括:在调用所述操作码的所述第二实例时,将所述第三输出的所述锁定脚本复制到所述脚本模板的所述开头。
根据第十四可选实施例,可以提供一种根据所述第十二或第十三实施例所述的方法,其中所述第一输出、所述第二输出和所述第三输出可以按顺序列出在所述多个输出中。
根据第十五可选实施例,可以提供一种根据所述第十二或第十三实施例所述的方法,其中所述第一输出、所述第二输出和所述第三输出可以不按顺序列出在所述多个输出中。
根据第十六可选实施例,可以提供一种根据所述第七至第十五实施例中任一个所述的方法,其中所述方法可以包括执行以下操作:执行引用的输出的锁定脚本,将所述相应的输出的输出地址推送到所述链下堆栈上,其中所述函数被配置为在调用所述相应的输出的所述操作码的所述相应的实例时,使用从所述堆栈中读取的所述输出地址来引用所述输出中的下一输出的锁定脚本;其中,重复所述操作,直到已执行由另一锁定脚本引用的所述多个输出的每个锁定脚本。
根据第十七可选实施例,可以提供一种根据所述第十六实施例所述的方法,其中所述方法可以包括:每次执行所述锁定脚本中的一个锁定脚本时,将所述锁定脚本复制到所述脚本模板的所述开头。
根据第十八可选实施例,可以提供一种根据所述第十六或第十七实施例所述的方法,其中所述方法可以包括:使用所述脚本模板作为用于进一步交易的锁定脚本,其中用于所述进一步交易的所述锁定脚本不包含所述操作码的实例。
根据第十九可选实施例,可以提供一种根据所述第七至第十八实施例中任一个所述的方法,其中所述锁定脚本中的一个或多个锁定脚本可以包括相应的函数,并且其中所述执行所述相应的锁定脚本包括执行所述相应的函数。
根据第二十可选实施例,可以提供一种根据所述第十九实施例所述的方法,其中所述相应的函数可以被配置为在执行所述相应的函数时对所述链下堆栈上的数据进行操作。
根据第二十一可选实施例,可以提供一种根据所述第七至第二十实施例中任一个所述的方法,其中所述方法可以包括:如果所述第一锁定脚本包括所述操作码的实例,从所述第一交易中提取所有锁定脚本,并使用相应的输出地址对所述锁定脚本进行索引。
根据第二十二可选实施例,可以提供一种根据所述第七至第二十一实施例中任一个所述的方法,其中每个锁定脚本中的每个输出地址可以是相应的数据元素,并且其中所述方法可以包括将所述相应的数据元素解释为输出地址。
根据第二十三可选实施例,可以提供一种根据所述第一至第二十二实施例中任一个所述的方法,其中所述执行所述交易可以包括核实交易有效以将其记录在所述区块链中,所述方法包括应用用于核实所述交易有效的协议,其中所述协议可以被配置为:允许将终止操作码包括在所述交易的输出脚本中,其中所述终止操作码被配置为在由所述节点执行时,a)终止执行所述输出脚本;b)不会仅基于所述输出脚本中包括所述终止操作码而核实所述交易无效;不允许所述终止操作码的任何实例包括在所述交易的输入脚本中,如果所述终止操作码的任何实例包括在所述输入脚本中,所述不允许包括:所述节点至少核实所述交易无效。
所述交易不会完全因为所述输出脚本中存在OP_RETURN而核实无效。换句话说,所述交易不会基于所述输出脚本本身中的OP_RETURN而核实无效,但可能会因为其他原因而核实无效,正如所讨论的那样。
根据第二十四可选实施例,可以提供一种根据所述第二十三实施例所述的方法,其中所述输出脚本可以是包括在所述交易中的锁定脚本,并且所述输入脚本是包括在所述交易中的解锁脚本,用于解锁先前交易的锁定脚本。
根据第二十五可选实施例,可以提供一种根据所述第二十三或第二十五实施例所述的方法,其中所述协议可以被配置为使得:当所述输出脚本包括所述终止操作码的实例的组合,所述终止操作码的实例的组合在至少一个数据元素之前时,基于所述终止操作码的所述实例的所述组合和所述至少一个数据元素核实所述交易无效。
在一些示例中,对于要基于所述组合而核实无效的所述交易,所述终止操作码的所述实例必须紧跟在所述至少一个数据元素之前。即,所述至少一个数据元素和所述终止操作码是所述输出脚本的相邻元素。可证明不可花费的输出使(例如,合同、媒体文件、文档等的)数据能够存储在所述区块链上。
根据第二十六可选实施例,可以提供一种根据所述第二十五实施例所述的方法,其中所述至少一个数据元素可以包括以下一项或两项:零操作码;或零值表示,以创建所述交易的可证明不可花费的输出。
所述数据元素可以是所述脚本的任何元素(例如,函数、字符串、操作码等)。
根据第二十七可选实施例,可以提供一种根据所述第二十三至第二十六实施例中任一个所述的方法,其中所述协议可以被配置为不允许任何操作码包括在所述交易的所述输入脚本中,如果任何操作码包括在所述输入脚本中,所述不允许包括:所述节点至少核实所述交易无效。
根据第二十八可选实施例,可以提供一种根据所述第二十三至第二十七实施例中任一个所述的方法,其中所述有效可以包括以下各项中的至少一项:在所述节点执行所述输出脚本和所述输入脚本的组合之后,产生非空和非零结果;所述节点将所述交易转发到所述网络的一个或更多个节点以将所述交易记录在所述区块链中;以及所述节点将所述交易记录在所述区块链中。
根据第二十九可选实施例,可以提供一种根据前述实施例中任一个所述的方法,其中所述操作码的所述第一实例被配置为在执行时将所述第一交易标记为有效,并在执行所述操作码的所述第一实例之后且在清除所述至少一个堆栈之前在所述至少一个堆栈上留下一个数字,其中所述第一数据元素是所述数字。
根据第三十可选实施例,可以提供一种根据前述实施例中任一个所述的方法,其中所述操作码的所述第一实例是OP_RETURN操作码。
根据第三十一可选实施例,可以提供一种根据所述第二实施例或其任何从属实施例所述的方法,其中所述链下堆栈是不用于核实交易有效的堆栈。
根据在本文中所公开的教导的第三十二实施例,可提供一种计算机程序,所述计算机程序包含在计算机可读存储器上,并且被配置为当在区块链网络的节点上运行时,执行根据所述第一至第二十八实施例中任一个所述的方法。
根据在本文中所公开的教导的第三十三实施例,可提供一种计算设备,所述计算设备包括:存储器,所述存储器包括一个或多个存储器单元;处理装置,所述处理装置包括一个或多个处理单元,其中所述存储器存储被设置在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时,执行根据所述第一至第二十八实施例中任一个所述的方法。
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。

Claims (33)

1.一种计算机实现的方法,所述方法执行区块链网络的交易,其中,第一交易至少包括第一输出,所述第一输出包括基于堆栈的脚本语言的第一锁定脚本,其中,所述第一锁定脚本包括在执行操作码的第一实例之前要执行的所述第一锁定脚本的一部分,其中,第二交易包括第一解锁脚本,所述第一解锁脚本引用所述第一交易中的所述第一输出,并且其中,所述方法包括,在执行所述操作码的所述第一实例时:
终止执行所述第一锁定脚本,同时不核实所述第一交易无效;
从至少一个堆栈中读取第一数据元素,其中,所述第一数据元素在所述第一解锁脚本和所述第一锁定脚本的所述一部分的执行期间生成;以及
向链下函数提供从所述至少一个堆栈中读取的所述第一数据元素,其中,所述函数被配置为至少基于所述第一数据元素生成结果。
2.根据权利要求1所述的方法,其中,所述读取所述第一数据元素包括将所述第一数据元素记录在至少一个链下堆栈上,并且其中,所述提供包括向所述链下函数提供从所述至少一个链下堆栈中读取的所述第一数据元素。
3.根据权利要求1或2所述的方法,其中,所述结果包括生成所述区块链网络的进一步交易。
4.根据权利要求3所述的方法,其中,所述生成所述进一步交易包括生成所述进一步交易的输入,其中,所述输入至少基于所述第一数据元素。
5.根据权利要求3或4所述的方法,所述方法包括:将所述进一步交易传输到所述区块链网络的一个或更多个节点。
6.根据权利要求3至5中任一项所述的方法,所述方法包括:执行所述区块链网络的第三交易,其中,所述第三交易至少包括第二输出,所述第二输出包括所述基于堆栈的脚本语言的第二锁定脚本,其中,所述第二锁定脚本包括在执行所述操作码的第二实例之前要执行的所述第二锁定脚本的一部分,其中,所述进一步交易包括第二解锁脚本,所述第二解锁脚本引用所述第三交易中的所述第二输出,并且其中,所述方法包括在执行所述进一步交易的所述操作码的所述第二实例时:
终止执行所述第二锁定脚本,同时不核实所述进一步交易无效;
从所述至少一个堆栈中读取第二数据元素,其中,所述第二数据元素在所述第二解锁脚本和所述第二锁定脚本的所述一部分的执行期间生成;
向所述链下函数提供从所述至少一个堆栈中读取的所述第二数据元素,其中,所述函数被配置为至少基于所述第二数据元素生成进一步结果。
7.根据权利要求1所述的方法,其中,所述第一交易包括多个输出,所述多个输出中的每个输出包括相应的锁定脚本,其中,所述多个输出中的每个输出由相应的输出地址引用,其中,所述第一数据元素是引用所述输出中的第二输出的输出地址,并且其中,在所述第二交易的所述解锁脚本中引用所述第一输出;并且
其中,所述链下函数被配置为在调用所述操作码的所述第一实例时,使用从所述堆栈中读取的所述输出地址来引用所述第二输出的锁定脚本。
8.根据权利要求7所述的方法,所述方法包括:执行所述解锁脚本和所述第一锁定脚本,所述执行包括将所述第二输出的所述输出地址推送到所述堆栈上。
9.根据权利要求8所述的方法,所述方法包括:在所述执行所述解锁脚本和所述第一锁定脚本之前,将所述解锁脚本和所述第一锁定脚本复制到脚本模板,其中,所述脚本模板包括待执行脚本。
10.根据权利要求9所述的方法,所述方法包括:在调用所述操作码的所述第一实例时,将所述第二输出的所述锁定脚本复制到所述脚本模板的开头。
11.根据权利要求7至10中任一项所述的方法,所述方法包括:执行所述第二输出的所述锁定脚本。
12.根据权利要求11所述的方法,其中,所述第二输出的所述锁定脚本包括在所述操作码的第二实例之前要执行的脚本的一部分,所述一部分包括引用所述输出中的第三输出的输出地址;并且其中,所述执行所述第二输出的所述锁定脚本包括:
将所述第三输出的所述输出地址推送到所述堆栈上;并且
其中,所述函数被配置为在调用所述操作码的所述第二实例时,使用从所述堆栈中读取的所述输出地址来引用所述第三输出的锁定脚本。
13.根据权利要求12所述的方法,所述方法包括:在调用所述操作码的所述第二实例时,将所述第三输出的所述锁定脚本复制到所述脚本模板的所述开头。
14.根据权利要求12或13所述的方法,其中,所述第一输出、所述第二输出和所述第三输出按顺序列出在所述多个输出中。
15.根据权利要求12或13所述的方法,其中所述第一输出、所述第二输出和所述第三输出不按顺序列在所述多个输出中。
16.根据权利要求7至15中任一项所述的方法,所述方法包括执行以下操作:
执行引用的输出的锁定脚本,将所述相应的输出的输出地址推送到所述链下堆栈上;其中,所述函数被配置为在调用所述相应的输出的所述操作码的所述相应的实例时,使用从所述堆栈中读取的所述输出地址来引用所述输出中的下一输出的锁定脚本;
其中,重复所述操作,直到已执行由另一锁定脚本引用的所述多个输出的每个锁定脚本。
17.根据权利要求16所述的方法,所述方法包括:
每次执行所述锁定脚本中的一个锁定脚本时,将所述锁定脚本复制到所述脚本模板的所述开头。
18.根据权利要求16或17所述的方法,所述方法包括:使用所述脚本模板作为用于进一步交易的锁定脚本,其中,用于所述进一步交易的所述锁定脚本不包含所述操作码的实例。
19.根据权利要求7至18中任一项所述的方法,其中,所述锁定脚本中的一个或更多个锁定脚本包括相应的函数,并且其中,所述执行所述相应的锁定脚本包括执行所述相应的函数。
20.根据权利要求19所述的方法,其中,所述相应的函数被配置为在执行所述相应的函数时对所述链下堆栈上的数据进行操作。
21.根据权利要求7至20中任一项所述的方法,所述方法包括:如果所述第一锁定脚本包括所述操作码的实例,从所述第一交易中提取所有锁定脚本,并使用相应的输出地址对所述锁定脚本进行索引。
22.根据权利要求7到21中任一项所述的方法,其中,每个锁定脚本中的每个输出地址是相应的数据元素,并且其中,所述方法包括将所述相应的数据元素解释为输出地址。
23.根据前述任一项权利要求所述的方法,其中,所述执行所述交易包括核实交易有效以将其记录在所述区块链中,所述方法包括应用用于核实所述交易有效的协议,其中,所述协议被配置为:
允许将终止操作码包括在所述交易的输出脚本中,其中,所述终止操作码被配置为在由所述节点执行时,a)终止执行所述输出脚本;b)不会仅基于在所述输出脚本中包括所述终止操作码而核实所述交易无效;
不允许所述终止操作码的任何实例包括在所述交易的输入脚本中,如果所述终止操作码的任何实例包括在所述输入脚本中,所述不允许包括:所述节点至少核实所述交易无效。
24.根据权利要求23所述的方法,其中,所述输出脚本是包括在所述交易中的锁定脚本,并且所述输入脚本是包括在所述交易中的解锁脚本,所述解锁脚本用于解锁先前交易的锁定脚本。
25.根据权利要求23或24所述的方法,其中,所述协议被配置为使得:
当所述输出脚本包括所述终止操作码的实例的组合,所述终止操作码的实例的组合在至少一个数据元素之前时,基于所述终止操作码的所述实例的所述组合和所述至少一个数据元素核实所述交易无效。
26.根据权利要求25所述的方法,其中,所述至少一个数据元素包括以下一项或两项:
零操作码;或
零值表示,以创建所述交易的可证明不可花费的输出。
27.根据权利要求23至26中任一项所述的方法,其中,所述协议被配置为:
不允许任何操作码包括在所述交易的所述输入脚本中,如果任何操作码包括在所述输入脚本中,所述不允许包括:所述节点至少核实所述交易无效。
28.根据权利要求23至27中任一项所述的方法,其中,所述有效包括以下各项中的至少一项:
在所述节点执行所述输出脚本和所述输入脚本的组合之后,产生非空和非零结果;
所述节点将所述交易转发到所述网络的一个或更多个节点以将所述交易记录在所述区块链中;以及
所述节点将所述交易记录在所述区块链中。
29.根据前述任一项权利要求所述的方法,其中,所述操作码的所述第一实例被配置为在执行时将所述第一交易标记为有效,并在执行所述操作码的所述第一实例之后且在清除所述至少一个堆栈之前在所述至少一个堆栈上留下一个数字,其中,所述第一数据元素是所述数字。
30.根据前述任一项权利要求所述的方法,其中,所述操作码的所述第一实例是OP_RETURN操作码。
31.根据权利要求2或其任何从属权利要求所述的方法,其中,所述链下堆栈是不用于核实交易有效的堆栈。
32.一种计算机程序,所述计算机程序包含在计算机可读存储器上,并且被配置为当在区块链网络的节点上运行时,执行根据前述任一项权利要求所述的方法。
33.一种计算设备,所述计算设备包括:
存储器,所述存储器包括一个或更多个存储器单元;以及
处理装置,所述处理装置包括一个或更多个处理单元,其中,所述存储器存储被设置在所述处理装置上运行的代码,所述代码被配置为当在所述处理装置上运行时,执行根据权利要求1至31中任一项所述的方法。
CN202080037814.6A 2019-05-24 2020-04-22 使用区块链交易提供链下功能 Pending CN114175036A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB1907346.9 2019-05-24
GBGB1907346.9A GB201907346D0 (en) 2019-05-24 2019-05-24 Using blockchain transactions to provide off-chain functionality
PCT/IB2020/053816 WO2020240298A1 (en) 2019-05-24 2020-04-22 Using blockchain transactions to provide off-chain functionality

Publications (1)

Publication Number Publication Date
CN114175036A true CN114175036A (zh) 2022-03-11

Family

ID=67385447

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202080037814.6A Pending CN114175036A (zh) 2019-05-24 2020-04-22 使用区块链交易提供链下功能

Country Status (8)

Country Link
US (1) US20220269810A1 (zh)
EP (1) EP3963498A1 (zh)
JP (1) JP2022534196A (zh)
KR (1) KR20220013406A (zh)
CN (1) CN114175036A (zh)
GB (1) GB201907346D0 (zh)
SG (1) SG11202111436TA (zh)
WO (1) WO2020240298A1 (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB201913143D0 (en) * 2019-09-12 2019-10-30 Nchain Holdings Ltd Running a program from a blockchain
GB2594684A (en) 2020-02-19 2021-11-10 Nchain Holdings Ltd Layered network
GB202108384D0 (en) * 2021-06-11 2021-07-28 Nchain Licensing Ag A computer implemented method and system
GB2618052A (en) * 2021-12-07 2023-11-01 Nchain Licensing Ag Blockchain script engine
US11907677B1 (en) * 2022-03-02 2024-02-20 Arash Borhany Immutable universal language assistive translation and interpretation system that verifies and validates translations and interpretations by smart contract and blockchain technology
KR102544008B1 (ko) * 2022-11-30 2023-06-15 주식회사 엔터프라이즈블록체인 복수의 어그리게이터들(aggregators)을 관리하는 어그리게이터 매니저를 포함하는 장치 및 그 동작 방법

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110063041B (zh) * 2016-12-21 2022-08-05 区块链控股有限公司 使用多个区块链交易来执行计算机实现的任务的方法和系统

Also Published As

Publication number Publication date
KR20220013406A (ko) 2022-02-04
EP3963498A1 (en) 2022-03-09
US20220269810A1 (en) 2022-08-25
JP2022534196A (ja) 2022-07-28
GB201907346D0 (en) 2019-07-10
WO2020240298A1 (en) 2020-12-03
SG11202111436TA (en) 2021-12-30

Similar Documents

Publication Publication Date Title
KR102416506B1 (ko) 블록체인을 이용한 논리 게이트 기능 구현
Luu et al. Making smart contracts smarter
CN114175036A (zh) 使用区块链交易提供链下功能
EP3963497B1 (en) Protocol for validating blockchain transactions
US20220405752A1 (en) Time-locked blockchain transactions and related blockchain technology
CN113874839A (zh) 区块链交易内的脚本内函数
CN115918030A (zh) 使用区块链的可证明公平的游戏
CN115485042A (zh) 使用区块链的可证明公平的游戏
CN115211073A (zh) 公钥生成方法
CN116113921A (zh) 区块链上的伪随机选择
JP2024522634A (ja) ブロックチェーン上のトークンを検証するためのコンピュータ実装方法およびシステム
CN114430830A (zh) 用于复杂核实的包含不同语言的部分代码的区块链交易
CN114945928A (zh) 时间锁定的区块链事务和相关区块链技术
CN114531941A (zh) 多标准区块链协议
US20240095692A1 (en) Computer implemented method and system
KR20240024113A (ko) 다중-레벨 블록체인
CN117751550A (zh) 分层共识
George et al. Ethereum
CN115516819A (zh) 用于使用区块链实现数字货币系统的方法
CN114391146A (zh) 在区块链上存储程序
Antal et al. Distributed Ledger Technology Review and Decentralized Applications Development Guidelines. Future Internet 2021, 13, 62
Buterin et al. Notes on Scalable Blockchain Protocols (verson 0.3)
van Oorschot et al. Bitcoin, Blockchains and Ethereum
Brunetto Distributed Verifier-Smart Contract for verifying ECDSA signatures on multiple curves
CN117136527A (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